Quote:
|
Originally Posted by Dave1969
Im lost Arte. Have no idea where to put it. dont know where sereialze and deserialize begins and ends. spent an hour trying
|
I am assuming that you were using a version number of 14 when you were using your taming mods.
Whenever you add stuff to your Serialization/Deserialization you need to change your version number so that it will be able to distinguish older saves from newer saves.
The problem was that you added things to your Deserialize, but since your older saves wouldnt have any of those new things, there was no way that they could be read in and you got an error.
Using the version number prevents that since old versions will have the number 14 and so when it goes to read those saves, it will skip that part that tests for version 15 or above and so wont try to read in new stuff that isnt there.
you will want your Serialize to look like this
Code:
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
//ARTEGORDONMOD
// changed from version 13 to version 14
// changed from 14 to 15
writer.Write( (int) 15 ); // version
writer.Write( (int)m_CurrentAI );
writer.Write( (int)m_DefaultAI );
writer.Write( (int)m_iRangePerception );
writer.Write( (int)m_iRangeFight );
writer.Write( (int)m_iTeam );
writer.Write( (double)m_dActiveSpeed );
writer.Write( (double)m_dPassiveSpeed );
writer.Write( (double)m_dCurrentSpeed );
writer.Write( (int) m_pHome.X );
writer.Write( (int) m_pHome.Y );
writer.Write( (int) m_pHome.Z );
// Version 1
writer.Write( (int) m_iRangeHome );
int i=0;
writer.Write( (int) m_arSpellAttack.Count );
for ( i=0; i< m_arSpellAttack.Count; i++ )
{
writer.Write( m_arSpellAttack[i].ToString() );
}
writer.Write( (int) m_arSpellDefense.Count );
for ( i=0; i< m_arSpellDefense.Count; i++ )
{
writer.Write( m_arSpellDefense[i].ToString() );
}
// Version 2
writer.Write( (int) m_FightMode );
writer.Write( (bool) m_bControled );
writer.Write( (Mobile) m_ControlMaster );
writer.Write( (Mobile) m_ControlTarget );
writer.Write( (Point3D) m_ControlDest );
writer.Write( (int) m_ControlOrder );
writer.Write( (double) m_dMinTameSkill );
// Removed in version 9
//writer.Write( (double) m_dMaxTameSkill );
writer.Write( (bool) m_bTamable );
writer.Write( (bool) m_bSummoned );
if ( m_bSummoned )
writer.WriteDeltaTime( m_SummonEnd );
writer.Write( (int) m_iControlSlots );
// Version 3
writer.Write( (int)m_Loyalty );
// Version 4
writer.Write( m_CurrentWayPoint );
// Verison 5
writer.Write( m_SummonMaster );
// Version 6
writer.Write( (int) m_HitsMax );
writer.Write( (int) m_StamMax );
writer.Write( (int) m_ManaMax );
writer.Write( (int) m_DamageMin );
writer.Write( (int) m_DamageMax );
// Version 7
writer.Write( (int) m_PhysicalResistance );
writer.Write( (int) m_PhysicalDamage );
writer.Write( (int) m_FireResistance );
writer.Write( (int) m_FireDamage );
writer.Write( (int) m_ColdResistance );
writer.Write( (int) m_ColdDamage );
writer.Write( (int) m_PoisonResistance );
writer.Write( (int) m_PoisonDamage );
writer.Write( (int) m_EnergyResistance );
writer.Write( (int) m_EnergyDamage );
// Version 8
writer.WriteMobileList( m_Owners, true );
// Version 10
writer.Write( (bool) m_IsDeadPet );
writer.Write( (bool) m_IsBonded );
writer.Write( (DateTime) m_BondingBegin );
writer.Write( (DateTime) m_OwnerAbandonTime );
// Version 11
writer.Write( (bool) m_HasGeneratedLoot );
// Version 12
writer.Write( (bool) m_Paragon );
// Version 13
writer.Write( (bool) ( m_Friends != null && m_Friends.Count > 0 ) );
if ( m_Friends != null && m_Friends.Count > 0 )
writer.WriteMobileList( m_Friends, true );
// Version 14
writer.Write( (bool) m_IsMating );
writer.Write( (int) m_ABPoints );
writer.Write( (int) m_Exp );
writer.Write( (int) m_NextLevel );
writer.Write( (int) m_Level );
writer.Write( (int) m_MaxLevel );
writer.Write( (bool) m_AllowMating );
writer.Write( (bool) m_Evolves );
writer.Write( (int) m_Gen );
writer.Write( (DateTime) m_MatingDelay );
writer.Write( (int) m_Form1 );
writer.Write( (int) m_Form2 );
writer.Write( (int) m_Form3 );
writer.Write( (int) m_Form4 );
writer.Write( (int) m_Form5 );
writer.Write( (int) m_Form6 );
writer.Write( (int) m_Form7 );
writer.Write( (int) m_Form8 );
writer.Write( (int) m_Form9 );
writer.Write( (int) m_Sound1 );
writer.Write( (int) m_Sound2 );
writer.Write( (int) m_Sound3 );
writer.Write( (int) m_Sound4 );
writer.Write( (int) m_Sound5 );
writer.Write( (int) m_Sound6 );
writer.Write( (int) m_Sound7 );
writer.Write( (int) m_Sound8 );
writer.Write( (int) m_Sound9 );
writer.Write( (bool) m_UsesForm1 );
writer.Write( (bool) m_UsesForm2 );
writer.Write( (bool) m_UsesForm3 );
writer.Write( (bool) m_UsesForm4 );
writer.Write( (bool) m_UsesForm5 );
writer.Write( (bool) m_UsesForm6 );
writer.Write( (bool) m_UsesForm7 );
writer.Write( (bool) m_UsesForm8 );
writer.Write( (bool) m_UsesForm9 );
writer.Write( (bool) m_F0 );
writer.Write( (bool) m_F1 );
writer.Write( (bool) m_F2 );
writer.Write( (bool) m_F3 );
writer.Write( (bool) m_F4 );
writer.Write( (bool) m_F5 );
writer.Write( (bool) m_F6 );
writer.Write( (bool) m_F7 );
writer.Write( (bool) m_F8 );
writer.Write( (bool) m_F9 );
// version 15
if(m_AI != null && m_AI.m_DeactivationTimer != null && m_AI.m_DeactivationTimer.Running){
// write out the time left on the deactivation timer
writer.Write( (TimeSpan) (m_AI.m_DeactivationTimer.m_End - DateTime.Now));
} else {
// not active so on deserialization deactivate immediately
writer.Write( (TimeSpan) TimeSpan.Zero );
}
}
and your Deserialize will look like
Code:
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
m_CurrentAI = (AIType)reader.ReadInt();
m_DefaultAI = (AIType)reader.ReadInt();
m_iRangePerception = reader.ReadInt();
m_iRangeFight = reader.ReadInt();
m_iTeam = reader.ReadInt();
m_dActiveSpeed = reader.ReadDouble();
m_dPassiveSpeed = reader.ReadDouble();
m_dCurrentSpeed = reader.ReadDouble();
double activeSpeed = m_dActiveSpeed;
double passiveSpeed = m_dPassiveSpeed;
SpeedInfo.GetSpeeds( this, ref activeSpeed, ref passiveSpeed );
bool isStandardActive = false;
for ( int i = 0; !isStandardActive && i < m_StandardActiveSpeeds.Length; ++i )
isStandardActive = ( m_dActiveSpeed == m_StandardActiveSpeeds[i] );
bool isStandardPassive = false;
for ( int i = 0; !isStandardPassive && i < m_StandardPassiveSpeeds.Length; ++i )
isStandardPassive = ( m_dPassiveSpeed == m_StandardPassiveSpeeds[i] );
if ( isStandardActive && m_dCurrentSpeed == m_dActiveSpeed )
m_dCurrentSpeed = activeSpeed;
else if ( isStandardPassive && m_dCurrentSpeed == m_dPassiveSpeed )
m_dCurrentSpeed = passiveSpeed;
if ( isStandardActive )
m_dActiveSpeed = activeSpeed;
if ( isStandardPassive )
m_dPassiveSpeed = passiveSpeed;
if ( m_iRangePerception == OldRangePerception )
m_iRangePerception = DefaultRangePerception;
m_pHome.X = reader.ReadInt();
m_pHome.Y = reader.ReadInt();
m_pHome.Z = reader.ReadInt();
if ( version >= 1 )
{
m_iRangeHome = reader.ReadInt();
int i, iCount;
iCount = reader.ReadInt();
for ( i=0; i< iCount; i++ )
{
string str = reader.ReadString();
Type type = Type.GetType( str );
if ( type != null )
{
m_arSpellAttack.Add( type );
}
}
iCount = reader.ReadInt();
for ( i=0; i< iCount; i++ )
{
string str = reader.ReadString();
Type type = Type.GetType( str );
if ( type != null )
{
m_arSpellDefense.Add( type );
}
}
}
else
{
m_iRangeHome = 0;
}
if ( version >= 2 )
{
m_FightMode = ( FightMode )reader.ReadInt();
m_bControled = reader.ReadBool();
m_ControlMaster = reader.ReadMobile();
m_ControlTarget = reader.ReadMobile();
m_ControlDest = reader.ReadPoint3D();
m_ControlOrder = (OrderType) reader.ReadInt();
m_dMinTameSkill = reader.ReadDouble();
if ( version < 9 )
reader.ReadDouble();
m_bTamable = reader.ReadBool();
m_bSummoned = reader.ReadBool();
if ( m_bSummoned )
{
m_SummonEnd = reader.ReadDeltaTime();
new UnsummonTimer( m_ControlMaster, this, m_SummonEnd - DateTime.Now ).Start();
}
m_iControlSlots = reader.ReadInt();
}
else
{
m_FightMode = FightMode.Closest;
m_bControled = false;
m_ControlMaster = null;
m_ControlTarget = null;
m_ControlOrder = OrderType.None;
}
if ( version >= 3 )
m_Loyalty = (PetLoyalty)reader.ReadInt();
else
m_Loyalty = PetLoyalty.WonderfullyHappy;
if ( version >= 4 )
m_CurrentWayPoint = reader.ReadItem() as WayPoint;
if ( version >= 5 )
m_SummonMaster = reader.ReadMobile();
if ( version >= 6 )
{
m_HitsMax = reader.ReadInt();
m_StamMax = reader.ReadInt();
m_ManaMax = reader.ReadInt();
m_DamageMin = reader.ReadInt();
m_DamageMax = reader.ReadInt();
}
if ( version >= 7 )
{
m_PhysicalResistance = reader.ReadInt();
m_PhysicalDamage = reader.ReadInt();
m_FireResistance = reader.ReadInt();
m_FireDamage = reader.ReadInt();
m_ColdResistance = reader.ReadInt();
m_ColdDamage = reader.ReadInt();
m_PoisonResistance = reader.ReadInt();
m_PoisonDamage = reader.ReadInt();
m_EnergyResistance = reader.ReadInt();
m_EnergyDamage = reader.ReadInt();
}
if ( version >= 8 )
m_Owners = reader.ReadMobileList();
else
m_Owners = new ArrayList();
if ( version >= 10 )
{
m_IsDeadPet = reader.ReadBool();
m_IsBonded = reader.ReadBool();
m_BondingBegin = reader.ReadDateTime();
m_OwnerAbandonTime = reader.ReadDateTime();
}
if ( version >= 11 )
m_HasGeneratedLoot = reader.ReadBool();
else
m_HasGeneratedLoot = true;
// temporary mod for conversion
//reader.ReadTimeSpan();
//m_Paragon = reader.ReadBool();
if ( version >= 12 )
m_Paragon = reader.ReadBool();
else
m_Paragon = false;
if ( version >= 13 && reader.ReadBool() )
m_Friends = reader.ReadMobileList();
else if ( version < 13 && m_ControlOrder >= OrderType.Unfriend )
++m_ControlOrder;
CheckStatTimers();
ChangeAIType(m_CurrentAI);
AddFollowers();
if ( IsAnimatedDead )
Spells.Necromancy.AnimateDeadSpell.Register( m_SummonMaster, this );
if ( version >= 14 )
{
m_IsMating = reader.ReadBool();
m_ABPoints = reader.ReadInt();
m_Exp = reader.ReadInt();
m_NextLevel = reader.ReadInt();
m_Level = reader.ReadInt();
m_MaxLevel = reader.ReadInt();
m_AllowMating = reader.ReadBool();
m_Evolves = reader.ReadBool();
m_Gen = reader.ReadInt();
m_MatingDelay = reader.ReadDateTime();
m_Form1 = reader.ReadInt();
m_Form2 = reader.ReadInt();
m_Form3 = reader.ReadInt();
m_Form4 = reader.ReadInt();
m_Form5 = reader.ReadInt();
m_Form6 = reader.ReadInt();
m_Form7 = reader.ReadInt();
m_Form8 = reader.ReadInt();
m_Form9 = reader.ReadInt();
m_Sound1 = reader.ReadInt();
m_Sound2 = reader.ReadInt();
m_Sound3 = reader.ReadInt();
m_Sound4 = reader.ReadInt();
m_Sound5 = reader.ReadInt();
m_Sound6 = reader.ReadInt();
m_Sound7 = reader.ReadInt();
m_Sound8 = reader.ReadInt();
m_Sound9 = reader.ReadInt();
m_UsesForm1 = reader.ReadBool();
m_UsesForm2 = reader.ReadBool();
m_UsesForm3 = reader.ReadBool();
m_UsesForm4 = reader.ReadBool();
m_UsesForm5 = reader.ReadBool();
m_UsesForm6 = reader.ReadBool();
m_UsesForm7 = reader.ReadBool();
m_UsesForm8 = reader.ReadBool();
m_UsesForm9 = reader.ReadBool();
m_F0 = reader.ReadBool();
m_F1 = reader.ReadBool();
m_F2 = reader.ReadBool();
m_F3 = reader.ReadBool();
m_F4 = reader.ReadBool();
m_F5 = reader.ReadBool();
m_F6 = reader.ReadBool();
m_F7 = reader.ReadBool();
m_F8 = reader.ReadBool();
m_F9 = reader.ReadBool();
}
// ARTEGORDONMOD
// PlayerRangeSensitiveMod
if ( version >= 15 )
{
TimeSpan restartDeactivationdelay = reader.ReadTimeSpan();
if(m_AI != null) {
m_AI.m_RestartDeactivationdelay = restartDeactivationdelay;
}
}
}