Skip to content

Commit aa0dac4

Browse files
committed
Add backwards compatibilty for older client protocols
1 parent 8ef8b78 commit aa0dac4

14 files changed

Lines changed: 245 additions & 44 deletions

TibiaAPI/Network/Communication.cs

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ public class Communication
243243
public event ReceivedPacketEventHandler OnReceivedServerCyclopediaCharacterInfoPacket;
244244
public event ReceivedPacketEventHandler OnReceivedServerTutorialHintPacket;
245245
public event ReceivedPacketEventHandler OnReceivedServerCyclopediaMapDataPacket;
246+
public event ReceivedPacketEventHandler OnReceivedServerAutomapFlagPacket;
246247
public event ReceivedPacketEventHandler OnReceivedServerDailyRewardCollectionStatePacket;
247248
public event ReceivedPacketEventHandler OnReceivedServerCreditBalancePacket;
248249
public event ReceivedPacketEventHandler OnReceivedServerIngameShopErrorPacket;
@@ -273,6 +274,7 @@ public class Communication
273274
public event ReceivedPacketEventHandler OnReceivedServerMarketBrowsePacket;
274275
public event ReceivedPacketEventHandler OnReceivedServerShowModalDialogPacket;
275276
public event ReceivedPacketEventHandler OnReceivedServerStoreCategoriesPacket;
277+
public event ReceivedPacketEventHandler OnReceivedServerPremiumShopPacket;
276278
public event ReceivedPacketEventHandler OnReceivedServerStoreOffersPacket;
277279
public event ReceivedPacketEventHandler OnReceivedServerTransactionHistoryPacket;
278280
public event ReceivedPacketEventHandler OnReceivedServerStoreSuccessPacket;
@@ -3358,13 +3360,28 @@ public void ParseServerMessage(Client client, NetworkMessage inMessage, NetworkM
33583360
break;
33593361
case ServerPacketType.CyclopediaMapData:
33603362
{
3361-
var packet = new ServerPackets.CyclopediaMapData(client);
3362-
if (packet.ParseFromNetworkMessage(inMessage))
3363+
if (client.VersionNumber >= 11800000)
33633364
{
3364-
packet.Forward = OnReceivedServerCyclopediaMapDataPacket?.Invoke(packet) ?? true;
3365-
if (packet.Forward)
3365+
var packet = new ServerPackets.CyclopediaMapData(client);
3366+
if (packet.ParseFromNetworkMessage(inMessage))
33663367
{
3367-
packet.AppendToNetworkMessage(outMessage);
3368+
packet.Forward = OnReceivedServerCyclopediaMapDataPacket?.Invoke(packet) ?? true;
3369+
if (packet.Forward)
3370+
{
3371+
packet.AppendToNetworkMessage(outMessage);
3372+
}
3373+
}
3374+
}
3375+
else
3376+
{
3377+
var packet = new ServerPackets.AutomapFlag(client);
3378+
if (packet.ParseFromNetworkMessage(inMessage))
3379+
{
3380+
packet.Forward = OnReceivedServerAutomapFlagPacket?.Invoke(packet) ?? true;
3381+
if (packet.Forward)
3382+
{
3383+
packet.AppendToNetworkMessage(outMessage);
3384+
}
33683385
}
33693386
}
33703387
}
@@ -3748,13 +3765,28 @@ public void ParseServerMessage(Client client, NetworkMessage inMessage, NetworkM
37483765
break;
37493766
case ServerPacketType.StoreCategories:
37503767
{
3751-
var packet = new ServerPackets.StoreCategories(client);
3752-
if (packet.ParseFromNetworkMessage(inMessage))
3768+
if (client.VersionNumber >= 11600000)
37533769
{
3754-
packet.Forward = OnReceivedServerStoreCategoriesPacket?.Invoke(packet) ?? true;
3755-
if (packet.Forward)
3770+
var packet = new ServerPackets.StoreCategories(client);
3771+
if (packet.ParseFromNetworkMessage(inMessage))
37563772
{
3757-
packet.AppendToNetworkMessage(outMessage);
3773+
packet.Forward = OnReceivedServerStoreCategoriesPacket?.Invoke(packet) ?? true;
3774+
if (packet.Forward)
3775+
{
3776+
packet.AppendToNetworkMessage(outMessage);
3777+
}
3778+
}
3779+
}
3780+
else
3781+
{
3782+
var packet = new ServerPackets.PremiumShop(client);
3783+
if (packet.ParseFromNetworkMessage(inMessage))
3784+
{
3785+
packet.Forward = OnReceivedServerPremiumShopPacket?.Invoke(packet) ?? true;
3786+
if (packet.Forward)
3787+
{
3788+
packet.AppendToNetworkMessage(outMessage);
3789+
}
37583790
}
37593791
}
37603792
}

TibiaAPI/Network/NetworkMessage.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ public ObjectInstance ReadObjectInstance(ushort id = 0)
331331
return objectInstance;
332332
}
333333

334-
if (_client.VersionNumber < 11900000)
334+
if (_client.VersionNumber < 11887288)
335335
{
336336
objectInstance.Mark = ReadByte();
337337
}
@@ -341,7 +341,7 @@ public ObjectInstance ReadObjectInstance(ushort id = 0)
341341
objectInstance.Data = ReadByte();
342342
}
343343

