This commit is contained in:
mark 2011-06-29 03:29:14 +00:00
parent e6562fda8c
commit b2b1229fb8
6 changed files with 140 additions and 36 deletions

View file

@ -165,7 +165,9 @@ namespace Server.Network {
set {
m_Version = value;
if ( value >= m_Version7090 ) {
if ( value >= m_Version70130 ) {
_ProtocolChanges = ProtocolChanges.Version70130;
} else if ( value >= m_Version7090 ) {
_ProtocolChanges = ProtocolChanges.Version7090;
} else if ( value >= m_Version7000 ) {
_ProtocolChanges = ProtocolChanges.Version7000;
@ -196,6 +198,7 @@ namespace Server.Network {
private static ClientVersion m_Version60142 = new ClientVersion( "6.0.14.2" );
private static ClientVersion m_Version7000 = new ClientVersion( "7.0.0.0" );
private static ClientVersion m_Version7090 = new ClientVersion( "7.0.9.0" );
private static ClientVersion m_Version70130 = new ClientVersion( "7.0.13.0" );
private ProtocolChanges _ProtocolChanges;
@ -209,6 +212,7 @@ namespace Server.Network {
ExtendedSupportedFeatures = 0x00000040,
StygianAbyss = 0x00000080,
HighSeas = 0x00000100,
NewCharacterList = 0x00000200,
Version400a = NewSpellbook,
Version407a = Version400a | DamagePacket,
@ -218,7 +222,8 @@ namespace Server.Network {
Version6017 = Version6000 | ContainerGridLines,
Version60142 = Version6017 | ExtendedSupportedFeatures,
Version7000 = Version60142 | StygianAbyss,
Version7090 = Version7000 | HighSeas
Version7090 = Version7000 | HighSeas,
Version70130 = Version7090 | NewCharacterList
}
public bool NewSpellbook { get { return ((_ProtocolChanges & ProtocolChanges.NewSpellbook) != 0); } }
@ -230,6 +235,7 @@ namespace Server.Network {
public bool ExtendedSupportedFeatures { get { return ((_ProtocolChanges & ProtocolChanges.ExtendedSupportedFeatures) != 0); } }
public bool StygianAbyss { get { return ((_ProtocolChanges & ProtocolChanges.StygianAbyss) != 0); } }
public bool HighSeas { get { return ((_ProtocolChanges & ProtocolChanges.HighSeas) != 0); } }
public bool NewCharacterList { get { return ((_ProtocolChanges & ProtocolChanges.NewCharacterList) != 0); } }
public bool IsUOTDClient {
get {

View file

@ -2262,7 +2262,11 @@ namespace Server.Network
state.Send( SupportedFeatures.Instantiate( state ) );
state.Send( new CharacterList( state.Account, state.CityInfo ) );
if ( state.NewCharacterList ) {
state.Send( new CharacterList( state.Account, state.CityInfo ) );
} else {
state.Send( new CharacterListOld( state.Account, state.CityInfo ) );
}
}
else
{

View file

@ -3579,18 +3579,28 @@ namespace Server.Network
{
private string m_City;
private string m_Building;
private int m_Description;
private Point3D m_Location;
private Map m_Map;
public CityInfo( string city, string building, int x, int y, int z, Map m )
public CityInfo( string city, string building, int description, int x, int y, int z, Map m )
{
m_City = city;
m_Building = building;
m_Description = description;
m_Location = new Point3D( x, y, z );
m_Map = m;
}
public CityInfo( string city, string building, int x, int y, int z ) : this( city, building, x, y, z, Map.Trammel )
public CityInfo( string city, string building, int x, int y, int z, Map m ) : this( city, building, 0, x, y, z, m )
{
}
public CityInfo( string city, string building, int description, int x, int y, int z ) : this( city, building, description, x, y, z, Map.Trammel )
{
}
public CityInfo( string city, string building, int x, int y, int z ) : this( city, building, 0, x, y, z, Map.Trammel )
{
}
@ -3618,6 +3628,18 @@ namespace Server.Network
}
}
public int Description
{
get
{
return m_Description;
}
set
{
m_Description = value;
}
}
public int X
{
get
@ -3711,6 +3733,75 @@ namespace Server.Network
public sealed class CharacterList : Packet
{
public CharacterList( IAccount a, CityInfo[] info ) : base( 0xA9 )
{
this.EnsureCapacity( 11 + (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 );
m_Stream.Write( (int) ci.X );
m_Stream.Write( (int) ci.Y );
m_Stream.Write( (int) ci.Z );
m_Stream.Write( (int) ci.Map.MapID );
m_Stream.Write( (int) ci.Description );
m_Stream.Write( (int) 0 );
}
CharacterListFlags flags = ExpansionInfo.CurrentExpansion.CharacterListFlags;
if ( count > 6 )
flags |= (CharacterListFlags.SeventhCharacterSlot | CharacterListFlags.SixthCharacterSlot); // 7th Character Slot - TODO: Is SixthCharacterSlot Required?
else if ( count == 6 )
flags |= CharacterListFlags.SixthCharacterSlot; // 6th Character Slot
else if ( a.Limit == 1 )
flags |= (CharacterListFlags.SlotLimit & CharacterListFlags.OneCharacterSlot); // Limit Characters & One Character
m_Stream.Write( (int)(flags | m_AdditionalFlags) ); // Additional Flags
}
private static CharacterListFlags m_AdditionalFlags;
public static CharacterListFlags AdditionalFlags
{
get{ return m_AdditionalFlags; }
set{ m_AdditionalFlags = value; }
}
}
public sealed class CharacterListOld : Packet
{
public CharacterListOld( IAccount a, CityInfo[] info ) : base( 0xA9 )
{
this.EnsureCapacity( 9 + (a.Length * 60) + (info.Length * 63) );
@ -3759,15 +3850,7 @@ namespace Server.Network
else if ( a.Limit == 1 )
flags |= (CharacterListFlags.SlotLimit & CharacterListFlags.OneCharacterSlot); // Limit Characters & One Character
m_Stream.Write( (int)(flags | m_AdditionalFlags) ); // Additional Flags
}
private static CharacterListFlags m_AdditionalFlags;
public static CharacterListFlags AdditionalFlags
{
get{ return m_AdditionalFlags; }
set{ m_AdditionalFlags = value; }
m_Stream.Write( (int)(flags | CharacterList.AdditionalFlags) ); // Additional Flags
}
}