Skip to content

Commit 566d301

Browse files
authored
New protocol changes since 12.31.9667 (jo3bingham#30)
* New protocol changes since 12.31.9667 * Add changes to Append methods * Remove duplicate Player declaration from Client * Address unknown PreyData type * Manually control sequence number in Watch app
1 parent 945f4ba commit 566d301

6 files changed

Lines changed: 191 additions & 60 deletions

File tree

Apps/Watch/Program.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,13 +384,14 @@ static void PlayRecording()
384384
{
385385
var lastTimestamp = 0L;
386386
var version = reader.ReadString();
387+
var sequenceNumber = 0U;
387388
while (reader.BaseStream.Position < reader.BaseStream.Length && !_userQuit)
388389
{
389390
var packetType = (PacketType)reader.ReadByte();
390391
var timestamp = reader.ReadInt64();
391392
var size = reader.ReadUInt32();
392393
var packetSize = reader.ReadUInt16();
393-
var sequenceNumber = reader.ReadUInt32();
394+
var _sequenceNumber = reader.ReadUInt32();
394395
var data = reader.ReadBytes((int)size - 6);
395396

396397
if (packetType == PacketType.Client || data[2] == (byte)ServerPacketType.LoginChallenge)
@@ -400,7 +401,7 @@ static void PlayRecording()
400401

401402
var message = new NetworkMessage(_client)
402403
{
403-
SequenceNumber = sequenceNumber
404+
SequenceNumber = sequenceNumber++
404405
};
405406
message.Write(data, 2, (uint)(data.Length - 2));
406407

TibiaAPI/Client.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ public class Client : IDisposable
2020

2121
public Utilities.Logger Logger { get; } = new Utilities.Logger();
2222

23-
public Creatures.Creature Player { get; } = new Creatures.Creature(0);
24-
2523
public string Version { get; private set; }
2624

2725
public uint VersionNumber { get; private set; } = 0;

TibiaAPI/Constants/Enums.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ public enum PreyDataState
129129
Active = 2,
130130
Selection = 3,
131131
SelectionChangeMonster = 4,
132+
ListSelection = 5,
132133
WildcardSelection = 6
133134
}
134135

TibiaAPI/Network/ServerPackets/CreatureUpdate.cs

Lines changed: 147 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace OXGaming.TibiaAPI.Network.ServerPackets
77
{
88
public class CreatureUpdate : ServerPacket
99
{
10-
public Creature OutdatedCreature { get; set; }
10+
public Creature Creature { get; set; }
1111

1212
public uint CreatureId { get; set; }
1313

@@ -25,44 +25,90 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
2525
{
2626
CreatureId = message.ReadUInt32();
2727
Type = message.ReadByte();
28-
if (Type == 0x00) // Outdated Creature
28+
if (Type == 0x00)
2929
{
3030
var id = message.ReadUInt16();
31-
if (id == (ushort)CreatureInstanceType.OutdatedCreature)
31+
if (id == (ushort)CreatureInstanceType.UnknownCreature)
3232
{
33+
var removeCreatureId = message.ReadUInt32();
3334
var creatureId = message.ReadUInt32();
34-
OutdatedCreature = Client.CreatureStorage.GetCreature(creatureId);
35-
if (OutdatedCreature == null)
35+
36+
Creature = (creatureId == Client.Player.Id) ? Client.Player : new Creature(creatureId);
37+
Creature.RemoveCreatureId = removeCreatureId;
38+
Creature.Type = (Constants.CreatureType)message.ReadByte();
39+
Creature.InstanceType = (CreatureInstanceType)id;
40+
Creature = Client.CreatureStorage.ReplaceCreature(Creature, Creature.RemoveCreatureId);
41+
if (Creature == null)
42+
{
43+
throw new Exception("[NetworkMessage.ReadCreatureInstance] Failed to append creature.");
44+
}
45+
46+
if (Creature.IsSummon)
47+
{
48+
Creature.SummonerCreatureId = message.ReadUInt32();
49+
}
50+
51+
Creature.Name = message.ReadString();
52+
Creature.HealthPercent = message.ReadByte();
53+
Creature.Direction = (Direction)message.ReadByte();
54+
Creature.Outfit = message.ReadCreatureOutfit();
55+
Creature.Mount = message.ReadMountOutfit();
56+
Creature.Brightness = message.ReadByte();
57+
Creature.LightColor = message.ReadByte();
58+
Creature.Speed = message.ReadUInt16();
59+
Creature.PkFlag = message.ReadByte();
60+
Creature.PartyFlag = message.ReadByte();
61+
Creature.GuildFlag = message.ReadByte();
62+
63+
Creature.Type = (Constants.CreatureType)message.ReadByte();
64+
if (Creature.Type == Constants.CreatureType.Player)
65+
{
66+
Creature.Vocation = message.ReadByte();
67+
}
68+
else if (Creature.IsSummon)
69+
{
70+
Creature.SummonerCreatureId = message.ReadUInt32();
71+
}
72+
73+
Creature.SpeechCategory = message.ReadByte();
74+
Creature.Mark = message.ReadByte();
75+
Creature.InspectionState = message.ReadByte();
76+
Creature.IsUnpassable = message.ReadBool();
77+
}
78+
else if (id == (ushort)CreatureInstanceType.OutdatedCreature)
79+
{
80+
var creatureId = message.ReadUInt32();
81+
Creature = Client.CreatureStorage.GetCreature(creatureId);
82+
if (Creature == null)
3683
{
3784
throw new Exception("[CreatureUpdate.ParseFromNetworkMessage] Outdated creature not found.");
3885
}
3986

40-
OutdatedCreature.InstanceType = (CreatureInstanceType)id;
41-
OutdatedCreature.HealthPercent = message.ReadByte();
42-
OutdatedCreature.Direction = (Direction)message.ReadByte();
43-
OutdatedCreature.Outfit = message.ReadCreatureOutfit();
44-
OutdatedCreature.Mount = message.ReadMountOutfit();
45-
OutdatedCreature.Brightness = message.ReadByte();
46-
OutdatedCreature.LightColor = message.ReadByte();
47-
OutdatedCreature.Speed = message.ReadUInt16();
48-
OutdatedCreature.PkFlag = message.ReadByte();
49-
OutdatedCreature.PartyFlag = message.ReadByte();
50-
OutdatedCreature.GuildFlag = message.ReadByte();
87+
Creature.InstanceType = (CreatureInstanceType)id;
88+
Creature.HealthPercent = message.ReadByte();
89+
Creature.Direction = (Direction)message.ReadByte();
90+
Creature.Outfit = message.ReadCreatureOutfit();
91+
Creature.Mount = message.ReadMountOutfit();
92+
Creature.Brightness = message.ReadByte();
93+
Creature.LightColor = message.ReadByte();
94+
Creature.Speed = message.ReadUInt16();
95+
Creature.PkFlag = message.ReadByte();
96+
Creature.PartyFlag = message.ReadByte();
5197

52-
OutdatedCreature.Type = (Constants.CreatureType)message.ReadByte();
53-
if (OutdatedCreature.Type == Constants.CreatureType.Player)
98+
Creature.Type = (Constants.CreatureType)message.ReadByte();
99+
if (Creature.Type == Constants.CreatureType.Player)
54100
{
55-
OutdatedCreature.Vocation = message.ReadByte();
101+
Creature.Vocation = message.ReadByte();
56102
}
57-
else if (OutdatedCreature.IsSummon)
103+
else if (Creature.IsSummon)
58104
{
59-
OutdatedCreature.SummonerCreatureId = message.ReadUInt32();
105+
Creature.SummonerCreatureId = message.ReadUInt32();
60106
}
61107

62-
OutdatedCreature.SpeechCategory = message.ReadByte();
63-
OutdatedCreature.Mark = message.ReadByte();
64-
OutdatedCreature.InspectionState = message.ReadByte();
65-
OutdatedCreature.IsUnpassable = message.ReadBool();
108+
Creature.SpeechCategory = message.ReadByte();
109+
Creature.Mark = message.ReadByte();
110+
Creature.InspectionState = message.ReadByte();
111+
Creature.IsUnpassable = message.ReadBool();
66112
}
67113
}
68114
else if (Type == 0x0B) // ManaPercent
@@ -80,43 +126,94 @@ public override void AppendToNetworkMessage(NetworkMessage message)
80126
message.Write((byte)ServerPacketType.CreatureUpdate);
81127
message.Write(CreatureId);
82128
message.Write(Type);
83-
if (Type == 0x00 && OutdatedCreature != null) // Outdated Creature
129+
if (Type == 0x00 && Creature != null)
84130
{
85-
message.Write((ushort)OutdatedCreature.InstanceType);
86-
if (OutdatedCreature.InstanceType == CreatureInstanceType.OutdatedCreature)
131+
message.Write((ushort)Creature.InstanceType);
132+
if (Creature.InstanceType == CreatureInstanceType.UnknownCreature)
133+
{
134+
message.Write(Creature.RemoveCreatureId);
135+
message.Write(Creature.Id);
136+
message.Write((byte)Creature.Type);
137+
if (Creature.IsSummon)
138+
{
139+
message.Write(Creature.SummonerCreatureId);
140+
}
141+
142+
message.Write(Creature.Name);
143+
message.Write(Creature.HealthPercent);
144+
message.Write((byte)Creature.Direction);
145+
146+
if (Creature.Outfit is OutfitInstance)
147+
{
148+
message.Write((OutfitInstance)Creature.Outfit);
149+
}
150+
else
151+
{
152+
message.Write((ushort)0);
153+
message.Write((ushort)Creature.Outfit.Id);
154+
}
155+
156+
message.Write((ushort)Creature.Mount.Id);
157+
message.Write(Creature.Brightness);
158+
message.Write(Creature.LightColor);
159+
message.Write(Creature.Speed);
160+
message.Write(Creature.PkFlag);
161+
message.Write(Creature.PartyFlag);
162+
message.Write(Creature.GuildFlag);
163+
164+
message.Write((byte)Creature.Type);
165+
if (Creature.Type == Constants.CreatureType.Player)
166+
{
167+
message.Write(Creature.Vocation);
168+
}
169+
else if (Creature.IsSummon)
170+
{
171+
message.Write(Creature.SummonerCreatureId);
172+
}
173+
174+
message.Write(Creature.SpeechCategory);
175+
message.Write(Creature.Mark);
176+
message.Write(Creature.InspectionState);
177+
if (Client.VersionNumber < 11900000)
178+
{
179+
message.Write(Creature.PvpHelpers);
180+
}
181+
message.Write(Creature.IsUnpassable);
182+
}
183+
else if (Creature.InstanceType == CreatureInstanceType.OutdatedCreature)
87184
{
88-
message.Write(OutdatedCreature.Id);
89-
message.Write(OutdatedCreature.HealthPercent);
90-
message.Write((byte)OutdatedCreature.Direction);
91-
if (OutdatedCreature.Outfit is OutfitInstance)
185+
message.Write(Creature.Id);
186+
message.Write(Creature.HealthPercent);
187+
message.Write((byte)Creature.Direction);
188+
if (Creature.Outfit is OutfitInstance)
92189
{
93-
message.Write((OutfitInstance)OutdatedCreature.Outfit);
190+
message.Write((OutfitInstance)Creature.Outfit);
94191
}
95192
else
96193
{
97194
message.Write((ushort)0);
98-
message.Write((ushort)OutdatedCreature.Outfit.Id);
195+
message.Write((ushort)Creature.Outfit.Id);
99196
}
100-
message.Write((ushort)OutdatedCreature.Mount.Id);
101-
message.Write(OutdatedCreature.Brightness);
102-
message.Write(OutdatedCreature.LightColor);
103-
message.Write(OutdatedCreature.Speed);
104-
message.Write(OutdatedCreature.PkFlag);
105-
message.Write(OutdatedCreature.PartyFlag);
106-
message.Write(OutdatedCreature.GuildFlag);
107-
message.Write((byte)OutdatedCreature.Type);
108-
if (OutdatedCreature.Type == Constants.CreatureType.Player)
197+
message.Write((ushort)Creature.Mount.Id);
198+
message.Write(Creature.Brightness);
199+
message.Write(Creature.LightColor);
200+
message.Write(Creature.Speed);
201+
message.Write(Creature.PkFlag);
202+
message.Write(Creature.PartyFlag);
203+
message.Write(Creature.GuildFlag);
204+
message.Write((byte)Creature.Type);
205+
if (Creature.Type == Constants.CreatureType.Player)
109206
{
110-
message.Write(OutdatedCreature.Vocation);
207+
message.Write(Creature.Vocation);
111208
}
112-
else if (OutdatedCreature.IsSummon)
209+
else if (Creature.IsSummon)
113210
{
114-
message.Write(OutdatedCreature.SummonerCreatureId);
211+
message.Write(Creature.SummonerCreatureId);
115212
}
116-
message.Write(OutdatedCreature.SpeechCategory);
117-
message.Write(OutdatedCreature.Mark);
118-
message.Write(OutdatedCreature.InspectionState);
119-
message.Write(OutdatedCreature.IsUnpassable);
213+
message.Write(Creature.SpeechCategory);
214+
message.Write(Creature.Mark);
215+
message.Write(Creature.InspectionState);
216+
message.Write(Creature.IsUnpassable);
120217
}
121218
}
122219
else if (Type == 0x0B) // ManaPercent

TibiaAPI/Network/ServerPackets/DepotSearchDetailList.cs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,25 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
3333
for (var i = 0; i < DepotDisplayItems.Capacity; ++i)
3434
{
3535
var itemId = message.ReadUInt16();
36-
var amount = message.ReadByte();
36+
// This may actually be a stackable check instead of a client version check; need to verify.
37+
var amount = Client.VersionNumber < 12319667 ? message.ReadByte() : byte.MinValue;
3738
DepotDisplayItems.Add((itemId, amount));
3839
}
3940
InboxItemCount = message.ReadUInt32();
4041
InboxDisplayItems.Capacity = message.ReadByte();
4142
for (var i = 0; i < InboxDisplayItems.Capacity; ++i)
4243
{
4344
var itemId = message.ReadUInt16();
44-
var amount = message.ReadByte();
45+
// This may actually be a stackable check instead of a client version check; need to verify.
46+
var amount = Client.VersionNumber < 12319667 ? message.ReadByte() : byte.MinValue;
4547
InboxDisplayItems.Add((itemId, amount));
4648
}
4749
ContainsSupplyStashItem = message.ReadBool();
4850
if (ContainsSupplyStashItem)
4951
{
5052
var itemId = message.ReadUInt16();
51-
var amount = message.ReadUInt32();
53+
// This may actually be a stackable check instead of a client version check; need to verify.
54+
var amount = Client.VersionNumber < 12319667 ? message.ReadByte() : byte.MinValue;
5255
SupplyStashItem = (itemId, amount);
5356
}
5457
}
@@ -63,7 +66,11 @@ public override void AppendToNetworkMessage(NetworkMessage message)
6366
{
6467
var (itemId, amount) = DepotDisplayItems[i];
6568
message.Write(itemId);
66-
message.Write(amount);
69+
// This may actually be a stackable check instead of a client version check; need to verify.
70+
if (Client.VersionNumber < 12319667)
71+
{
72+
message.Write(amount);
73+
}
6774
}
6875
message.Write(InboxItemCount);
6976
count = Math.Min(InboxDisplayItems.Count, byte.MaxValue);
@@ -72,13 +79,21 @@ public override void AppendToNetworkMessage(NetworkMessage message)
7279
{
7380
var (itemId, amount) = InboxDisplayItems[i];
7481
message.Write(itemId);
75-
message.Write(amount);
82+
// This may actually be a stackable check instead of a client version check; need to verify.
83+
if (Client.VersionNumber < 12319667)
84+
{
85+
message.Write(amount);
86+
}
7687
}
7788
message.Write(ContainsSupplyStashItem);
7889
if (ContainsSupplyStashItem)
7990
{
8091
message.Write(SupplyStashItem.ItemId);
81-
message.Write(SupplyStashItem.Amount);
92+
// This may actually be a stackable check instead of a client version check; need to verify.
93+
if (Client.VersionNumber < 12319667)
94+
{
95+
message.Write(SupplyStashItem.Amount);
96+
}
8297
}
8398
}
8499
}

TibiaAPI/Network/ServerPackets/PreyData.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
8484
}
8585
}
8686
break;
87+
case PreyDataState.ListSelection:
88+
{
89+
RaceIds.Capacity = message.ReadUInt16();
90+
for (var i = 0; i < RaceIds.Capacity; ++i)
91+
{
92+
RaceIds.Add(message.ReadUInt16());
93+
}
94+
}
95+
break;
8796
case PreyDataState.WildcardSelection:
8897
{
8998
BonusType = message.ReadByte(); // 0 = damage, 1 = defense, 2 = exp, 3 = loot
@@ -186,6 +195,16 @@ public override void AppendToNetworkMessage(NetworkMessage message)
186195
}
187196
}
188197
break;
198+
case PreyDataState.ListSelection:
199+
{
200+
var count = Math.Min(RaceIds.Count, ushort.MaxValue);
201+
message.Write((ushort)count);
202+
for (var i = 0; i < count; ++i)
203+
{
204+
message.Write(RaceIds[i]);
205+
}
206+
}
207+
break;
189208
case PreyDataState.WildcardSelection:
190209
{
191210
message.Write(BonusType);

0 commit comments

Comments
 (0)