344-
if (objectType.Flags.Container)
344+
if (_client.VersionNumber >= 11506055 && objectType.Flags.Container)
345345
{
346346
objectInstance.IsLootContainer = ReadBool();
347347
if (objectInstance.IsLootContainer)
@@ -606,7 +606,7 @@ public int ReadField(int x, int y, int z, List<(Field, Position)> fields)
606606
if (!hasSetEnvironmentalEffect)
607607
{
608608
hasSetEnvironmentalEffect = true;
609-
if (_client.VersionNumber < 11900000)
609+
if (_client.VersionNumber < 11880000)
610610
{
611611
continue;
612612
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using OXGaming.TibiaAPI.Constants;
2+
using OXGaming.TibiaAPI.Utilities;
3+
4+
namespace OXGaming.TibiaAPI.Network.ServerPackets
5+
{
6+
public class AutomapFlag : ServerPacket
7+
{
8+
public Position Position { get; set; }
9+
10+
public string Description { get; set; }
11+
12+
public byte IconId { get; set; }
13+
14+
public AutomapFlag(Client client)
15+
{
16+
Client = client;
17+
PacketType = ServerPacketType.CyclopediaMapData;
18+
}
19+
20+
public override bool ParseFromNetworkMessage(NetworkMessage message)
21+
{
22+
if (message.ReadByte() != (byte)ServerPacketType.CyclopediaMapData)
23+
{
24+
return false;
25+
}
26+
27+
Position = message.ReadPosition();
28+
IconId = message.ReadByte();
29+
Description = message.ReadString();
30+
return true;
31+
}
32+
33+
public override void AppendToNetworkMessage(NetworkMessage message)
34+
{
35+
message.Write((byte)ServerPacketType.CyclopediaMapData);
36+
message.Write(Position);
37+
message.Write(IconId);
38+
message.Write(Description);
39+
}
40+
}
41+
}

TibiaAPI/Network/ServerPackets/GraphicalEffects.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
4343
{
4444
var tilesToMove = message.ReadByte();
4545
}
46+
else if (type == 2)
47+
{
48+
message.ReadUInt16();
49+
}
4650
else if (type == 3)
4751
{
4852
var effectId = message.ReadByte();

TibiaAPI/Network/ServerPackets/MonsterCyclopediaNewDetails.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
2323

2424
RaceId = message.ReadUInt16();
2525

26-
if (Client.VersionNumber < 11900000)
26+
if (Client.VersionNumber < 11900000 && Client.VersionNumber > 11596424)
2727
{
2828
_unknown = message.ReadBytes(3);
2929
}

TibiaAPI/Network/ServerPackets/MoveCreature.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace OXGaming.TibiaAPI.Network.ServerPackets
55
{
66
public class MoveCreature : ServerPacket
77
{
8-
public Position FromPosition { get; set; }
8+
public Position FromPosition { get; set; } = new Position(0xFFFF, 0xFFFF, 7);
99
public Position ToPosition { get; set; }
1010

1111
public uint CreatureId { get; set; }

TibiaAPI/Network/ServerPackets/Outfit.cs

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
4343
Addons = message.ReadByte();
4444
MountId = message.ReadUInt16();
4545

46-
Outfits.Capacity = message.ReadUInt16();
46+
Outfits.Capacity = Client.VersionNumber >= 11750000 ? message.ReadUInt16() : message.ReadByte();
4747
for (var i = 0; i < Outfits.Capacity; ++i)
4848
{
4949
var id = message.ReadUInt16();
5050
var name = message.ReadString();
5151
var addons = message.ReadByte();
52-
var enableStoreLink = message.ReadBool();
52+
var enableStoreLink = Client.VersionNumber >= 11750000 ? message.ReadBool() : false;
5353
uint storeOfferId = 0;
5454
if (enableStoreLink)
5555
{
@@ -58,12 +58,12 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
5858
Outfits.Add((id, name, addons, enableStoreLink, storeOfferId));
5959
}
6060

61-
Mounts.Capacity = message.ReadUInt16();
61+
Mounts.Capacity = Client.VersionNumber >= 11750000 ? message.ReadUInt16() : message.ReadByte();
6262
for (var i = 0; i < Mounts.Capacity; ++i)
6363
{
6464
var id = message.ReadUInt16();
6565
var name = message.ReadString();
66-
var enableStoreLink = message.ReadBool();
66+
var enableStoreLink = Client.VersionNumber >= 11750000 ? message.ReadBool(): false;
6767
uint storeOfferId = 0;
6868
if (enableStoreLink)
6969
{
@@ -72,7 +72,7 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
7272
Mounts.Add((id, name, enableStoreLink, storeOfferId));
7373
}
7474

75-
WindowType = (OutfitWindowType)message.ReadUInt16();
75+
WindowType = Client.VersionNumber >= 11750000 ? (OutfitWindowType)message.ReadUInt16() : OutfitWindowType.SelectOutfit;
7676
return true;
7777
}
7878

@@ -87,34 +87,64 @@ public override void AppendToNetworkMessage(NetworkMessage message)
8787
message.Write(Addons);
8888
message.Write(MountId);
8989

90-
var count = Math.Min(Outfits.Count, byte.MaxValue);
91-
message.Write((byte)count);
90+
var count = 0;
91+
if (Client.VersionNumber >= 11750000)
92+
{
93+
count = Math.Min(Outfits.Count, ushort.MaxValue);
94+
message.Write((ushort)count);
95+
}
96+
else
97+
{
98+
count = Math.Min(Outfits.Count, byte.MaxValue);
99+
message.Write((byte)count);
100+
}
101+
92102
for (var i = 0; i < count; ++i)
93103
{
94104
var outfit = Outfits[i];
95105
message.Write(outfit.Id);
96106
message.Write(outfit.Name);
97107
message.Write(outfit.Addons);
98-
message.Write(outfit.EnableStoreLink);
99-
if (outfit.EnableStoreLink)
108+
if (Client.VersionNumber >= 11750000)
100109
{
101-
message.Write(outfit.StoreOfferId);
110+
message.Write(outfit.EnableStoreLink);
111+
if (outfit.EnableStoreLink)
112+
{
113+
message.Write(outfit.StoreOfferId);
114+
}
102115
}
103116
}
104117

105-
count = Math.Min(Mounts.Count, byte.MaxValue);
106-
message.Write((byte)count);
118+
if (Client.VersionNumber >= 11750000)
119+
{
120+
count = Math.Min(Mounts.Count, ushort.MaxValue);
121+
message.Write((ushort)count);
122+
}
123+
else
124+
{
125+
count = Math.Min(Mounts.Count, byte.MaxValue);
126+
message.Write((byte)count);
127+
}
128+
107129
for (var i = 0; i < count; ++i)
108130
{
109-
var mount = Mounts[i];
110-
message.Write(mount.Id);
111-
message.Write(mount.Name);
112-
message.Write(mount.EnableStoreLink);
113-
if (mount.EnableStoreLink)
131+
var (Id, Name, EnableStoreLink, StoreOfferId) = Mounts[i];
132+
message.Write(Id);
133+
message.Write(Name);
134+
if (Client.VersionNumber >= 11750000)
114135
{
115-
message.Write(mount.StoreOfferId);
136+
message.Write(EnableStoreLink);
137+
if (EnableStoreLink)
138+
{
139+
message.Write(StoreOfferId);
140+
}
116141
}
117142
}
143+
144+
if (Client.VersionNumber >= 11750000)
145+
{
146+
message.Write((ushort)WindowType);
147+
}
118148
}
119149
}
120150
}

TibiaAPI/Network/ServerPackets/PlayerDataCurrent.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public class PlayerDataCurrent : ServerPacket
77
public ulong Experience { get; set; }
88

99
public uint FreeCapacity { get; set; }
10+
public uint MaxCapacity { get; set; }
1011

1112
public ushort BaseXpGain { get; set; }
1213
public ushort CurrentHealth { get; set; }
@@ -47,6 +48,10 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
4748
CurrentHealth = message.ReadUInt16();
4849
MaxHealth = message.ReadUInt16();
4950
FreeCapacity = message.ReadUInt32();
51+
if (Client.VersionNumber <= 11496030)
52+
{
53+
MaxCapacity = message.ReadUInt32();
54+
}
5055
Experience = message.ReadUInt64();
5156
Level = message.ReadUInt16();
5257
LevelPercent = message.ReadByte();
@@ -82,6 +87,10 @@ public override void AppendToNetworkMessage(NetworkMessage message)
8287
message.Write(CurrentHealth);
8388
message.Write(MaxHealth);
8489
message.Write(FreeCapacity);
90+
if (Client.VersionNumber <= 11496030)
91+
{
92+
message.Write(MaxCapacity);
93+
}
8594
message.Write(Experience);
8695
message.Write(Level);
8796
message.Write(LevelPercent);

TibiaAPI/Network/ServerPackets/PlayerSkills.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,11 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
6565
ManaLeechChance = (message.ReadUInt16(), message.ReadUInt16());
6666
ManaLeechAmount = (message.ReadUInt16(), message.ReadUInt16());
6767

68-
MaxCapacity = message.ReadUInt32();
69-
BonusCapacity = message.ReadUInt32();
68+
if (Client.VersionNumber >= 11506055)
69+
{
70+
MaxCapacity = message.ReadUInt32();
71+
BonusCapacity = message.ReadUInt32();
72+
}
7073
return true;
7174
}
7275

@@ -155,8 +158,11 @@ public override void AppendToNetworkMessage(NetworkMessage message)
155158
message.Write(ManaLeechAmount.Level);
156159
message.Write(ManaLeechAmount.Base);
157160

158-
message.Write(MaxCapacity);
159-
message.Write(BonusCapacity);
161+
if (Client.VersionNumber >= 11506055)
162+
{
163+
message.Write(MaxCapacity);
164+
message.Write(BonusCapacity);
165+
}
160166
}
161167
}
162168
}

TibiaAPI/Network/ServerPackets/PlayerState.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,28 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
1919
return false;
2020
}
2121

22-
State = message.ReadUInt32();
22+
if (Client.VersionNumber >= 11400000)
23+
{
24+
State = message.ReadUInt32();
25+
}
26+
else
27+
{
28+
State = message.ReadUInt16();
29+
}
2330
return true;
2431
}
2532

2633
public override void AppendToNetworkMessage(NetworkMessage message)
2734
{
2835
message.Write((byte)ServerPacketType.PlayerState);
29-
message.Write(State);
36+
if (Client.VersionNumber >= 11400000)
37+
{
38+
message.Write(State);
39+
}
40+
else
41+
{
42+
message.Write((ushort)State);
43+
}
3044
}
3145
}
3246
}

0 commit comments

Comments
 (0)