Skip to content

Commit 82d1a2f

Browse files
committed
Add Client member to NetworkMessage class
1 parent 0e07fa3 commit 82d1a2f

29 files changed

Lines changed: 173 additions & 98 deletions

Apps/Extract/Program.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ static void Main(string[] args)
238238
var wholeSize = reader.ReadUInt16();
239239
var sequenceNumber = reader.ReadUInt32();
240240
var packetSize = reader.ReadUInt16();
241-
var outMessage = new NetworkMessage();
242-
var message = new NetworkMessage
241+
var outMessage = new NetworkMessage(client);
242+
var message = new NetworkMessage(client)
243243
{
244244
Size = size
245245
};

Apps/Watch/Program.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.IO;
43
using System.Net;
54
using System.Net.Sockets;
65
using System.Text;
76
using System.Threading;
87

8+
using OXGaming.TibiaAPI;
99
using OXGaming.TibiaAPI.Constants;
1010
using OXGaming.TibiaAPI.Network;
1111
using OXGaming.TibiaAPI.Network.ServerPackets;
@@ -16,6 +16,8 @@ class Program
1616
{
1717
const string OxWorldName = "OXGaming Recording";
1818

19+
static readonly Client _client = new Client();
20+
1921
static uint[] _xteaKey;
2022

2123
static byte[] _clientBuffer;
@@ -277,7 +279,7 @@ static void BeginReceiveWorldNameCallback(IAsyncResult ar)
277279
throw new Exception($"World name does not match {OxWorldName}: {worldName}.");
278280
}
279281

280-
var loginChallengeMessage = new NetworkMessage
282+
var loginChallengeMessage = new NetworkMessage(_client)
281283
{
282284
SequenceNumber = 0
283285
};
@@ -329,7 +331,7 @@ static void BeginReceiveClientCallback(IAsyncResult ar)
329331
count += read;
330332
}
331333

332-
var message = new NetworkMessage();
334+
var message = new NetworkMessage(_client);
333335
message.Seek(0, SeekOrigin.Begin);
334336
message.Write(_clientBuffer);
335337

@@ -378,7 +380,7 @@ static void PlayRecording()
378380
continue;
379381
}
380382

381-
var message = new NetworkMessage
383+
var message = new NetworkMessage(_client)
382384
{
383385
SequenceNumber = sequenceNumber
384386
};

TibiaAPI/Network/ClientPackets/OpenCyclopediaCharacterInfo.cs

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

911
public OpenCyclopediaCharacterInfo(Client client)
@@ -20,13 +22,21 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
2022
}
2123

2224
State = message.ReadByte();
25+
if (State == 3 || State == 4)
26+
{
27+
Unknown = message.ReadUInt32();
28+
}
2329
return true;
2430
}
2531

2632
public override void AppendToNetworkMessage(NetworkMessage message)
2733
{
2834
message.Write((byte)ClientPacketType.OpenCyclopediaCharacterInfo);
2935
message.Write(State);
36+
if (State == 3 || State == 4)
37+
{
38+
message.Write(Unknown);
39+
}
3040
}
3141
}
3242
}

TibiaAPI/Network/Connection.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ public class Connection : Communication, IDisposable
3232
private readonly HttpClient _httpClient = new HttpClient();
3333
private readonly HttpListener _httpListener = new HttpListener();
3434

35-
private readonly NetworkMessage _clientInMessage = new NetworkMessage();
36-
private readonly NetworkMessage _clientOutMessage = new NetworkMessage();
37-
private readonly NetworkMessage _serverInMessage = new NetworkMessage();
38-
private readonly NetworkMessage _serverOutMessage = new NetworkMessage();
35+
private readonly NetworkMessage _clientInMessage;
36+
private readonly NetworkMessage _clientOutMessage;
37+
private readonly NetworkMessage _serverInMessage;
38+
private readonly NetworkMessage _serverOutMessage;
3939

4040
private readonly Queue<byte[]> _clientSendQueue = new Queue<byte[]>();
4141
private readonly Queue<byte[]> _serverSendQueue = new Queue<byte[]>();
@@ -77,7 +77,11 @@ public class Connection : Communication, IDisposable
7777
public Connection(Client client)
7878
{
7979
_client = client ?? throw new ArgumentNullException(nameof(client));
80-
}
80+
_clientInMessage = new NetworkMessage(_client);
81+
_clientOutMessage = new NetworkMessage(_client);
82+
_serverInMessage = new NetworkMessage(_client);
83+
_serverOutMessage = new NetworkMessage(_client);
84+
}
8185

