some ugly but necessary changes to support both pre and post 7.x clients

This commit is contained in:
mark 2009-10-04 08:19:19 +00:00
parent 94d1a17b6f
commit 115e74f44e
6 changed files with 457 additions and 117 deletions

View file

@ -115,21 +115,28 @@ namespace Server.Commands
if ( Utility.InUpdateRange( targ, from ) )
{
if ( targ.CanSee( from ) )
{
targ.Send( new Network.MobileIncoming( targ, from ) );
NetState ns = targ.NetState;
if ( ObjectPropertyList.Enabled )
if ( ns != null ) {
if ( targ.CanSee( from ) )
{
targ.Send( from.OPLPacket );
if ( ns.IsPost7000 )
ns.Send( new MobileIncoming( targ, from ) );
else
ns.Send( new MobileIncomingOld( targ, from ) );
foreach ( Item item in from.Items )
targ.Send( item.OPLPacket );
if ( ObjectPropertyList.Enabled )
{
ns.Send( from.OPLPacket );
foreach ( Item item in from.Items )
ns.Send( item.OPLPacket );
}
}
else
{
ns.Send( from.RemovePacket );
}
}
else
{
targ.Send( from.RemovePacket );
}
}
}

View file

@ -117,7 +117,7 @@ namespace Server.Engines.Craft
int resIndex = ( context == null ? -1 : context.LastResourceIndex );
Type resourceType = craftSystem.CraftSubRes.ResType;
Type resourceType = craftSystem.CraftSubRes.ResType;
if ( resIndex > -1 )
{

View file

@ -3203,8 +3203,13 @@ namespace Server.Mobiles
{
Type t = m.GetType();
if ( t == oldType || t == newType )
Send( new MobileMoving( m, Notoriety.Compute( this, m ) ) );
if ( t == oldType || t == newType ) {
if ( this.NetState.IsPost7000 ) {
Send( new MobileMoving( m, Notoriety.Compute( this, m ) ) );
} else {
Send( new MobileMovingOld( m, Notoriety.Compute( this, m ) ) );
}
}
}
}
#endregion

View file

