public sealed class CharacterList : Packet
{
public CharacterList( IAccount a, CityInfo[] info ) : base( 0xA9 )
{
this.EnsureCapacity( 9 + (a.Length * 60) + (info.Length * 89) );
int highSlot = -1;
for ( int i = 0; i < a.Length; ++i )
{
if ( a[i] != null )
highSlot = i;
}
int count = Math.Max( Math.Max( highSlot + 1, a.Limit ), 5 );
m_Stream.Write( (byte) count );
for ( int i = 0; i < count; ++i )
{
if ( a[i] != null )
{
m_Stream.WriteAsciiFixed( a[i].Name, 30 );
m_Stream.Fill( 30 ); // password
}
else
{
m_Stream.Fill( 60 );
}
}
m_Stream.Write( (byte) info.Length );
for ( int i = 0; i < info.Length; ++i )
{
CityInfo ci = info[i];
m_Stream.Write( (byte) i );
m_Stream.WriteAsciiFixed( ci.City, 32 );
m_Stream.WriteAsciiFixed( ci.Building, 32 );
//added fields for 7.0.13.0:
//(not sure what exactly this is for, just setting to 0)
m_Stream.Write(0); //start loc x
m_Stream.Write(0); //start loc y
m_Stream.Write(0); //start loc z
m_Stream.Write(0); //start map id
m_Stream.Write(0); //zero
//end added fields for 7.0.13.0
}
int flags = ExpansionInfo.CurrentExpansion.CharacterListFlags;
if ( count == 7 )
flags |= 0x1000; // 7th character slot
else if ( count == 6 )
flags |= 0x40; // 6th character slot
else if ( a.Limit == 1 )
flags |= 0x14; // Limit characters & one character
m_Stream.Write( (int)(flags | m_AdditionalFlags) ); // flags
m_Stream.Write(-1); //added for 7.0.13.0
}
private static int m_AdditionalFlags;
public static int AdditionalFlags
{
get{ return m_AdditionalFlags; }
set{ m_AdditionalFlags = value; }
}
}