8286
public void SendToClient(ServerPacket packet)
8387
{
@@ -86,7 +90,7 @@ public void SendToClient(ServerPacket packet)
8690
throw new ArgumentNullException(nameof(packet));
8791
}
8892

89-
var message = new NetworkMessage();
93+
var message = new NetworkMessage(_client);
9094
packet.AppendToNetworkMessage(message);
9195
SendToClient(message);
9296
}
@@ -165,7 +169,7 @@ public void SendToServer(ClientPacket packet)
165169
throw new ArgumentNullException(nameof(packet));
166170
}
167171

168-
var message = new NetworkMessage();
172+
var message = new NetworkMessage(_client);
169173
packet.AppendToNetworkMessage(message);
170174
SendToServer(message);
171175
}

TibiaAPI/Network/NetworkMessage.cs

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public class NetworkMessage
4444

4545
private readonly byte[] _buffer = new byte[MaxMessageSize];
4646

47+
private Client _client;
48+
4749
private uint _size = PayloadDataPosition;
4850

4951
/// <value>
@@ -89,8 +91,9 @@ public bool IsCompressed
8991
}
9092
}
9193

92-
public NetworkMessage()
94+
public NetworkMessage(Client client)
9395
{
96+
_client = client ?? throw new ArgumentNullException(nameof(client));
9497
SequenceNumber = ~CompressedFlag;
9598
}
9699

@@ -271,13 +274,13 @@ public Position ReadPosition(int x = -1, int y = -1, int z = -1)
271274
return new Position(x, y, z);
272275
}
273276

274-
public AppearanceInstance ReadMountOutfit(Client client)
277+
public AppearanceInstance ReadMountOutfit()
275278
{
276279
var mountId = ReadUInt16();
277-
return client.AppearanceStorage.CreateOutfitInstance(mountId, 0, 0, 0, 0, 0);
280+
return _client.AppearanceStorage.CreateOutfitInstance(mountId, 0, 0, 0, 0, 0);
278281
}
279282

280-
public AppearanceInstance ReadCreatureOutfit(Client client)
283+
public AppearanceInstance ReadCreatureOutfit()
281284
{
282285
var outfitId = ReadUInt16();
283286
if (outfitId != 0)
@@ -287,18 +290,19 @@ public AppearanceInstance ReadCreatureOutfit(Client client)
287290
var colorLegs = ReadByte();
288291
var colorDetail = ReadByte();
289292
var addons = ReadByte();
290-
return client.AppearanceStorage.CreateOutfitInstance(outfitId, colorHead, colorTorso, colorLegs, colorDetail, addons);
293+
return
294+
_client.AppearanceStorage.CreateOutfitInstance(outfitId, colorHead, colorTorso, colorLegs, colorDetail, addons);
291295
}
292296

293297
var itemId = ReadUInt16();
294298
if (itemId == 0)
295299
{
296-
return client.AppearanceStorage.CreateOutfitInstance(0, 0, 0, 0, 0, 0);
300+
return _client.AppearanceStorage.CreateOutfitInstance(0, 0, 0, 0, 0, 0);
297301
}
298-
return client.AppearanceStorage.CreateObjectInstance(itemId, 0);
302+
return _client.AppearanceStorage.CreateObjectInstance(itemId, 0);
299303
}
300304

