Skip to content

Commit 759304a

Browse files
committed
Enable appending of most packets with unknowns
There are still a lot of unknowns throughout both client and server packets. However, some of these unknowns are simple enough that they can still be used to append a packet to a NetworkMessage. This commit also fixes the RSA start position in the Watch app, and includes a various few other tweaks.
1 parent 7c70536 commit 759304a

21 files changed

Lines changed: 554 additions & 492 deletions

Apps/Watch/Program.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,11 @@ static void BeginReceiveClientCallback(IAsyncResult ar)
354354
message.Seek(0, SeekOrigin.Begin);
355355
message.Write(_clientBuffer);
356356

357+
var rsaStartIndex = _client.VersionNumber >= 124010030 ? 31 : 18;
357358
var rsa = new Rsa();
358-
rsa.OpenTibiaDecrypt(message, 18);
359-
message.Seek(18, SeekOrigin.Begin);
359+
rsa.OpenTibiaDecrypt(message, rsaStartIndex);
360+
361+
message.Seek(rsaStartIndex, SeekOrigin.Begin);
360362
if (message.ReadByte() != 0)
361363
{
362364
throw new Exception("RSA decryption failed.");

TibiaAPI/Network/ClientPackets/CyclopediaHouseAction.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ namespace OXGaming.TibiaAPI.Network.ClientPackets
44
{
55
public class CyclopediaHouseAction : ClientPacket
66
{
7+
public byte UnknownByte1 { get; set; }
8+
79
public string Town { get; set; }
810

911
public CyclopediaHouseAction(Client client)
@@ -15,16 +17,15 @@ public CyclopediaHouseAction(Client client)
1517
public override void ParseFromNetworkMessage(NetworkMessage message)
1618
{
1719
// TODO
18-
message.ReadByte(); //always 0x00?
20+
UnknownByte1 = message.ReadByte(); //always 0x00?
1921
Town = message.ReadString();
2022
}
2123

2224
public override void AppendToNetworkMessage(NetworkMessage message)
2325
{
24-
// TODO
25-
// message.Write((byte)ClientPacketType.CyclopediaHouseAction);
26-
// //message.Write(Unknown);
27-
// message.Write(Town);
26+
message.Write((byte)ClientPacketType.CyclopediaHouseAction);
27+
message.Write(UnknownByte1);
28+
message.Write(Town);
2829
}
2930
}
3031
}

TibiaAPI/Network/ClientPackets/FeatureEvent.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ namespace OXGaming.TibiaAPI.Network.ClientPackets
44
{
55
public class FeatureEvent : ClientPacket
66
{
7+
public uint UnknownUInt1 { get; set; }
8+
79
public byte EventType { get; set; }
810

911
public bool ShowWindow { get; set; }
@@ -21,20 +23,19 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
2123
if (!ShowWindow)
2224
{
2325
// TODO
24-
message.ReadUInt32();
26+
UnknownUInt1 = message.ReadUInt32();
2527
}
2628
}
2729

2830
public override void AppendToNetworkMessage(NetworkMessage message)
2931
{
30-
// TODO
31-
// message.Write((byte)ClientPacketType.FeatureEvent);
32-
// message.Write(EventType);
33-
// message.Write(ShowWindow);
34-
// if (!ShowWindow)
35-
// {
36-
// //message.Write(Unknown);
37-
// }
32+
message.Write((byte)ClientPacketType.FeatureEvent);
33+
message.Write(EventType);
34+
message.Write(ShowWindow);
35+
if (!ShowWindow)
36+
{
37+
message.Write(UnknownUInt1);
38+
}
3839
}
3940
}
4041
}

TibiaAPI/Network/ClientPackets/LootContainer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
4242
}
4343
else
4444
{
45-
throw new System.Exception($"[LootContainer.ParseFromNetworkMessage] Invalid type: {Type}");
45+
Client.Logger.Error($"[LootContainer.ParseFromNetworkMessage] Invalid type: {Type}");
4646
}
4747
}
4848

TibiaAPI/Network/ClientPackets/SetOutfit.cs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ namespace OXGaming.TibiaAPI.Network.ClientPackets
44
{
55
public class SetOutfit : ClientPacket
66
{
7+
public byte UnknownByte1 { get; set; }
8+
79
public ushort MountId { get; set; }
810
public ushort OutfitId { get; set; }
911

@@ -24,7 +26,7 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
2426
if (Client.VersionNumber >= 12209066)
2527
{
2628
// TODO
27-
message.ReadByte();
29+
UnknownByte1 = message.ReadByte();
2830
}
2931
OutfitId = message.ReadUInt16();
3032
HeadColor = message.ReadByte();
@@ -37,18 +39,17 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
3739

3840
public override void AppendToNetworkMessage(NetworkMessage message)
3941
{
40-
// TODO
41-
// message.Write((byte)ClientPacketType.SetOutfit);
42-
// if (Client.VersionNumber >= 12209066)
43-
// {
44-
// // message.Write(Unknown);
45-
// }
46-
// message.Write(OutfitId);
47-
// message.Write(HeadColor);
48-
// message.Write(TorsoColor);
49-
// message.Write(LegsColor);
50-
// message.Write(DetailColor);
51-
// message.Write(MountId);
42+
message.Write((byte)ClientPacketType.SetOutfit);
43+
if (Client.VersionNumber >= 12209066)
44+
{
45+
message.Write(UnknownByte1);
46+
}
47+
message.Write(OutfitId);
48+
message.Write(HeadColor);
49+
message.Write(TorsoColor);
50+
message.Write(LegsColor);
51+
message.Write(DetailColor);
52+
message.Write(MountId);
5253
}
5354
}
5455
}

