Skip to content

Commit 76aac9a

Browse files
authored
Protocol changes in Tibia 12.08.7995 (jo3bingham#19)
* Add new TransactionDetails server packet * Add changes to TransactionHistory server packet * Add changes to DepotTileState server packet * Add changes to NpcOffer server packet * Add new GetTransactionDetails client packet Read data from RemoveGraphicalEffects server packet Parse Login client packet * Update nuget packages * Fix InspectObject unknown byte * Fix issue where zlib inflate would fail on login * Add support for connecting to Tibia11+ Open-Tibia servers
1 parent a67704f commit 76aac9a

15 files changed

Lines changed: 397 additions & 111 deletions

Apps/Record/Program.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Program
1515

1616
static BinaryWriter _binaryWriter;
1717

18+
static string _loginWebService = string.Empty;
1819
static string _tibiaDirectory = string.Empty;
1920

2021
static int _httpPort = 80;
@@ -51,6 +52,12 @@ static void ParseArgs(string[] args)
5152
}
5253
}
5354
break;
55+
case "-l":
56+
case "--login":
57+
{
58+
_loginWebService = splitArg[1];
59+
}
60+
break;
5461
default:
5562
break;
5663
}
@@ -80,7 +87,7 @@ static void Main(string[] args)
8087
client.Connection.OnReceivedServerMessage += Proxy_OnReceivedServerMessage;
8188

8289
// Disable packet parsing as we only care about the raw, decrypted packets and speed.
83-
client.StartConnection(enablePacketParsing: false, httpPort: _httpPort);
90+
client.StartConnection(enablePacketParsing: false, httpPort: _httpPort, loginWebService: _loginWebService);
8491

8592
while (Console.ReadLine() != "quit")
8693
{

TibiaAPI/Client.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ public Client(string tibiaDirectory = "")
4040
Connection = new Network.Connection(this);
4141
}
4242

43-
public bool StartConnection(bool enablePacketParsing = true, int httpPort = 80)
43+
public bool StartConnection(bool enablePacketParsing = true, int httpPort = 80, string loginWebService = "")
4444
{
45-
return Connection.Start(enablePacketParsing, httpPort);
45+
return Connection.Start(enablePacketParsing, httpPort, loginWebService);
4646
}
4747

4848
public void StopConnection()

TibiaAPI/Constants/Enums.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ public enum ClientPacketType
348348
InviteToChannel = 0xAB,
349349
ExcludeFromChannel = 0xAC,
350350
Cancel = 0xBE,
351+
GetTransactionDetails = 0xC9,
351352
UpdateExivaOptions = 0xCA,
352353
BrowseField = 0xCB,
353354
SeekInContainer = 0xCC,
@@ -497,6 +498,7 @@ public enum ServerPacketType
497498
Outfit = 0xC8,
498499
ExivaSuppressed = 0xC9,
499500
UpdateExivaOptions = 0xCA,
501+
TransactionDetails = 0xCB,
500502
ImpactTracking = 0xCC,
501503
MarketStatistics = 0xCD,
502504
ItemWasted = 0xCE,
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using OXGaming.TibiaAPI.Constants;
2+
3+
namespace OXGaming.TibiaAPI.Network.ClientPackets
4+
{
5+
public class GetTransactionDetails : ClientPacket
6+
{
7+
public uint Id { get; set; }
8+
9+
public GetTransactionDetails(Client client)
10+
{
11+
Client = client;
12+
PacketType = ClientPacketType.GetTransactionDetails;
13+
}
14+
15+
public override bool ParseFromNetworkMessage(NetworkMessage message)
16+
{
17+
if (message.ReadByte() != (byte)ClientPacketType.GetTransactionDetails)
18+
{
19+
return false;
20+
}
21+
22+
Id = message.ReadUInt32();
23+
return true;
24+
}
25+
26+
public override void AppendToNetworkMessage(NetworkMessage message)
27+
{
28+
message.Write((byte)ClientPacketType.GetTransactionDetails);
29+
message.Write(Id);
30+
}
31+
}
32+
}

TibiaAPI/Network/ClientPackets/InspectObject.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ public class InspectObject : ClientPacket
99

1010
public ushort ObjectId { get; set; }
1111

12+
public byte Data { get; set; }
1213
public byte InspectionType { get; set; }
13-
public byte Unknown { get; set; }
1414