301-
public ObjectInstance ReadObjectInstance(Client client, ushort id = 0)
305+
public ObjectInstance ReadObjectInstance(ushort id = 0)
302306
{
303307
if (id == 0)
304308
{
@@ -315,7 +319,7 @@ public ObjectInstance ReadObjectInstance(Client client, ushort id = 0)
315319
throw new Exception($"[NetworkMessage.ReadObjectInstance] Invalid object id: {id}");
316320
}
317321

318-
var objectInstance = client.AppearanceStorage.CreateObjectInstance(id, 0);
322+
var objectInstance = _client.AppearanceStorage.CreateObjectInstance(id, 0);
319323
if (objectInstance == null)
320324
{
321325
throw new Exception($"[NetworkMessage.ReadObjectInstance] Invalid object id: {id}");
@@ -327,6 +331,11 @@ public ObjectInstance ReadObjectInstance(Client client, ushort id = 0)
327331
return objectInstance;
328332
}
329333

334+
if (_client.VersionNumber < 19000000)
335+
{
336+
ReadByte(); // mark
337+
}
338+
330339
if (objectType.Flags.Liquidcontainer || objectType.Flags.Liquidpool || objectType.Flags.Cumulative)
331340
{
332341
objectInstance.Data = ReadByte();
@@ -349,7 +358,7 @@ public ObjectInstance ReadObjectInstance(Client client, ushort id = 0)
349358
return objectInstance;
350359
}
351360

352-
public Creature ReadCreatureInstance(Client client, int id = -1, Position position = null)
361+
public Creature ReadCreatureInstance(int id = -1, Position position = null)
353362
{
354363
if (id == -1)
355364
{
@@ -372,7 +381,7 @@ public Creature ReadCreatureInstance(Client client, int id = -1, Position positi
372381
var removeCreatureId = ReadUInt32();
373382
var creatureId = ReadUInt32();
374383

375-
//creature = (creatureId == client.Player.Id) ? client.Player : new Creature(creatureId);
384+
//creature = (creatureId == _client.Player.Id) ? _client.Player : new Creature(creatureId);
376385
creature = new Creature(creatureId)
377386
{
378387
Type = (CreatureType)ReadByte(),
@@ -387,8 +396,8 @@ public Creature ReadCreatureInstance(Client client, int id = -1, Position positi
387396
creature.Name = ReadString();
388397
creature.HealthPercent = ReadByte();
389398
creature.Direction = (Direction)ReadByte();
390-
creature.Outfit = ReadCreatureOutfit(client);
391-
creature.Mount = ReadMountOutfit(client);
399+
creature.Outfit = ReadCreatureOutfit();
400+
creature.Mount = ReadMountOutfit();
392401
creature.Brightness = ReadByte();
393402
creature.LightColor = ReadByte();
394403
creature.Speed = ReadUInt16();
@@ -417,8 +426,8 @@ public Creature ReadCreatureInstance(Client client, int id = -1, Position positi
417426
Direction = (Direction)ReadByte()
418427
};
419428

420-
creature.Outfit = ReadCreatureOutfit(client);
421-
creature.Mount = ReadMountOutfit(client);
429+
creature.Outfit = ReadCreatureOutfit();
430+
creature.Mount = ReadMountOutfit();
422431
creature.Brightness = ReadByte();
423432
creature.LightColor = ReadByte();
424433
creature.Speed = ReadUInt16();
@@ -569,12 +578,12 @@ public void ReadDailyReward()
569578
}
570579
}
571580

572-
public int ReadField(Client client, int x, int y, int z, List<(Field, Position)> fields)
581+
public int ReadField(int x, int y, int z, List<(Field, Position)> fields)
573582
{
574583
var thingsCount = 0;
575584
var numberOfTilesToSkip = 0;
576585
var mapPosition = new Position(x, y, z);
577-
var absolutePosition = client.WorldMapStorage.ToAbsolute(mapPosition);
586+
var absolutePosition = _client.WorldMapStorage.ToAbsolute(mapPosition);
578587

579588
while (true)
580589
{
@@ -589,21 +598,21 @@ public int ReadField(Client client, int x, int y, int z, List<(Field, Position)>
589598
thingId == (int)CreatureInstanceType.OutdatedCreature ||
590599
thingId == (int)CreatureInstanceType.Creature)
591600
{
592-
var creature = ReadCreatureInstance(client, thingId, absolutePosition);
593-
var objectInstance = client.AppearanceStorage.CreateObjectInstance(99, creature.Id);
601+
var creature = ReadCreatureInstance(thingId, absolutePosition);
602+
var objectInstance = _client.AppearanceStorage.CreateObjectInstance(99, creature.Id);
594603

595604
if (thingsCount < MapSizeW)
596605
{
597-
client.WorldMapStorage.AppendObject(x, y, z, objectInstance);
606+
_client.WorldMapStorage.AppendObject(x, y, z, objectInstance);
598607
}
599608
}
600609
else
601610
{
602-
var objectInstance = ReadObjectInstance(client, thingId);
611+
var objectInstance = ReadObjectInstance(thingId);
603612

604613
if (thingsCount < MapSizeW)
605614
{
606-
client.WorldMapStorage.AppendObject(x, y, z, objectInstance);
615+
_client.WorldMapStorage.AppendObject(x, y, z, objectInstance);
607616
}
608617
else
609618
{
@@ -614,7 +623,7 @@ public int ReadField(Client client, int x, int y, int z, List<(Field, Position)>
614623
thingsCount++;
615624
}
616625

617-
var field = client.WorldMapStorage.GetField(x, y, z);
626+
var field = _client.WorldMapStorage.GetField(x, y, z);
618627
if (field != null)
619628
{
620629
fields.Add((field, absolutePosition));
@@ -623,7 +632,7 @@ public int ReadField(Client client, int x, int y, int z, List<(Field, Position)>
623632
return numberOfTilesToSkip;
624633
}
625634

626-
public int ReadFloor(Client client, int floorNumber, int numberOfTilesToSkip, List<(Field, Position)> fields)
635+
public int ReadFloor(int floorNumber, int numberOfTilesToSkip, List<(Field, Position)> fields)
627636
{
628637
if (floorNumber < 0 || floorNumber >= MapSizeZ)
629638
{
@@ -643,7 +652,7 @@ public int ReadFloor(Client client, int floorNumber, int numberOfTilesToSkip, Li
643652
}
644653
else
645654
{
646-
numberOfTilesToSkip = ReadField(client, currentX, currentY, floorNumber, fields);
655+
numberOfTilesToSkip = ReadField(currentX, currentY, floorNumber, fields);
647656
}
648657
currentY++;
649658
}
@@ -653,15 +662,15 @@ public int ReadFloor(Client client, int floorNumber, int numberOfTilesToSkip, Li
653662
return numberOfTilesToSkip;
654663
}
655664

656-
public int ReadArea(Client client, int startX, int startY, int endX, int endY, List<(Field, Position)> fields)
665+
public int ReadArea(int startX, int startY, int endX, int endY, List<(Field, Position)> fields)
657666
{
658667
var endZ = 0;
659668
var stepZ = 0;
660669
var numberOfTilesToSkip = 0;
661670
var currentX = 0;
662671
var currentY = 0;
663672
var currentZ = 0;
664-
var position = client.WorldMapStorage.GetPosition();
673+
var position = _client.WorldMapStorage.GetPosition();
665674

666675
if (position.Z <= GroundLayer)
667676
{
@@ -690,7 +699,7 @@ public int ReadArea(Client client, int startX, int startY, int endX, int endY, L
690699
}
691700
else
692701
{
693-
numberOfTilesToSkip = ReadField(client, currentX, currentY, currentZ, fields);
702+
numberOfTilesToSkip = ReadField(currentX, currentY, currentZ, fields);
694703
}
695704
currentY++;
696705
}

TibiaAPI/Network/ServerPackets/BottomFloor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
3434

3535
if (position.Z <= (MapMaxZ - UndergroundLayer))
3636
{
37-
message.ReadFloor(Client, 0, 0, Fields);
37+
message.ReadFloor(0, 0, Fields);
3838
}
3939
}
4040
else if (position.Z == (GroundLayer + 1))
@@ -45,7 +45,7 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
4545
var floorNumber = UndergroundLayer;
4646
while (floorNumber >= 0)
4747
{
48-
numberOfTilesToSkip = message.ReadFloor(Client, floorNumber, numberOfTilesToSkip, Fields);
48+
numberOfTilesToSkip = message.ReadFloor(floorNumber, numberOfTilesToSkip, Fields);
4949
floorNumber--;
5050
}
5151
}

TibiaAPI/Network/ServerPackets/BottomRow.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public override bool ParseFromNetworkMessage(NetworkMessage message)
2424
position.Y++;
2525
Client.WorldMapStorage.SetPosition(position.X, position.Y, position.Z);
2626
Client.WorldMapStorage.ScrollMap(0, -1);
27-
message.ReadArea(Client, 0, (MapSizeY - 1), (MapSizeX - 1), (MapSizeY - 1), Fields);
27+
message.ReadArea(0, (MapSizeY - 1), (MapSizeX - 1), (MapSizeY - 1), Fields);
2828
return true;
2929
}
3030

TibiaAPI/Network/ServerPackets/ChangeInContainer.cs

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

2727
ContainerId = message.ReadByte();
2828
Index = message.ReadUInt16();
29-
Item = message.ReadObjectInstance(Client);
29+
Item = message.ReadObjectInstance();
3030
return true;
3131
}
3232

0 commit comments

Comments
 (0)