public virtual void Serialize( GenericWriter writer )
{
writer.Write( 9 ); // version
SaveFlag flags = SaveFlag.None;
int x = m_Location.m_X, y = m_Location.m_Y, z = m_Location.m_Z;
if ( x != 0 || y != 0 || z != 0 )
{
if ( x >= short.MinValue && x <= short.MaxValue && y >= short.MinValue && y <= short.MaxValue && z >= sbyte.MinValue && z <= sbyte.MaxValue )
{
if ( x != 0 || y != 0 )
{
if ( x >= byte.MinValue && x <= byte.MaxValue && y >= byte.MinValue && y <= byte.MaxValue )
flags |= SaveFlag.LocationByteXY;
else
flags |= SaveFlag.LocationShortXY;
}
if ( z != 0 )
flags |= SaveFlag.LocationSByteZ;
}
else
{
flags |= SaveFlag.LocationFull;
}
}
CompactInfo info = LookupCompactInfo();
List<Item> items = LookupItems();
[COLOR=BLUE]if ( m_GridLocation > 0 )
flags |= SaveFlag.GridLocation;[/COLOR]
if ( m_Direction != Direction.North )
flags |= SaveFlag.Direction;
if ( info != null && info.m_Bounce != null )
flags |= SaveFlag.Bounce;
if ( m_LootType != LootType.Regular )
flags |= SaveFlag.LootType;
if ( m_ItemID != 0 )
flags |= SaveFlag.ItemID;
if ( m_Hue != 0 )
flags |= SaveFlag.Hue;
if ( m_Amount != 1 )
flags |= SaveFlag.Amount;
if ( m_Layer != Layer.Invalid )
flags |= SaveFlag.Layer;
if ( info != null && info.m_Name != null )
flags |= SaveFlag.Name;
if ( m_Parent != null )
flags |= SaveFlag.Parent;
if ( items != null && items.Count > 0 )
flags |= SaveFlag.Items;
if ( m_Map != Map.Internal )
flags |= SaveFlag.Map;
//if ( m_InsuredFor != null && !m_InsuredFor.Deleted )
//flags |= SaveFlag.InsuredFor;
if ( info != null && info.m_BlessedFor != null && !info.m_BlessedFor.Deleted )
flags |= SaveFlag.BlessedFor;
if ( info != null && info.m_HeldBy != null && !info.m_HeldBy.Deleted )
flags |= SaveFlag.HeldBy;
if ( info != null && info.m_SavedFlags != 0 )
flags |= SaveFlag.SavedFlags;
if ( info == null || info.m_Weight == -1 )
{
flags |= SaveFlag.NullWeight;
}
else
{
if ( info.m_Weight == 0.0 )
{
flags |= SaveFlag.WeightIs0;
}
else if ( info.m_Weight != 1.0 )
{
if ( info.m_Weight == (int) info.m_Weight )
flags |= SaveFlag.IntWeight;
else
flags |= SaveFlag.WeightNot1or0;
}
}
ImplFlag implFlags = ( m_Flags & ( ImplFlag.Visible | ImplFlag.Movable | ImplFlag.Stackable | ImplFlag.Insured | ImplFlag.PayedInsurance | ImplFlag.QuestItem ) );
if ( implFlags != ( ImplFlag.Visible | ImplFlag.Movable ) )
flags |= SaveFlag.ImplFlags;
writer.Write( (int) flags );
/* begin last moved time optimization */
long ticks = m_LastMovedTime.Ticks;
long now = DateTime.Now.Ticks;
TimeSpan d;
try { d = new TimeSpan( ticks - now ); }
catch { if ( ticks < now ) d = TimeSpan.MaxValue; else d = TimeSpan.MaxValue; }
double minutes = -d.TotalMinutes;
if ( minutes < int.MinValue )
minutes = int.MinValue;
else if ( minutes > int.MaxValue )
minutes = int.MaxValue;
writer.WriteEncodedInt( (int) minutes );
/* end */
if ( GetSaveFlag( flags, SaveFlag.GridLocation ) )
writer.Write( (byte) m_GridLocation );
if ( GetSaveFlag( flags, SaveFlag.Direction ) )
writer.Write( (byte) m_Direction );
if ( GetSaveFlag( flags, SaveFlag.Bounce ) )
BounceInfo.Serialize( info.m_Bounce, writer );
if ( GetSaveFlag( flags, SaveFlag.LootType ) )
writer.Write( (byte) m_LootType );
if ( GetSaveFlag( flags, SaveFlag.LocationFull ) )
{
writer.WriteEncodedInt( x );
writer.WriteEncodedInt( y );
writer.WriteEncodedInt( z );
}
else
{
if ( GetSaveFlag( flags, SaveFlag.LocationByteXY ) )
{
writer.Write( (byte) x );
writer.Write( (byte) y );
}
else if ( GetSaveFlag( flags, SaveFlag.LocationShortXY ) )
{
writer.Write( (short) x );
writer.Write( (short) y );
}
if ( GetSaveFlag( flags, SaveFlag.LocationSByteZ ) )
writer.Write( (sbyte) z );
}
if ( GetSaveFlag( flags, SaveFlag.ItemID ) )
writer.WriteEncodedInt( (int) m_ItemID );
if ( GetSaveFlag( flags, SaveFlag.Hue ) )
writer.WriteEncodedInt( (int) m_Hue );
if ( GetSaveFlag( flags, SaveFlag.Amount ) )
writer.WriteEncodedInt( (int) m_Amount );
if ( GetSaveFlag( flags, SaveFlag.Layer ) )
writer.Write( (byte) m_Layer );
if ( GetSaveFlag( flags, SaveFlag.Name ) )
writer.Write( (string) info.m_Name );
if ( GetSaveFlag( flags, SaveFlag.Parent ) )
{
if ( m_Parent is Mobile && !( (Mobile) m_Parent ).Deleted )
writer.Write( ( (Mobile) m_Parent ).Serial );
else if ( m_Parent is Item && !( (Item) m_Parent ).Deleted )
writer.Write( ( (Item) m_Parent ).Serial );
else
writer.Write( (int) Serial.MinusOne );
}
if ( GetSaveFlag( flags, SaveFlag.Items ) )
writer.Write( items, false );
if ( GetSaveFlag( flags, SaveFlag.IntWeight ) )
writer.WriteEncodedInt( (int) info.m_Weight );
else if ( GetSaveFlag( flags, SaveFlag.WeightNot1or0 ) )
writer.Write( (double) info.m_Weight );
if ( GetSaveFlag( flags, SaveFlag.Map ) )
writer.Write( (Map) m_Map );
if ( GetSaveFlag( flags, SaveFlag.ImplFlags ) )
writer.WriteEncodedInt( (int) implFlags );
if ( GetSaveFlag( flags, SaveFlag.InsuredFor ) )
writer.Write( (Mobile) null );
if ( GetSaveFlag( flags, SaveFlag.BlessedFor ) )
writer.Write( info.m_BlessedFor );
if ( GetSaveFlag( flags, SaveFlag.HeldBy ) )
writer.Write( info.m_HeldBy );
if ( GetSaveFlag( flags, SaveFlag.SavedFlags ) )
writer.WriteEncodedInt( info.m_SavedFlags );
}
public virtual void Deserialize( GenericReader reader )
{
int version = reader.ReadInt();
SetLastMoved();
switch ( version )
{
case 9:
case 8:
case 7:
case 6:
{
SaveFlag flags = (SaveFlag)reader.ReadInt();
if ( version < 7 )
{
LastMoved = reader.ReadDeltaTime();
}
else
{
int minutes = reader.ReadEncodedInt();
try{ LastMoved = DateTime.Now - TimeSpan.FromMinutes( minutes ); }
catch{ LastMoved = DateTime.Now; }
}
[COLOR=BLUE]if ( GetSaveFlag( flags, SaveFlag.GridLocation ) )
m_GridLocation = reader.ReadByte();[/COLOR]
if ( GetSaveFlag( flags, SaveFlag.Direction ) )
m_Direction = (Direction)reader.ReadByte();
if ( GetSaveFlag( flags, SaveFlag.Bounce ) )
AcquireCompactInfo().m_Bounce = BounceInfo.Deserialize( reader );
if ( GetSaveFlag( flags, SaveFlag.LootType ) )
m_LootType = (LootType)reader.ReadByte();
int x = 0, y = 0, z = 0;
if ( GetSaveFlag( flags, SaveFlag.LocationFull ) )
{
x = reader.ReadEncodedInt();
y = reader.ReadEncodedInt();
z = reader.ReadEncodedInt();
}
else
{
if ( GetSaveFlag( flags, SaveFlag.LocationByteXY ) )
{
x = reader.ReadByte();
y = reader.ReadByte();
}
else if ( GetSaveFlag( flags, SaveFlag.LocationShortXY ) )
{
x = reader.ReadShort();
y = reader.ReadShort();
}
if ( GetSaveFlag( flags, SaveFlag.LocationSByteZ ) )
z = reader.ReadSByte();
}
m_Location = new Point3D( x, y, z );
if ( GetSaveFlag( flags, SaveFlag.ItemID ) )
m_ItemID = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.Hue ) )
m_Hue = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.Amount ) )
m_Amount = reader.ReadEncodedInt();
else
m_Amount = 1;
if ( GetSaveFlag( flags, SaveFlag.Layer ) )
m_Layer = (Layer)reader.ReadByte();
if ( GetSaveFlag( flags, SaveFlag.Name ) )
{
string name = reader.ReadString();
if ( name != this.DefaultName )
AcquireCompactInfo().m_Name = name;
}
if ( GetSaveFlag( flags, SaveFlag.Parent ) )
{
Serial parent = reader.ReadInt();
if ( parent.IsMobile )
m_Parent = World.FindMobile( parent );
else if ( parent.IsItem )
m_Parent = World.FindItem( parent );
else
m_Parent = null;
if ( m_Parent == null && (parent.IsMobile || parent.IsItem) )
Delete();
}
if ( GetSaveFlag( flags, SaveFlag.Items ) )
{
List<Item> items = reader.ReadStrongItemList();
if ( this is Container )
( this as Container ).m_Items = items;
else
AcquireCompactInfo().m_Items = items;
}
if ( version < 8 || !GetSaveFlag( flags, SaveFlag.NullWeight ) )
{
double weight;
if ( GetSaveFlag( flags, SaveFlag.IntWeight ) )
weight = reader.ReadEncodedInt();
else if ( GetSaveFlag( flags, SaveFlag.WeightNot1or0 ) )
weight = reader.ReadDouble();
else if ( GetSaveFlag( flags, SaveFlag.WeightIs0 ) )
weight = 0.0;
else
weight = 1.0;
if ( weight != DefaultWeight )
AcquireCompactInfo().m_Weight = weight;
}
if ( GetSaveFlag( flags, SaveFlag.Map ) )
m_Map = reader.ReadMap();
else
m_Map = Map.Internal;
if ( GetSaveFlag( flags, SaveFlag.Visible ) )
SetFlag( ImplFlag.Visible, reader.ReadBool() );
else
SetFlag( ImplFlag.Visible, true );
if ( GetSaveFlag( flags, SaveFlag.Movable ) )
SetFlag( ImplFlag.Movable, reader.ReadBool() );
else
SetFlag( ImplFlag.Movable, true );
if ( GetSaveFlag( flags, SaveFlag.Stackable ) )
SetFlag( ImplFlag.Stackable, reader.ReadBool() );
if ( GetSaveFlag( flags, SaveFlag.ImplFlags ) )
m_Flags = (ImplFlag)reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.InsuredFor ) )
/*m_InsuredFor = */reader.ReadMobile();
if ( GetSaveFlag( flags, SaveFlag.BlessedFor ) )
AcquireCompactInfo().m_BlessedFor = reader.ReadMobile();
if ( GetSaveFlag( flags, SaveFlag.HeldBy ) )
AcquireCompactInfo().m_HeldBy = reader.ReadMobile();
if ( GetSaveFlag( flags, SaveFlag.SavedFlags ) )
AcquireCompactInfo().m_SavedFlags = reader.ReadEncodedInt();
if ( m_Map != null && m_Parent == null )
m_Map.OnEnter( this );
break;
}
case 5:
{
SaveFlag flags = (SaveFlag)reader.ReadInt();
LastMoved = reader.ReadDeltaTime();
if ( GetSaveFlag( flags, SaveFlag.Direction ) )
m_Direction = (Direction)reader.ReadByte();
if ( GetSaveFlag( flags, SaveFlag.Bounce ) )
AcquireCompactInfo().m_Bounce = BounceInfo.Deserialize( reader );
if ( GetSaveFlag( flags, SaveFlag.LootType ) )
m_LootType = (LootType)reader.ReadByte();
if ( GetSaveFlag( flags, SaveFlag.LocationFull ) )
m_Location = reader.ReadPoint3D();
if ( GetSaveFlag( flags, SaveFlag.ItemID ) )
m_ItemID = reader.ReadInt();
if ( GetSaveFlag( flags, SaveFlag.Hue ) )
m_Hue = reader.ReadInt();
if ( GetSaveFlag( flags, SaveFlag.Amount ) )
m_Amount = reader.ReadInt();
else
m_Amount = 1;
if ( GetSaveFlag( flags, SaveFlag.Layer ) )
m_Layer = (Layer)reader.ReadByte();
if ( GetSaveFlag( flags, SaveFlag.Name ) )
{
string name = reader.ReadString();
if ( name != this.DefaultName )
AcquireCompactInfo().m_Name = name;
}
if ( GetSaveFlag( flags, SaveFlag.Parent ) )
{
Serial parent = reader.ReadInt();
if ( parent.IsMobile )
m_Parent = World.FindMobile( parent );
else if ( parent.IsItem )
m_Parent = World.FindItem( parent );
else
m_Parent = null;
if ( m_Parent == null && (parent.IsMobile || parent.IsItem) )
Delete();
}
if ( GetSaveFlag( flags, SaveFlag.Items ) )
{
List<Item> items = reader.ReadStrongItemList();
if ( this is Container )
( this as Container ).m_Items = items;
else
AcquireCompactInfo().m_Items = items;
}
double weight;
if ( GetSaveFlag( flags, SaveFlag.IntWeight ) )
weight = reader.ReadEncodedInt();
else if ( GetSaveFlag( flags, SaveFlag.WeightNot1or0 ) )
weight = reader.ReadDouble();
else if ( GetSaveFlag( flags, SaveFlag.WeightIs0 ) )
weight = 0.0;
else
weight = 1.0;
if ( weight != DefaultWeight )
AcquireCompactInfo().m_Weight = weight;
if ( GetSaveFlag( flags, SaveFlag.Map ) )
m_Map = reader.ReadMap();
else
m_Map = Map.Internal;
if ( GetSaveFlag( flags, SaveFlag.Visible ) )
SetFlag( ImplFlag.Visible, reader.ReadBool() );
else
SetFlag( ImplFlag.Visible, true );
if ( GetSaveFlag( flags, SaveFlag.Movable ) )
SetFlag( ImplFlag.Movable, reader.ReadBool() );
else
SetFlag( ImplFlag.Movable, true );
if ( GetSaveFlag( flags, SaveFlag.Stackable ) )
SetFlag( ImplFlag.Stackable, reader.ReadBool() );
if ( m_Map != null && m_Parent == null )
m_Map.OnEnter( this );
break;
}
case 4: // Just removed variables
case 3:
{
m_Direction = (Direction)reader.ReadInt();
goto case 2;
}
case 2:
{
AcquireCompactInfo().m_Bounce = BounceInfo.Deserialize( reader );
LastMoved = reader.ReadDeltaTime();
goto case 1;
}
case 1:
{
m_LootType = (LootType) reader.ReadByte();//m_Newbied = reader.ReadBool();
goto case 0;
}
case 0:
{
m_Location = reader.ReadPoint3D();
m_ItemID = reader.ReadInt();
m_Hue = reader.ReadInt();
m_Amount = reader.ReadInt();
m_Layer = (Layer) reader.ReadByte();
string name = reader.ReadString();
if ( name != this.DefaultName )
AcquireCompactInfo().m_Name = name;
Serial parent = reader.ReadInt();
if ( parent.IsMobile )
m_Parent = World.FindMobile( parent );
else if ( parent.IsItem )
m_Parent = World.FindItem( parent );
else
m_Parent = null;
if ( m_Parent == null && (parent.IsMobile || parent.IsItem) )
Delete();
int count = reader.ReadInt();
if ( count > 0 )
{
List<Item> items = new List<Item>( count );
for ( int i = 0; i < count; ++i )
{
Item item = reader.ReadItem();
if ( item != null )
items.Add( item );
}
if ( this is Container )
( this as Container ).m_Items = items;
else
AcquireCompactInfo().m_Items = items;
}
double weight = reader.ReadDouble();
if ( weight != DefaultWeight )
AcquireCompactInfo().m_Weight = weight;
if ( version <= 3 )
{
reader.ReadInt();
reader.ReadInt();
reader.ReadInt();
}
m_Map = reader.ReadMap();
SetFlag( ImplFlag.Visible, reader.ReadBool() );
SetFlag( ImplFlag.Movable, reader.ReadBool() );
if ( version <= 3 )
/*m_Deleted =*/ reader.ReadBool();
Stackable = reader.ReadBool();
if ( m_Map != null && m_Parent == null )
m_Map.OnEnter( this );
break;
}
}
if ( this.HeldBy != null )
Timer.DelayCall( TimeSpan.Zero, new TimerCallback( FixHolding_Sandbox ) );
//if ( version < 9 )
VerifyCompactInfo();
}