Skip to content

Commit 3654569

Browse files
authored
Fix unknown data in CyclopediaCharacterInfo packet (jo3bingham#27)
1 parent e9fdd5e commit 3654569

1 file changed

Lines changed: 55 additions & 49 deletions

File tree

TibiaAPI/Network/ServerPackets/CyclopediaCharacterInfo.cs

Lines changed: 55 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ public class CyclopediaCharacterInfo : ServerPacket
4242
public List<(uint Timestamp, string Description, byte Status)> RecentPvpKills { get; } =
4343
new List<(uint Timestamp, string Description, byte Status)>();
4444

45-
public List<(ushort Id, string Name, bool IsPremium, uint Unknown)> Mounts { get; } =
46-
new List<(ushort Id, string Name, bool IsPremium, uint Unknown)>();
47-
public List<(ushort Id, string Name, byte Addons, bool IsPremium, uint Unknown)> Outfits { get; } =
48-
new List<(ushort Id, string Name, byte Addons, bool IsPremium, uint Unknown)>();
45+
public List<(ushort Id, string Name, byte Category, uint Unknown)> Mounts { get; } =
46+
new List<(ushort Id, string Name, byte Category, uint Unknown)>();
47+
public List<(ushort Id, string Name, byte Addons, byte Category, uint Unknown)> Outfits { get; } =
48+
new List<(ushort Id, string Name, byte Addons, byte Category, uint Unknown)>();
4949

5050
public List<(byte Type, ushort Level, ushort Base, ushort Loyalty, ushort Progress)> Skills { get; } =
5151
new List<(byte Type, ushort Level, ushort Base, ushort Loyalty, ushort Progress)>();
@@ -61,18 +61,17 @@ public class CyclopediaCharacterInfo : ServerPacket
6161

6262
public string LoyaltyTitle { get; set; }
6363
public string PlayerName { get; set; }
64+
public String Title { get; set; }
6465
public string Vocation { get; set; }
6566

6667
public ulong Experience { get; set; }
67-
public ulong Unknown4 { get; set; }
6868

6969
public uint CapacityBonus { get; set; }
7070
public uint CapacityCurrent { get; set; }
7171
public uint CapacityMax { get; set; }
7272
public uint RemainingDailyRewardXpBoostTime { get; set; }
7373
public uint RemainingStoreXpBoostTime { get; set; }
74-
public uint Stamina { get; set; }
75-
public uint Unknown3 { get; set; }
74+
public uint TournamentFactor { get; set; }
7675

7776
public ushort AchievementPoints { get; set; }
7877
public ushort Armor { get; set; }
@@ -109,7 +108,9 @@ public class CyclopediaCharacterInfo : ServerPacket
109108
public ushort SecretAchievementsMax { get; set; }
110109
public ushort SpeedBase { get; set; }
111110
public ushort SpeedCurrent { get; set; }
112-
public ushort StoreXpBoost { get; set; }
111+
public ushort Stamina { get; set; }
112+
public ushort StoreXpBoostAddend { get; set; }
113+
public ushort StoreXpBoostTime { get; set; }
113114
public ushort Unknown { get; set; }
114115

115116
public byte AttackType { get; set; }
@@ -120,6 +121,7 @@ public class CyclopediaCharacterInfo : ServerPacket
120121
public byte ConvertedDamageType { get; set; }
121122
public byte CurrentCharacterTitle { get; set; }
122123
public byte DetailColor { get; set; }
124+
public byte Error { get; set; }
123125
public byte HeadColor { get; set; }
124126
public byte InstantRewardAccess { get; set; }
125127
public byte LegsColor { get; set; }
@@ -130,15 +132,12 @@ public class CyclopediaCharacterInfo : ServerPacket
130132
public byte Soul { get; set; }
131133
public byte TorsoColor { get; set; }
132134
public byte Type { get; set; }
133-
public byte Unknown2 { get; set; }
134-
public byte Unknown5 { get; set; }
135-
public byte Unknown6 { get; set; }
136-
public byte Unknown7 { get; set; }
137-
public byte Unknown8 { get; set; }
138-
public byte Unknown9 { get; set; }
139-
public byte Unknown10 { get; set; }
140-
141-
public bool IsUpToDate { get; set; }
135+
136+
public bool HideStamina { get; set; }
137+
public bool IsOnline { get; set; }
138+
public bool IsPremium { get; set; }
139+
public bool ShowAccountInformation { get; set; }
140+
public bool ShowPersonalTabs { get; set; }
142141
public bool ShowStoreXpBoostButton { get; set; }
143142

144143
public CyclopediaCharacterInfo(Client client)
@@ -152,24 +151,28 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
152151
Type = message.ReadByte();
153152
if (Client.VersionNumber >= 12158493)
154153
{
155-
IsUpToDate = message.ReadBool();
156-
if (IsUpToDate)
154+
Error = message.ReadByte();
155+
if (Error != 0)
157156
{
157+
// 1: No data available at the moment.
158+
// 2: You are not allowed to see this character's data.
159+
// 3: You are not allowed to inspect this character.
158160
return;
159161
}
160162
}
161-
if (Type == 0)
163+
if (Type == 0) // Basic Information
162164
{
163165
PlayerName = message.ReadString();
164166
Vocation = message.ReadString();
165167
LevelDisplay = message.ReadUInt16();
166168
Outfit = message.ReadCreatureOutfit();
167-
Unknown2 = message.ReadByte();
169+
// This may also indicate Tournament characters
170+
HideStamina = message.ReadBool();
168171
if (Client.VersionNumber >= 12200000)
169172
{
170-
Unknown5 = message.ReadByte();
171-
Unknown6 = message.ReadByte();
172-
Unknown7 = message.ReadByte();
173+
// Shows the Story Summary and Character Titles tabs
174+
ShowPersonalTabs = message.ReadBool();
175+
Title = message.ReadString();
173176
}
174177
}
175178
else if (Type == 1) // Character Stats
@@ -178,18 +181,19 @@ public override void ParseFromNetworkMessage(NetworkMessage message)
178181
Level = message.ReadUInt16();
179182
LevelPercent = message.ReadByte();
180183
BaseXpGain = message.ReadUInt16();
184+
TournamentFactor = message.ReadUInt32();
181185
GrindingAddend = message.ReadUInt16();
182-
StoreXpBoost = message.ReadUInt16();
186+
StoreXpBoostAddend = message.ReadUInt16();
183187
HuntingBoostFactor = message.ReadUInt16();
184-
Food = message.ReadUInt16();
185-
Unknown3 = message.ReadUInt32();
188+
StoreXpBoostTime = message.ReadUInt16();
186189
ShowStoreXpBoostButton = message.ReadBool();
187190
HealthCurrent = message.ReadUInt16();
188191
HealthMax = message.ReadUInt16();
189192
ManaCurrent = message.ReadUInt16();
190193
ManaMax = message.ReadUInt16();
191194
Soul = message.ReadByte();
192-
Stamina = message.ReadUInt32();
195+
Stamina = message.ReadUInt16();
196+
Food = message.ReadUInt16();
193197
OfflineTrainingTime = message.ReadUInt16();
194198
SpeedCurrent = message.ReadUInt16();
195199
SpeedBase = message.ReadUInt16();
@@ -316,9 +320,10 @@ void ParseItems(List<(ushort, uint)> items)
316320
var id = message.ReadUInt16();
317321
var name = message.ReadString();
318322
var addons = message.ReadByte();
319-
var isPremium = message.ReadBool();
323+
// 0 = Standard, 1 = Quest, 2 = Store
324+
var category = message.ReadByte();
320325
var unknown = message.ReadUInt32();
321-
Outfits.Add((id, name, addons, isPremium, unknown));
326+
Outfits.Add((id, name, addons, category, unknown));
322327
}
323328
HeadColor = message.ReadByte();
324329
TorsoColor = message.ReadByte();
@@ -330,9 +335,10 @@ void ParseItems(List<(ushort, uint)> items)
330335
{
331336
var id = message.ReadUInt16();
332337
var name = message.ReadString();
333-
var isPremium = message.ReadBool();
338+
// 0 = Standard, 1 = Quest, 2 = Store
339+
var category = message.ReadByte();
334340
var unknown = message.ReadUInt32();
335-
Mounts.Add((id, name, isPremium, unknown));
341+
Mounts.Add((id, name, category, unknown));
336342
}
337343
}
338344
else if (Type == 8) // Store Summary
@@ -406,11 +412,11 @@ void ParseItems(List<(ushort, uint)> items)
406412
}
407413
else if (Type == 10) // Badges
408414
{
409-
Unknown8 = message.ReadByte();
410-
if (Unknown8 != 0)
415+
ShowAccountInformation = message.ReadBool();
416+
if (ShowAccountInformation)
411417
{
412-
Unknown9 = message.ReadByte();
413-
Unknown10 = message.ReadByte();
418+
IsOnline = message.ReadBool();
419+
IsPremium = message.ReadBool();
414420
LoyaltyTitle = message.ReadString();
415421
Badges.Capacity = message.ReadByte();
416422
for (var i = 0; i < Badges.Capacity; ++i)
@@ -443,8 +449,8 @@ public override void AppendToNetworkMessage(NetworkMessage message)
443449
message.Write(Type);
444450
if (Client.VersionNumber >= 12158493)
445451
{
446-
message.Write(IsUpToDate);
447-
if (IsUpToDate)
452+
message.Write(Error);
453+
if (Error != 0)
448454
{
449455
return;
450456
}
@@ -463,12 +469,11 @@ public override void AppendToNetworkMessage(NetworkMessage message)
463469
message.Write((ushort)0);
464470
message.Write((ushort)Outfit.Id);
465471
}
466-
message.Write(Unknown2);
472+
message.Write(HideStamina);
467473
if (Client.VersionNumber > 12200000)
468474
{
469-
message.Write(Unknown5);
470-
message.Write(Unknown6);
471-
message.Write(Unknown7);
475+
message.Write(ShowPersonalTabs);
476+
message.Write(Title);
472477
}
473478
}
474479
else if (Type == 1)
@@ -477,18 +482,19 @@ public override void AppendToNetworkMessage(NetworkMessage message)
477482
message.Write(Level);
478483
message.Write(LevelPercent);
479484
message.Write(BaseXpGain);
485+
message.Write(TournamentFactor);
480486
message.Write(GrindingAddend);
481-
message.Write(StoreXpBoost);
487+
message.Write(StoreXpBoostAddend);
482488
message.Write(HuntingBoostFactor);
483-
message.Write(Food);
484-
message.Write(Unknown3);
489+
message.Write(StoreXpBoostTime);
485490
message.Write(ShowStoreXpBoostButton);
486491
message.Write(HealthCurrent);
487492
message.Write(HealthMax);
488493
message.Write(ManaCurrent);
489494
message.Write(ManaMax);
490495
message.Write(Soul);
491496
message.Write(Stamina);
497+
message.Write(Food);
492498
message.Write(OfflineTrainingTime);
493499
message.Write(SpeedCurrent);
494500
message.Write(SpeedBase);
@@ -731,11 +737,11 @@ void AppendItems(List<(ushort id, uint amount)> items)
731737
}
732738
else if (Type == 10) // Badges
733739
{
734-
message.Write(Unknown8);
735-
if (Unknown8 != 0)
740+
message.Write(ShowAccountInformation);
741+
if (ShowAccountInformation)
736742
{
737-
message.Write(Unknown9);
738-
message.Write(Unknown10);
743+
message.Write(IsOnline);
744+
message.Write(IsPremium);
739745
message.Write(LoyaltyTitle);
740746
var count = Math.Min(Badges.Count, byte.MaxValue);
741747
message.Write((byte)count);

0 commit comments

Comments
 (0)