TibiaAPI/Network/ClientPackets/StashAction.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using OXGaming.TibiaAPI.Constants;
2-
using OXGaming.TibiaAPI.Network.ServerPackets;
32
using OXGaming.TibiaAPI.Utilities;
43

54
namespace OXGaming.TibiaAPI.Network.ClientPackets

TibiaAPI/Network/ClientPackets/TrackBestiaryRace.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ namespace OXGaming.TibiaAPI.Network.ClientPackets
44
{
55
public class TrackBestiaryRace : ClientPacket
66
{
7+
public byte UnknownByte1 { get; set; }
8+
79
public ushort RaceId { get; set; }
10+
811
public TrackBestiaryRace(Client client)
912
{
1013
Client = client;
@@ -14,14 +17,15 @@ public TrackBestiaryRace(Client client)
1417
public override void ParseFromNetworkMessage(NetworkMessage message)
1518
{
1619
RaceId = message.ReadUInt16();
17-
message.ReadByte(); // TODO
20+
// TODO
21+
UnknownByte1 = message.ReadByte();
1822
}
1923

2024
public override void AppendToNetworkMessage(NetworkMessage message)
2125
{
22-
// TODO
23-
// message.Write((byte)ClientPacketType.TrackBestiaryRace);
24-
// message.Write(RaceId);
26+
message.Write((byte)ClientPacketType.TrackBestiaryRace);
27+
message.Write(RaceId);
28+
message.Write(UnknownByte1);
2529
}
2630
}
2731
}

TibiaAPI/Network/NetworkMessage.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -656,9 +656,9 @@ public int ReadField(int x, int y, int z, List<(int, List<ObjectInstance>, Posit
656656
while (true)
657657
{
658658
var thingId = ReadUInt16();
659-
if (thingId >= 65280)
659+
if (thingId >= 0xFF00)
660660
{
661-
numberOfTilesToSkip = thingId - 65280;
661+
numberOfTilesToSkip = thingId - 0xFF00;
662662
break;
663663
}
664664

TibiaAPI/Network/ServerPackets/CreatureUpdate.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ namespace OXGaming.TibiaAPI.Network.ServerPackets
77
{
88
public class CreatureUpdate : ServerPacket
99
{
10+
// TODO
11+
public byte UnknownByte1 { get; set; }
12+
1013
public Creature Creature { get; set; }
1114

1215
public uint CreatureId { get; set; }
1316

1417
public byte ManaPercent { get; set; }
1518
public byte Type { get; set; }
1619

17-
// TODO
18-
public byte Unknown { get; set; }
19-
2020
public CreatureUpdate(Client client)
2121
{
2222
Client = client;
@@ -132,7 +132,7 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
132132
// TODO
133133
else if (Type == 0x0C) // Unknown
134134
{
135-
Unknown = message.ReadByte();
135+
UnknownByte1 = message.ReadByte();
136136
}
137137
}
138138

@@ -250,7 +250,7 @@ public override void AppendToNetworkMessage(NetworkMessage message)
250250
// TODO
251251
else if (Type == 0x0C) // Unknown
252252
{
253-
message.Write(Unknown);
253+
message.Write(UnknownByte1);
254254
}
255255
}
256256
}

TibiaAPI/Network/ServerPackets/InspectionList.cs

Lines changed: 67 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ namespace OXGaming.TibiaAPI.Network.ServerPackets
88
{
99
public class InspectionList : ServerPacket
1010
{
11+
public byte UnknownByte1 { get; set; }
12+
1113
public List<(string Name, byte Slot, ObjectInstance Item, List<ushort> ImbuementIds, List<(string Name, string Description)> Details)> Items { get; } =
1214
new List<(string Name, byte Slot, ObjectInstance Item, List<ushort> ImbuementIds, List<(string Name, string Description)> Details)>();
1315
public List<(string Name, string Description)> PlayerDetails { get; } = new List<(string Name, string Description)>();
@@ -26,19 +28,19 @@ public InspectionList(Client client)
2628

2729
public override void ParseFromNetworkMessage(NetworkMessage message)
2830
{
31+
IsPlayer = message.ReadBool();
32+
2933
if (Client.VersionNumber >= 12300000)
3034
{
3135
// TODO
32-
message.ReadByte();
36+
UnknownByte1 = message.ReadByte();
3337
}
3438

35-
IsPlayer = message.ReadBool();
36-
3739
Items.Capacity = message.ReadByte();
3840
for (var i = 0; i < Items.Capacity; ++i)
3941
{
40-
var itemName = message.ReadString();
4142
var slotId = IsPlayer ? message.ReadByte() : (byte)0;
43+
var itemName = message.ReadString();
4244
var item = message.ReadObjectInstance();
4345

4446
var imbuementIds = new List<ushort>(message.ReadByte());
@@ -76,67 +78,67 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
7678
public override void AppendToNetworkMessage(NetworkMessage message)
7779
{
7880
// TODO
79-
// message.Write((byte)ServerPacketType.InspectionList);
80-
81-
// if (Client.VersionNumber >= 12300000)
82-
// {
83-
// //message.Write(Unknown);
84-
// }
85-
86-
// message.Write(IsPlayer);
87-
88-
// var count = Math.Min(Items.Count, byte.MaxValue);
89-
// message.Write((byte)count);
90-
// for (var i = 0; i < count; ++i)
91-
// {
92-
// var (Name, Slot, Item, ImbuementIds, Details) = Items[i];
93-
94-
// message.Write(Name);
95-
96-
// if (IsPlayer)
97-
// {
98-
// message.Write(Slot);
99-
// }
100-
101-
// message.Write(Item);
102-
103-
// var size = Math.Min(ImbuementIds.Count, byte.MaxValue);
104-
// message.Write((byte)size);
105-
// for (var j = 0; j < size; ++j)
106-
// {
107-
// message.Write(ImbuementIds[j]);
108-
// }
109-
110-
// size = Math.Min(Details.Count, byte.MaxValue);
111-
// message.Write((byte)size);
112-
// for (var j = 0; j < size; ++j)
113-
// {
114-
// message.Write(Details[j].Name);
115-
// message.Write(Details[j].Description);
116-
// }
117-
// }
118-
119-
// if (IsPlayer)
120-
// {
121-
// message.Write(PlayerName);
122-
// if (PlayerOutfit is OutfitInstance)
123-
// {
124-
// message.Write((OutfitInstance)PlayerOutfit);
125-
// }
126-
// else
127-
// {
128-
// message.Write((ushort)0);
129-
// message.Write((ushort)PlayerOutfit.Id);
130-
// }
131-
132-
// count = Math.Min(PlayerDetails.Count, byte.MaxValue);
133-
// message.Write((byte)count);
134-
// for (var j = 0; j < count; ++j)
135-
// {
136-
// message.Write(PlayerDetails[j].Name);
137-
// message.Write(PlayerDetails[j].Description);
138-
// }
139-
// }
81+
message.Write((byte)ServerPacketType.InspectionList);
82+
83+
message.Write(IsPlayer);
84+
85+
if (Client.VersionNumber >= 12300000)
86+
{
87+
message.Write(UnknownByte1);
88+
}
89+
90+
var count = Math.Min(Items.Count, byte.MaxValue);
91+
message.Write((byte)count);
92+
for (var i = 0; i < count; ++i)
93+
{
94+
var (Name, Slot, Item, ImbuementIds, Details) = Items[i];
95+
96+
message.Write(Name);
97+
98+
if (IsPlayer)
99+
{
100+
message.Write(Slot);
101+
}
102+
103+
message.Write(Item);
104+
105+
var size = Math.Min(ImbuementIds.Count, byte.MaxValue);
106+
message.Write((byte)size);
107+
for (var j = 0; j < size; ++j)
108+
{
109+
message.Write(ImbuementIds[j]);
110+
}
111+
112+
size = Math.Min(Details.Count, byte.MaxValue);
113+
message.Write((byte)size);
114+
for (var j = 0; j < size; ++j)
115+
{
116+
message.Write(Details[j].Name);
117+
message.Write(Details[j].Description);
118+
}
119+
}
120+
121+
if (IsPlayer)
122+
{
123+
message.Write(PlayerName);
124+
if (PlayerOutfit is OutfitInstance instance)
125+
{
126+
message.Write(instance);
127+
}
128+
else
129+
{
130+
message.Write((ushort)0);
131+
message.Write((ushort)PlayerOutfit.Id);
132+
}
133+
134+
count = Math.Min(PlayerDetails.Count, byte.MaxValue);
135+
message.Write((byte)count);
136+
for (var j = 0; j < count; ++j)
137+
{
138+
message.Write(PlayerDetails[j].Name);
139+
message.Write(PlayerDetails[j].Description);
140+
}
141+
}
140142
}
141143
}
142144
}

0 commit comments

Comments
 (0)