@ -1156,8 +1156,13 @@ namespace Server
m_Aggressors.RemoveAt( i );
info.Free();
if( m_NetState != null && this.CanSee( attacker ) && Utility.InUpdateRange( m_Location, attacker.m_Location ) )
m_NetState.Send( new MobileIncoming( this, attacker ) );
if( m_NetState != null && this.CanSee( attacker ) && Utility.InUpdateRange( m_Location, attacker.m_Location ) ) {
if ( m_NetState.IsPost7000 ) {
m_NetState.Send( new MobileIncoming( this, attacker ) );
} else {
m_NetState.Send( new MobileIncomingOld( this, attacker ) );
}
}
}
}
@ -1176,8 +1181,13 @@ namespace Server
m_Aggressed.RemoveAt( i );
info.Free();
if( m_NetState != null && this.CanSee( defender ) && Utility.InUpdateRange( m_Location, defender.m_Location ) )
m_NetState.Send( new MobileIncoming( this, defender ) );
if( m_NetState != null && this.CanSee( defender ) && Utility.InUpdateRange( m_Location, defender.m_Location ) ) {
if ( m_NetState.IsPost7000 ) {
m_NetState.Send( new MobileIncoming( this, defender ) );
} else {
m_NetState.Send( new MobileIncomingOld( this, defender ) );
}
}
}
}
@ -2375,8 +2385,13 @@ namespace Server
{
m_Aggressors.Add( AggressorInfo.Create( aggressor, this, criminal ) ); // new AggressorInfo( aggressor, this, criminal, true ) );
if( this.CanSee( aggressor ) && m_NetState != null )
m_NetState.Send( new MobileIncoming( this, aggressor ) );
if( this.CanSee( aggressor ) && m_NetState != null ) {
if ( m_NetState.IsPost7000 ) {
m_NetState.Send( new MobileIncoming( this, aggressor ) );
} else {
m_NetState.Send( new MobileIncomingOld( this, aggressor ) );
}
}
if( Combatant == null )
setCombatant = true;
@ -2388,8 +2403,13 @@ namespace Server
{
aggressor.m_Aggressed.Add( AggressorInfo.Create( aggressor, this, criminal ) ); // new AggressorInfo( aggressor, this, criminal, false ) );
if( this.CanSee( aggressor ) && m_NetState != null )
m_NetState.Send( new MobileIncoming( this, aggressor ) );
if( this.CanSee( aggressor ) && m_NetState != null ) {
if ( m_NetState.IsPost7000 ) {
m_NetState.Send( new MobileIncoming( this, aggressor ) );
} else {
m_NetState.Send( new MobileIncomingOld( this, aggressor ) );
}
}
if( Combatant == null )
setCombatant = true;
@ -2419,8 +2439,13 @@ namespace Server
m_Aggressed.RemoveAt( i );
info.Free();
if( m_NetState != null && this.CanSee( aggressed ) )
m_NetState.Send( new MobileIncoming( this, aggressed ) );
if( m_NetState != null && this.CanSee( aggressed ) ) {
if ( m_NetState.IsPost7000 ) {
m_NetState.Send( new MobileIncoming( this, aggressed ) );
} else {
m_NetState.Send( new MobileIncomingOld( this, aggressed ) );
}
}
break;
}
@ -2445,8 +2470,13 @@ namespace Server
m_Aggressors.RemoveAt( i );
info.Free();
if( m_NetState != null && this.CanSee( aggressor ) )
m_NetState.Send( new MobileIncoming( this, aggressor ) );
if( m_NetState != null && this.CanSee( aggressor ) ) {
if ( m_NetState.IsPost7000 ) {
m_NetState.Send( new MobileIncoming( this, aggressor ) );
} else {
m_NetState.Send( new MobileIncomingOld( this, aggressor ) );
}
}
break;
}
@ -2921,7 +2951,11 @@ namespace Server
return true;
}
private static Packet[] m_MovingPacketCache = new Packet[8];
private static Packet[][] m_MovingPacketCache = new Packet[2][]
{
new Packet[8],
new Packet[8]
};
private bool m_Pushing;
@ -3148,11 +3182,6 @@ namespace Server
TimeSpan delay = ComputeMovementSpeed( d );
/*if ( Mounted )
delay = ( d & Direction.Running ) != 0 ? m_RunMount : m_WalkMount;
else
delay = ( d & Direction.Running ) != 0 ? m_RunFoot : m_WalkFoot;*/
DateTime end;
if( m_MoveRecords.Count > 0 )
@ -3205,10 +3234,11 @@ namespace Server
eable.Free();
Packet[] cache = m_MovingPacketCache;
Packet[][] cache = m_MovingPacketCache;
for( int i = 0; i < cache.Length; ++i )
Packet.Release( ref cache[i] );
for( int j = 0; j < cache[i].Length; ++j )
Packet.Release( ref cache[i][j] );
for( int i = 0; i < m_MoveList.Count; ++i )
{
@ -3221,11 +3251,21 @@ namespace Server
if( ns != null && Utility.InUpdateRange( m_Location, m.m_Location ) && m.CanSee( this ) )
{
int noto = Notoriety.Compute( m, this );
Packet p = cache[noto];
Packet p = null;
if( p == null )
cache[noto] = p = Packet.Acquire( new MobileMoving( this, noto ) );
if ( ns.IsPost7000 ) {
int noto = Notoriety.Compute( m, this );
p = cache[0][noto];
if( p == null )
cache[0][noto] = p = Packet.Acquire( new MobileMoving( this, noto ) );
} else {
int noto = Notoriety.Compute( m, this );
p = cache[1][noto];
if( p == null )
cache[1][noto] = p = Packet.Acquire( new MobileMovingOld( this, noto ) );
}
ns.Send( p );
}
@ -3239,7 +3279,8 @@ namespace Server
}
for( int i = 0; i < cache.Length; ++i )
Packet.Release( ref cache[i] );
for( int j = 0; j < cache[i].Length; ++j )
Packet.Release( ref cache[i][j] );
if( m_MoveList.Count > 0 )
m_MoveList.Clear();
@ -3257,10 +3298,12 @@ namespace Server
{
return ComputeMovementSpeed( this.Direction, false );
}
public TimeSpan ComputeMovementSpeed( Direction dir )
{
return ComputeMovementSpeed( dir, true );
}
public virtual TimeSpan ComputeMovementSpeed( Direction dir, bool checkTurning )
{
TimeSpan delay;
@ -6676,14 +6719,16 @@ namespace Server
if( CanSee( m ) && Utility.InUpdateRange( m_Location, m.m_Location ) )
{
ns.Send( new MobileIncoming( this, m ) );
if ( ns.IsPost7000 ) {
ns.Send( new MobileIncoming( this, m ) );
if ( m.Poisoned )
ns.Send( new HealthbarPoison( m ) );
if ( m.Blessed || m.YellowHealthbar )
ns.Send( new HealthbarYellow( m ) );
} else {
ns.Send( new MobileIncomingOld( this, m ) );
}
if( m.IsDeadBondedPet )
@ -6743,17 +6788,19 @@ namespace Server
NetState ns = m_NetState;
if( m_Map != null )
if( ns != null && m_Map != null )
{
if( ns != null && m_Map != null )
{
ns.Sequence = 0;
ns.Send( new MapChange( this ) );
ns.Send( new MapPatches() );
ns.Send( SeasonChange.Instantiate( GetSeason(), true ) );
ns.Sequence = 0;
ns.Send( new MapChange( this ) );
ns.Send( new MapPatches() );
ns.Send( SeasonChange.Instantiate( GetSeason(), true ) );
if ( ns.IsPost7000 )
ns.Send( new MobileUpdate( this ) );
ClearFastwalkStack();
}
else
ns.Send( new MobileUpdateOld( this ) );
ClearFastwalkStack();
}
if( ns != null )
@ -6764,10 +6811,17 @@ namespace Server
ns.Sequence = 0;
ClearFastwalkStack();
Send( new MobileIncoming( this, this ) );
Send( new MobileUpdate( this ) );
CheckLightLevels( true );
Send( new MobileUpdate( this ) );
if ( ns.IsPost7000 ) {
Send( new MobileIncoming( this, this ) );
Send( new MobileUpdate( this ) );
CheckLightLevels( true );
Send( new MobileUpdate( this ) );
} else {
Send( new MobileIncomingOld( this, this ) );
Send( new MobileUpdateOld( this ) );
CheckLightLevels( true );
Send( new MobileUpdateOld( this ) );
}
}
SendEverything();
@ -6778,10 +6832,17 @@ namespace Server
ns.Sequence = 0;
ClearFastwalkStack();
Send( new MobileIncoming( this, this ) );
Send( SupportedFeatures.Instantiate( ns ) );
Send( new MobileUpdate( this ) );
Send( new MobileAttributes( this ) );
if ( ns.IsPost7000 ) {
Send( new MobileIncoming( this, this ) );
Send( SupportedFeatures.Instantiate( ns ) );
Send( new MobileUpdate( this ) );
Send( new MobileAttributes( this ) );
} else {
Send( new MobileIncomingOld( this, this ) );
Send( SupportedFeatures.Instantiate( ns ) );
Send( new MobileUpdateOld( this ) );
Send( new MobileAttributes( this ) );
}
}
OnMapChange( oldMap );
@ -7665,13 +7726,31 @@ namespace Server
if( m_Female )
flags |= 0x02;
if( m_NetState.IsPost7000 ) {
if( m_Flying ) {
flags |= 0x04;
}
} else if( m_Poison != null ) {
if( m_Flying )
flags |= 0x04;
if( m_Blessed || m_YellowHealthbar )
flags |= 0x08;
if( m_Warmode )
flags |= 0x40;
if( m_Hidden )
flags |= 0x80;
return flags;
}
// Pre-7.0.0.0 Packet Flags
public virtual int GetOldPacketFlags()
{
int flags = 0x0;
if( m_Female )
flags |= 0x02;
if( m_Poison != null )
flags |= 0x04;
}
if( m_Blessed || m_YellowHealthbar )
flags |= 0x08;
@ -7789,7 +7868,10 @@ namespace Server
}
else
{
state.Send( new MobileIncoming( state.Mobile, this ) );
if ( state.IsPost7000 )
state.Send( new MobileIncoming( state.Mobile, this ) );
else
state.Send( new MobileIncomingOld( state.Mobile, this ) );
if( IsDeadBondedPet )
state.Send( new BondedStatus( 0, m_Serial, 1 ) );
@ -8799,7 +8881,12 @@ namespace Server
ns.Send( new MapChange( this ) );
ns.Send( new MapPatches() );
ns.Send( SeasonChange.Instantiate( GetSeason(), true ) );
ns.Send( new MobileUpdate( this ) );
if ( ns.IsPost7000 )
ns.Send( new MobileUpdate( this ) );
else
ns.Send( new MobileUpdate( this ) );
ClearFastwalkStack();
}
}
@ -8816,10 +8903,17 @@ namespace Server
ns.Sequence = 0;
ClearFastwalkStack();
Send( new MobileIncoming( this, this ) );
Send( new MobileUpdate( this ) );
CheckLightLevels( true );
Send( new MobileUpdate( this ) );
if ( ns.IsPost7000 ) {
Send( new MobileIncoming( this, this ) );
Send( new MobileUpdate( this ) );
CheckLightLevels( true );
Send( new MobileUpdate( this ) );
} else {
Send( new MobileIncomingOld( this, this ) );
Send( new MobileUpdateOld( this ) );
CheckLightLevels( true );
Send( new MobileUpdateOld( this ) );
}
}
SendEverything();
@ -8830,10 +8924,17 @@ namespace Server
ns.Sequence = 0;
ClearFastwalkStack();
Send( new MobileIncoming( this, this ) );
Send( SupportedFeatures.Instantiate( ns ) );
Send( new MobileUpdate( this ) );
Send( new MobileAttributes( this ) );
if ( ns.IsPost7000 ) {
Send( new MobileIncoming( this, this ) );
Send( SupportedFeatures.Instantiate( ns ) );
Send( new MobileUpdate( this ) );
Send( new MobileAttributes( this ) );
} else {
Send( new MobileIncomingOld( this, this ) );
Send( SupportedFeatures.Instantiate( ns ) );
Send( new MobileUpdateOld( this ) );
Send( new MobileAttributes( this ) );
}
}
OnMapChange( oldMap );
@ -8869,7 +8970,12 @@ namespace Server
if( isTeleport && m_NetState != null )
{
m_NetState.Sequence = 0;
m_NetState.Send( new MobileUpdate( this ) );
if ( m_NetState.IsPost7000 )
m_NetState.Send( new MobileUpdate( this ) );
else
m_NetState.Send( new MobileUpdateOld( this ) );
ClearFastwalkStack();
}
@ -8926,14 +9032,16 @@ namespace Server
if( (isTeleport || !inOldRange) && m.m_NetState != null && m.CanSee( this ) )
{
m.m_NetState.Send( new MobileIncoming( m, this ) );
if ( m.m_NetState.IsPost7000 ) {
m.m_NetState.Send( new MobileIncoming( m, this ) );
if ( m_Poison != null )
m.m_NetState.Send( new HealthbarPoison( this ) );
if ( m_Blessed || m_YellowHealthbar )
m.m_NetState.Send( new HealthbarYellow( this ) );
} else {
m.m_NetState.Send( new MobileIncomingOld( m, this ) );
}
if( IsDeadBondedPet )
@ -8950,14 +9058,16 @@ namespace Server
if( !inOldRange && CanSee( m ) )
{
ourState.Send( new MobileIncoming( this, m ) );
if ( ourState.IsPost7000 ) {
ourState.Send( new MobileIncoming( this, m ) );
if ( m.Poisoned )
ourState.Send( new HealthbarPoison( m ) );
if ( m.Blessed || m.YellowHealthbar )
ourState.Send( new HealthbarYellow( m ) );
} else {
ourState.Send( new MobileIncomingOld( this, m ) );
}
if( m.IsDeadBondedPet )
@ -8985,14 +9095,16 @@ namespace Server
{
if( (isTeleport || !Utility.InUpdateRange( oldLocation, ns.Mobile.Location )) && ns.Mobile.CanSee( this ) )
{
ns.Send( new MobileIncoming( ns.Mobile, this ) );
if ( ns.IsPost7000 ) {
ns.Send( new MobileIncoming( ns.Mobile, this ) );
if ( m_Poison != null )
ns.Send( new HealthbarPoison( this ) );
if ( m_Blessed || m_YellowHealthbar )
ns.Send( new HealthbarYellow( this ) );
} else {
ns.Send( new MobileIncomingOld( ns.Mobile, this ) );
}
if( IsDeadBondedPet )
@ -9322,14 +9434,16 @@ namespace Server
{
if( state.Mobile.CanSee( this ) )
{
state.Send( new MobileIncoming( state.Mobile, this ) );
if ( state.IsPost7000 ) {
state.Send( new MobileIncoming( state.Mobile, this ) );
if ( m_Poison != null )
state.Send( new HealthbarPoison( this ) );
if ( m_Blessed || m_YellowHealthbar )
state.Send( new HealthbarYellow( this ) );
} else {
state.Send( new MobileIncomingOld( state.Mobile, this ) );
}
if( IsDeadBondedPet )
@ -9852,12 +9966,13 @@ namespace Server
sendFacialHair = true;
}
Packet[] cache = m_MovingPacketCache;
Packet[][] cache = m_MovingPacketCache;
if( sendMoving || sendNonlocalMoving )
if( sendMoving || sendNonlocalMoving || sendHealthbarPoison || sendHealthbarYellow )
{
for( int i = 0; i < cache.Length; ++i )
Packet.Release( ref cache[i] );
for( int j = 0; j < cache[i].Length; ++j )
Packet.Release( ref cache[i][j] );
}
NetState ourState = m.m_NetState;
@ -9867,18 +9982,23 @@ namespace Server
if( sendUpdate )
{
ourState.Sequence = 0;
ourState.Send( new MobileUpdate( m ) );
if ( ourState.IsPost7000 )
ourState.Send( new MobileUpdate( m ) );
else
ourState.Send( new MobileUpdateOld( m ) );
ClearFastwalkStack();
}
if( sendIncoming )
ourState.Send( new MobileIncoming( m, m ) );
if ( ourState.IsPost7000 ) {
if( sendIncoming )
ourState.Send( new MobileIncoming( m, m ) );
if( sendMoving )
{
int noto = Notoriety.Compute( m, m );
ourState.Send( cache[noto] = Packet.Acquire( new MobileMoving( m, noto ) ) );
ourState.Send( cache[0][noto] = Packet.Acquire( new MobileMoving( m, noto ) ) );
}
if ( sendHealthbarPoison )
@ -9887,10 +10007,13 @@ namespace Server
if ( sendHealthbarYellow )
ourState.Send( new HealthbarYellow( m ) );
} else {
if( sendIncoming )
ourState.Send( new MobileIncomingOld( m, m ) );
if( sendMoving || sendHealthbarPoison || sendHealthbarYellow )
{
int noto = Notoriety.Compute( m, m );
ourState.Send( cache[noto] = Packet.Acquire( new MobileMoving( m, noto ) ) );
ourState.Send( cache[1][noto] = Packet.Acquire( new MobileMovingOld( m, noto ) ) );
}
}
@ -9972,7 +10095,11 @@ namespace Server
if( sendIncoming )
{
state.Send( new MobileIncoming( beholder, m ) );
if ( state.IsPost7000 ) {
state.Send( new MobileIncoming( beholder, m ) );
} else {
state.Send( new MobileIncomingOld( beholder, m ) );
}
if( m.IsDeadBondedPet )
{
@ -9988,10 +10115,10 @@ namespace Server
{
int noto = Notoriety.Compute( beholder, m );
Packet p = cache[noto];
Packet p = cache[0][noto];
if( p == null )
cache[noto] = p = Packet.Acquire( new MobileMoving( m, noto ) );
cache[0][noto] = p = Packet.Acquire( new MobileMoving( m, noto ) );
state.Send( p );
}
@ -10013,10 +10140,10 @@ namespace Server
{
int noto = Notoriety.Compute( beholder, m );
Packet p = cache[noto];
Packet p = cache[1][noto];
if( p == null )
cache[noto] = p = Packet.Acquire( new MobileMoving( m, noto ) );
cache[1][noto] = p = Packet.Acquire( new MobileMoving( m, noto ) );
state.Send( p );
}
@ -10093,7 +10220,8 @@ namespace Server
if( sendMoving || sendNonlocalMoving || sendHealthbarPoison || sendHealthbarYellow )
{
for( int i = 0; i < cache.Length; ++i )
Packet.Release( ref cache[i] );
for( int j = 0; j < cache.Length; ++j )
Packet.Release( ref cache[i][j] );
}
}

View file

@ -1235,8 +1235,13 @@ namespace Server.Network
{
Mobile m = state.Mobile;
state.Send( new MobileUpdate( m ) );
state.Send( new MobileIncoming( m, m ) );
if ( state.IsPost7000 ) {
state.Send( new MobileUpdate( m ) );
state.Send( new MobileIncoming( m, m ) );
} else {
state.Send( new MobileUpdateOld( m ) );
state.Send( new MobileIncomingOld( m, m ) );
}
m.SendEverything();
@ -1955,26 +1960,50 @@ namespace Server.Network
state.Send( SupportedFeatures.Instantiate( state ) );
state.Sequence = 0;
state.Send( new MobileUpdate( m ) );
state.Send( new MobileUpdate( m ) );
m.CheckLightLevels( true );
if ( state.IsPost7000 ) {
state.Send( new MobileUpdate( m ) );
state.Send( new MobileUpdate( m ) );
state.Send( new MobileUpdate( m ) );
m.CheckLightLevels( true );
state.Send( new MobileIncoming( m, m ) );
//state.Send( new MobileAttributes( m ) );
state.Send( new MobileStatus( m, m ) );
state.Send( Server.Network.SetWarMode.Instantiate( m.Warmode ) );
state.Send( new MobileUpdate( m ) );
m.SendEverything();
state.Send( new MobileIncoming( m, m ) );
//state.Send( new MobileAttributes( m ) );
state.Send( new MobileStatus( m, m ) );
state.Send( Server.Network.SetWarMode.Instantiate( m.Warmode ) );
state.Send( SupportedFeatures.Instantiate( state ) );
state.Send( new MobileUpdate( m ) );
//state.Send( new MobileAttributes( m ) );
state.Send( new MobileStatus( m, m ) );
state.Send( Server.Network.SetWarMode.Instantiate( m.Warmode ) );
state.Send( new MobileIncoming( m, m ) );
m.SendEverything();
state.Send( SupportedFeatures.Instantiate( state ) );
state.Send( new MobileUpdate( m ) );
//state.Send( new MobileAttributes( m ) );
state.Send( new MobileStatus( m, m ) );
state.Send( Server.Network.SetWarMode.Instantiate( m.Warmode ) );
state.Send( new MobileIncoming( m, m ) );
} else {
state.Send( new MobileUpdateOld( m ) );
state.Send( new MobileUpdateOld( m ) );
m.CheckLightLevels( true );
state.Send( new MobileUpdateOld( m ) );
state.Send( new MobileIncomingOld( m, m ) );
//state.Send( new MobileAttributes( m ) );
state.Send( new MobileStatus( m, m ) );
state.Send( Server.Network.SetWarMode.Instantiate( m.Warmode ) );
m.SendEverything();
state.Send( SupportedFeatures.Instantiate( state ) );
state.Send( new MobileUpdateOld( m ) );
//state.Send( new MobileAttributes( m ) );
state.Send( new MobileStatus( m, m ) );
state.Send( Server.Network.SetWarMode.Instantiate( m.Warmode ) );
state.Send( new MobileIncomingOld( m, m ) );
}
state.Send( LoginComplete.Instance );
state.Send( new CurrentTime() );

View file

@ -1959,7 +1959,7 @@ namespace Server.Network
public sealed class MobileMoving : Packet
{
public MobileMoving( Mobile m, int noto/*Mobile beholder, Mobile beheld*/ ) : base( 0x77, 17 )
public MobileMoving( Mobile m, int noto ) : base( 0x77, 17 )
{
Point3D loc = m.Location;
@ -1976,7 +1976,31 @@ namespace Server.Network
m_Stream.Write( (byte) m.Direction );
m_Stream.Write( (short) hue );
m_Stream.Write( (byte) m.GetPacketFlags() );
m_Stream.Write( (byte) noto );//Notoriety.Compute( beholder, beheld ) );
m_Stream.Write( (byte) noto );
}
}
// Pre-7.0.0.0 Mobile Moving
public sealed class MobileMovingOld : Packet
{
public MobileMovingOld( Mobile m, int noto ) : base( 0x77, 17 )
{
Point3D loc = m.Location;
int hue = m.Hue;
if ( m.SolidHueOverride >= 0 )
hue = m.SolidHueOverride;
m_Stream.Write( (int) m.Serial );
m_Stream.Write( (short) m.Body );
m_Stream.Write( (short) loc.m_X );
m_Stream.Write( (short) loc.m_Y );
m_Stream.Write( (sbyte) loc.m_Z );
m_Stream.Write( (byte) m.Direction );
m_Stream.Write( (short) hue );
m_Stream.Write( (byte) m.GetOldPacketFlags() );
m_Stream.Write( (byte) noto );
}
}
@ -2953,6 +2977,29 @@ namespace Server.Network
}
}
// Pre-7.0.0.0 Mobile Update
public sealed class MobileUpdateOld : Packet
{
public MobileUpdateOld( Mobile m ) : base( 0x20, 19 )
{
int hue = m.Hue;
if ( m.SolidHueOverride >= 0 )
hue = m.SolidHueOverride;
m_Stream.Write( (int) m.Serial );
m_Stream.Write( (short) m.Body );
m_Stream.Write( (byte) 0 );
m_Stream.Write( (short) hue );
m_Stream.Write( (byte) m.GetOldPacketFlags() );
m_Stream.Write( (short) m.X );
m_Stream.Write( (short) m.Y );
m_Stream.Write( (short) 0 );
m_Stream.Write( (byte) m.Direction );
m_Stream.Write( (sbyte) m.Z );
}
}
public sealed class MobileIncoming : Packet
{
private static int[] m_DupedLayers = new int[256];
@ -3076,6 +3123,130 @@ namespace Server.Network
}
}
// Pre-7.0.0.0 Mobile Incoming
public sealed class MobileIncomingOld : Packet
{
private static int[] m_DupedLayers = new int[256];
private static int m_Version;
public Mobile m_Beheld;
public MobileIncomingOld( Mobile beholder, Mobile beheld ) : base( 0x78 )
{
m_Beheld = beheld;
++m_Version;
List<Item> eq = beheld.Items;
int count = eq.Count;
if( beheld.HairItemID > 0 )
count++;
if( beheld.FacialHairItemID > 0 )
count++;
this.EnsureCapacity( 23 + (count * 9) );
int hue = beheld.Hue;
if ( beheld.SolidHueOverride >= 0 )
hue = beheld.SolidHueOverride;
m_Stream.Write( (int) beheld.Serial );
m_Stream.Write( (short) beheld.Body );
m_Stream.Write( (short) beheld.X );
m_Stream.Write( (short) beheld.Y );
m_Stream.Write( (sbyte) beheld.Z );
m_Stream.Write( (byte) beheld.Direction );
m_Stream.Write( (short) hue );
m_Stream.Write( (byte) beheld.GetOldPacketFlags() );
m_Stream.Write( (byte) Notoriety.Compute( beholder, beheld ) );
for ( int i = 0; i < eq.Count; ++i )
{
Item item = eq[i];
byte layer = (byte) item.Layer;
if ( !item.Deleted && beholder.CanSee( item ) && m_DupedLayers[layer] != m_Version )
{
m_DupedLayers[layer] = m_Version;
hue = item.Hue;
if ( beheld.SolidHueOverride >= 0 )
hue = beheld.SolidHueOverride;
int itemID = item.ItemID & 0x3FFF;
bool writeHue = ( hue != 0 );
if ( writeHue )
itemID |= 0x8000;
m_Stream.Write( (int) item.Serial );
m_Stream.Write( (short) itemID );
m_Stream.Write( (byte) layer );
if ( writeHue )
m_Stream.Write( (short) hue );
}
}
if( beheld.HairItemID > 0 )
{
if( m_DupedLayers[(int)Layer.Hair] != m_Version )
{
m_DupedLayers[(int)Layer.Hair] = m_Version;
hue = beheld.HairHue;
if( beheld.SolidHueOverride >= 0 )
hue = beheld.SolidHueOverride;
int itemID = beheld.HairItemID & 0x3FFF;
bool writeHue = (hue != 0);
if( writeHue )
itemID |= 0x8000;
m_Stream.Write( (int)HairInfo.FakeSerial( beheld ) );
m_Stream.Write( (short)itemID );
m_Stream.Write( (byte)Layer.Hair );
if( writeHue )
m_Stream.Write( (short)hue );
}
}
if( beheld.FacialHairItemID > 0 )
{
if( m_DupedLayers[(int)Layer.FacialHair] != m_Version )
{
m_DupedLayers[(int)Layer.FacialHair] = m_Version;
hue = beheld.FacialHairHue;
if( beheld.SolidHueOverride >= 0 )
hue = beheld.SolidHueOverride;
int itemID = beheld.FacialHairItemID & 0x3FFF;
bool writeHue = (hue != 0);
if( writeHue )
itemID |= 0x8000;
m_Stream.Write( (int)FacialHairInfo.FakeSerial( beheld ) );
m_Stream.Write( (short)itemID );
m_Stream.Write( (byte)Layer.FacialHair );
if( writeHue )
m_Stream.Write( (short)hue );
}
}
m_Stream.Write( (int) 0 ); // terminate
}
}
public sealed class AsciiMessage : Packet
{
public AsciiMessage( Serial serial, int graphic, MessageType type, int hue, int font, string name, string text ) : base( 0x1C )