How to keep vendors frozen after restart
"My vendors were frozen before restart, but afterwards they are all freely walking around. How do I prevent this?"
I have seen this question asked many times in the forum, but I have not seen a clear answer and many people are still wondering how to do it. There are obviously many different ways to accomplish it, but this is how I did it:
In BaseVendor.cs, find the following code (around line 1256):
What we need to do, is to serialize and deserialize the frozen attribute of the npc. So we add a few lines of code, and the code becomes like this: (changes in red)
And the trick is done
"My vendors were frozen before restart, but afterwards they are all freely walking around. How do I prevent this?"
I have seen this question asked many times in the forum, but I have not seen a clear answer and many people are still wondering how to do it. There are obviously many different ways to accomplish it, but this is how I did it:
In BaseVendor.cs, find the following code (around line 1256):
Code:
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 ); // version
ArrayList sbInfos = this.SBInfos;
for ( int i = 0; sbInfos != null && i < sbInfos.Count; ++i )
{
SBInfo sbInfo = (SBInfo)sbInfos[i];
ArrayList buyInfo = sbInfo.BuyInfo;
for ( int j = 0; buyInfo != null && j < buyInfo.Count; ++j )
{
GenericBuyInfo gbi = (GenericBuyInfo)buyInfo[j];
int maxAmount = gbi.MaxAmount;
int doubled = 0;
switch ( maxAmount )
{
case 40: doubled = 1; break;
case 80: doubled = 2; break;
case 160: doubled = 3; break;
case 320: doubled = 4; break;
case 640: doubled = 5; break;
case 999: doubled = 6; break;
}
if ( doubled > 0 )
{
writer.WriteEncodedInt( 1 + ((j * sbInfos.Count) + i) );
writer.WriteEncodedInt( doubled );
}
}
}
writer.WriteEncodedInt( 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
LoadSBInfo();
ArrayList sbInfos = this.SBInfos;
switch ( version )
case 1:
{
int index;
while ( (index = reader.ReadEncodedInt()) > 0 )
{
int doubled = reader.ReadEncodedInt();
if ( sbInfos != null )
{
index -= 1;
int sbInfoIndex = index % sbInfos.Count;
int buyInfoIndex = index / sbInfos.Count;
if ( sbInfoIndex >= 0 && sbInfoIndex < sbInfos.Count )
{
SBInfo sbInfo = (SBInfo)sbInfos[sbInfoIndex];
ArrayList buyInfo = sbInfo.BuyInfo;
if ( buyInfo != null && buyInfoIndex >= 0 && buyInfoIndex < buyInfo.Count )
{
GenericBuyInfo gbi = (GenericBuyInfo)buyInfo[buyInfoIndex];
int amount = 20;
switch ( doubled )
{
case 1: amount = 40; break;
case 2: amount = 80; break;
case 3: amount = 160; break;
case 4: amount = 320; break;
case 5: amount = 640; break;
case 6: amount = 999; break;
}
gbi.Amount = gbi.MaxAmount = amount;
}
}
}
}
break;
}
}
What we need to do, is to serialize and deserialize the frozen attribute of the npc. So we add a few lines of code, and the code becomes like this: (changes in red)
Code:
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
[COLOR="Red"]writer.Write( (int) 2 ); // version
writer.Write( this.Frozen );[/COLOR]
ArrayList sbInfos = this.SBInfos;
for ( int i = 0; sbInfos != null && i < sbInfos.Count; ++i )
{
SBInfo sbInfo = (SBInfo)sbInfos[i];
ArrayList buyInfo = sbInfo.BuyInfo;
for ( int j = 0; buyInfo != null && j < buyInfo.Count; ++j )
{
GenericBuyInfo gbi = (GenericBuyInfo)buyInfo[j];
int maxAmount = gbi.MaxAmount;
int doubled = 0;
switch ( maxAmount )
{
case 40: doubled = 1; break;
case 80: doubled = 2; break;
case 160: doubled = 3; break;
case 320: doubled = 4; break;
case 640: doubled = 5; break;
case 999: doubled = 6; break;
}
if ( doubled > 0 )
{
writer.WriteEncodedInt( 1 + ((j * sbInfos.Count) + i) );
writer.WriteEncodedInt( doubled );
}
}
}
writer.WriteEncodedInt( 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
LoadSBInfo();
ArrayList sbInfos = this.SBInfos;
switch ( version )
{
[COLOR="Red"]case 2:
{
this.Frozen = reader.ReadBool();
goto case 1;
}[/COLOR]
case 1:
{
int index;
while ( (index = reader.ReadEncodedInt()) > 0 )
{
int doubled = reader.ReadEncodedInt();
if ( sbInfos != null )
{
index -= 1;
int sbInfoIndex = index % sbInfos.Count;
int buyInfoIndex = index / sbInfos.Count;
if ( sbInfoIndex >= 0 && sbInfoIndex < sbInfos.Count )
{
SBInfo sbInfo = (SBInfo)sbInfos[sbInfoIndex];
ArrayList buyInfo = sbInfo.BuyInfo;
if ( buyInfo != null && buyInfoIndex >= 0 && buyInfoIndex < buyInfo.Count )
{
GenericBuyInfo gbi = (GenericBuyInfo)buyInfo[buyInfoIndex];
int amount = 20;
switch ( doubled )
{
case 1: amount = 40; break;
case 2: amount = 80; break;
case 3: amount = 160; break;
case 4: amount = 320; break;
case 5: amount = 640; break;
case 6: amount = 999; break;
}
gbi.Amount = gbi.MaxAmount = amount;
}
}
}
}
break;
}
}
And the trick is done