Skip to content

Commit e9fdd5e

Browse files
authored
Fix unknown data in FriendSystemData packet (jo3bingham#26)
1 parent dd40af0 commit e9fdd5e

2 files changed

Lines changed: 73 additions & 27 deletions

File tree

TibiaAPI/Constants/Enums.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,27 @@ public enum CyclopediaMapDataType
195195
SetCurrentArea = 10
196196
}
197197

198+
public enum FriendSystemDataType
199+
{
200+
SpecialEvent = 0,
201+
InvitationPending = 1,
202+
Friends = 2,
203+
Invitations = 3,
204+
Blacklist = 4,
205+
CharacterSearch = 5,
206+
Badges = 6,
207+
NewFriend = 7,
208+
Config = 8
209+
}
210+
211+
public enum FriendGroup
212+
{
213+
Others = 0,
214+
Contacts = 1,
215+
Friends = 2,
216+
CloseFriends = 3
217+
}
218+
198219
public enum MarketDetailField
199220
{
200221
Armor = 0,

TibiaAPI/Network/ServerPackets/FriendSystemData.cs

Lines changed: 52 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace OXGaming.TibiaAPI.Network.ServerPackets
66
{
77
public class FriendSystemData : ServerPacket
88
{
9-
public byte Type { get; set; }
9+
public FriendSystemDataType DataType { get; set; }
1010

1111
public FriendSystemData(Client client)
1212
{
@@ -16,46 +16,65 @@ public FriendSystemData(Client client)
1616

1717
public override void ParseFromNetworkMessage(NetworkMessage message)
1818
{
19-
// TODO: Figure out Types 0x00 and 0x07 (if they exist),
20-
// and others (if there are any).
21-
Type = message.ReadByte();
22-
if (Type == 0x01) // New Invitations Pending
19+
// TODO: Figure out others DataTypes (if there are any).
20+
// 0x09 and above seem to have no purpose.
21+
DataType = (FriendSystemDataType)message.ReadByte();
22+
if (DataType == FriendSystemDataType.SpecialEvent)
2323
{
24+
var eventType = message.ReadByte();
25+
if (eventType == 0)
26+
{
27+
// Error: You need to set a main character to use this feature. [Cancel]
28+
}
29+
else if (eventType == 1)
30+
{
31+
// Error: text [Ok]
32+
var text = message.ReadString();
33+
}
34+
else if (eventType == 2)
35+
{
36+
// Display "No results." in the search tab
37+
}
38+
else if (eventType >= 3)
39+
{
40+
// Clears the search tab and shows the default text if no results are displayed
41+
// Enables the Invite & Blacklist button if results are displayed
42+
}
2443
}
25-
if (Type == 0x02) // Friends
44+
else if (DataType == FriendSystemDataType.InvitationPending)
45+
{
46+
}
47+
else if (DataType == FriendSystemDataType.Friends)
2648
{
2749
var count = message.ReadUInt16();
2850
for (var i = 0; i < count; ++i)
2951
{
3052
var accountId = message.ReadUInt32();
3153
var playerId = message.ReadUInt32();
3254
var name = message.ReadString();
33-
var unknown = message.ReadUInt16();
55+
var title = message.ReadString();
3456
var world = message.ReadString();
3557
var vocation = message.ReadString();
3658
var level = message.ReadUInt16();
3759
var outfit = message.ReadCreatureOutfit();
38-
var friendshipLevel = message.ReadByte();
60+
var friendshipLevel = (FriendGroup)message.ReadByte();
3961
var timestamp = message.ReadUInt32();
4062
}
4163
}
42-
else if (Type == 0x03) // Invitations
64+
else if (DataType == FriendSystemDataType.Invitations)
4365
{
4466
var count = message.ReadUInt16();
4567
for (var i = 0; i < count; ++i)
4668
{
47-
var unknown = message.ReadByte();
48-
if (unknown == 1)
49-
{
50-
var unknown1 = message.ReadUInt32();
51-
}
69+
var isSentInvitation = message.ReadBool();
70+
var accountId = message.ReadUInt32();
5271
var invitedName = message.ReadString();
53-
var unknown2 = message.ReadUInt16();
72+
var invitedTitle = message.ReadString();
5473
var inviteeName = message.ReadString();
5574
var timestamp = message.ReadUInt32();
5675
}
5776
}
58-
else if (Type == 0x04) // Blacklist
77+
else if (DataType == FriendSystemDataType.Blacklist)
5978
{
6079
var count = message.ReadUInt16();
6180
for (var i = 0; i < count; ++i)
@@ -65,21 +84,23 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
6584
var timestamp = message.ReadUInt32();
6685
}
6786
}
68-
else if (Type == 0x05) // Character Info
87+
else if (DataType == FriendSystemDataType.CharacterSearch)
6988
{
7089
var accountId = message.ReadUInt32();
71-
var unknown = message.ReadUInt16();
90+
var hasPendingInvitation = message.ReadBool();
91+
var isBlacklisted = message.ReadBool();
7292
var isFriend = message.ReadBool();
7393
if (isFriend)
7494
{
75-
var unknown1 = message.ReadByte();
95+
var isOnline = message.ReadBool();
7696
var lastGameLogin = message.ReadUInt32();
77-
var unknown2 = message.ReadBytes(3);
97+
var isPremium = message.ReadBool();
98+
var loyalityTitle = message.ReadString();
7899
var badges = message.ReadByte();
79100
for (var i = 0; i < badges; ++i)
80101
{
81102
var badgeId = message.ReadUInt32();
82-
var badgeName = message.ReadUInt32();
103+
var badgeName = message.ReadString();
83104
}
84105
}
85106
var characters = message.ReadByte();
@@ -88,15 +109,15 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
88109
var playerId = message.ReadUInt32();
89110
var name = message.ReadString();
90111
var isMainCharacter = message.ReadBool();
91-
var unknown3 = message.ReadUInt16();
112+
var title = message.ReadString();
92113
var world = message.ReadString();
93114
var vocation = message.ReadString();
94115
var level = message.ReadUInt16();
95-
var unknown4 = message.ReadByte();
116+
var isOnline = message.ReadBool();
96117
var outfit = message.ReadCreatureOutfit();
97118
}
98119
}
99-
else if (Type == 0x06) // Badges
120+
else if (DataType == FriendSystemDataType.Badges)
100121
{
101122
var count = message.ReadByte();
102123
for (var i = 0; i < count; ++i)
@@ -108,26 +129,30 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
108129
var displayBadge = message.ReadBool();
109130
}
110131
}
111-
else if (Type == 0x08) // Config
132+
else if (DataType == FriendSystemDataType.NewFriend)
133+
{
134+
}
135+
else if (DataType == FriendSystemDataType.Config)
112136
{
113137
var count = message.ReadByte();
114138
for (var i = 0; i < count; ++i)
115139
{
116-
var configId = message.ReadByte();
140+
var configId = (FriendGroup)message.ReadByte();
117141
var showCharacterInfo = message.ReadBool();
118142
var showAccountInfo = message.ReadBool();
119143
var allowInspect = message.ReadBool();
120144
}
121145
}
122146
else
123147
{
124-
throw new Exception($"Invalid Friend System Data: {Type}");
148+
throw new Exception($"Invalid Friend System Data: {DataType}");
125149
}
126150
}
127151

128152
public override void AppendToNetworkMessage(NetworkMessage message)
129153
{
130154
message.Write((byte)ServerPacketType.FriendSystemData);
155+
message.Write((byte)DataType);
131156
}
132157
}
133158
}

0 commit comments

Comments
 (0)