1515
public InspectObject(Client client)
1616
{
@@ -29,8 +29,7 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
2929
if (InspectionType == 3) // Cyclopedia
3030
{
3131
ObjectId = message.ReadUInt16();
32-
// TODO: Figure out this unknown. Always 0 in my tests. Probably "data".
33-
Unknown = message.ReadByte();
32+
Data = message.ReadByte();
3433
}
3534
else
3635
{
@@ -46,7 +45,7 @@ public override void AppendToNetworkMessage(NetworkMessage message)
4645
if (InspectionType == 3)
4746
{
4847
message.Write(ObjectId);
49-
message.Write(Unknown);
48+
message.Write(Data);
5049
}
5150
else
5251
{

TibiaAPI/Network/ClientPackets/Login.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.IO;
34

45
using OXGaming.TibiaAPI.Constants;
56

@@ -42,7 +43,8 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
4243
ClientVersion = message.ReadUInt32();
4344
DatRevision = message.ReadUInt16();
4445
ClientPreviewState = message.ReadByte();
45-
46+
47+
var rsaStartPosition = message.Position;
4648
if (message.ReadByte() != 0)
4749
{
4850
throw new Exception("[ClientPackets.Login.ParseFromNetworkMessage] RSA decryption failed.");
@@ -53,12 +55,17 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
5355
{
5456
XteaKey.Add(message.ReadUInt32());
5557
}
58+
Client.Connection.SetXteaKey(XteaKey);
5659

5760
IsGameMaster = message.ReadBool();
5861
SessionKey = message.ReadString();
5962
CharacterName = message.ReadString();
6063
ChallengeTimeStamp = message.ReadUInt32();
6164
ChallengeRandom = message.ReadByte();
65+
66+
// Skip the RSA encryption junk data.
67+
var rsaEndPosition = message.Position;
68+
message.Seek((int)(128 - (rsaStartPosition - rsaEndPosition)), SeekOrigin.Current);
6269
return true;
6370
}
6471

TibiaAPI/Network/Communication.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.IO;
34
using System.Linq;
45

56
using OXGaming.TibiaAPI.Constants;
@@ -82,6 +83,7 @@ public class Communication
8283
public event ReceivedPacketEventHandler OnReceivedClientInviteToChannelPacket;
8384
public event ReceivedPacketEventHandler OnReceivedClientExcludeFromChannelPacket;
8485
public event ReceivedPacketEventHandler OnReceivedClientCancelPacket;
86+
public event ReceivedPacketEventHandler OnReceivedClientGetTransactionDetailsPacket;
8587
public event ReceivedPacketEventHandler OnReceivedClientUpdateExivaOptionsPacket;
8688
public event ReceivedPacketEventHandler OnReceivedClientBrowseFieldPacket;
8789
public event ReceivedPacketEventHandler OnReceivedClientSeekInContainerPacket;
@@ -227,6 +229,7 @@ public class Communication
227229
public event ReceivedPacketEventHandler OnReceivedServerOutfitPacket;
228230
public event ReceivedPacketEventHandler OnReceivedServerExivaSuppressedPacket;
229231
public event ReceivedPacketEventHandler OnReceivedServerUpdateExivaOptionsPacket;
232+
public event ReceivedPacketEventHandler OnReceivedServerTransactionDetailsPacket;
230233
public event ReceivedPacketEventHandler OnReceivedServerImpactTrackingPacket;
231234
public event ReceivedPacketEventHandler OnReceivedServerMarketStatisticsPacket;
232235
public event ReceivedPacketEventHandler OnReceivedServerItemWastedPacket;
@@ -299,6 +302,17 @@ public void ParseClientMessage(Client client, NetworkMessage inMessage, NetworkM
299302

300303
try
301304
{
305+
// This may possibly be a Login packet. In that case, we have to move to the correct position
306+
// as the Login packet doesn't contain the 2 bytes for the payload size as other packets.
307+
if (inMessage.SequenceNumber == 0)
308+
{
309+
inMessage.Seek(6, SeekOrigin.Begin);
310+
if (inMessage.PeekByte() != (byte)ClientPacketType.Login)
311+
{
312+
inMessage.Seek(2, SeekOrigin.Current);
313+
}
314+
}
315+
302316
while (inMessage.Position < inMessage.Size)
303317
{
304318
packetPosition = inMessage.Position;
@@ -1241,6 +1255,19 @@ public void ParseClientMessage(Client client, NetworkMessage inMessage, NetworkM
12411255
}
12421256
}
12431257
break;
1258+
case ClientPacketType.GetTransactionDetails:
1259+
{
1260+
var packet = new ClientPackets.GetTransactionDetails(client);
1261+
if (packet.ParseFromNetworkMessage(inMessage))
1262+
{
1263+
packet.Forward = OnReceivedClientGetTransactionDetailsPacket?.Invoke(packet) ?? true;
1264+
if (packet.Forward)
1265+
{
1266+
packet.AppendToNetworkMessage(outMessage);
1267+
}
1268+
}
1269+
}
1270+
break;
12441271
case ClientPacketType.UpdateExivaOptions:
12451272
{
12461273
var packet = new ClientPackets.UpdateExivaOptions(client);
@@ -3164,6 +3191,19 @@ public void ParseServerMessage(Client client, NetworkMessage inMessage, NetworkM
31643191
}
31653192
}
31663193
break;
3194+
case ServerPacketType.TransactionDetails:
3195+
{
3196+
var packet = new ServerPackets.TransactionDetails(client);
3197+
if (packet.ParseFromNetworkMessage(inMessage))
3198+
{
3199+
packet.Forward = OnReceivedServerTransactionDetailsPacket?.Invoke(packet) ?? true;
3200+
if (packet.Forward)
3201+
{
3202+
packet.AppendToNetworkMessage(outMessage);
3203+
}
3204+
}
3205+
}
3206+
break;
31673207
case ServerPacketType.ImpactTracking:
31683208
{
31693209
var packet = new ServerPackets.ImpactTracking(client);

0 commit comments

Comments
 (0)