Skip to content

Commit b97dcda

Browse files
committed
Add 5.5.0 opcode handlers
SMSG_ALL_ACHIEVEMENT_DATA SMSG_ALL_ACCOUNT_CRITERIA SMSG_RESPOND_INSPECT_ACHIEVEMENTS SMSG_AUTH_RESPONSE SMSG_SETUP_CURRENCY SMSG_SET_CURRENCY SMSG_RESET_WEEKLY_CURRENCY SMSG_PHASE_SHIFT_CHANGE SMSG_WAIT_QUEUE_UPDATE SMSG_WAIT_QUEUE_FINISH SMSG_WARDEN3_DATA
1 parent a32acd0 commit b97dcda

8 files changed

Lines changed: 408 additions & 3 deletions

File tree

WowPacketParser/Enums/Version/V5_5_0_61735/Opcodes.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ public static BiDictionary<Opcode, int> Opcodes(Direction direction)
858858
{ Opcode.SMSG_AURA_POINTS_DEPLETED, 0x520012 },
859859
{ Opcode.SMSG_AURA_UPDATE, 0x520011 },
860860
{ Opcode.SMSG_AUTH_CHALLENGE, 0x430000 },
861-
{ Opcode.SMSG_AUTH_FAILED, 0x3C0000 },
861+
{ Opcode.SMSG_AUTH_FAILED, 0x3C0000 }, // NYI
862862
{ Opcode.SMSG_AUTH_RESPONSE, 0x3C0001 },
863863
{ Opcode.SMSG_AVAILABLE_HOTFIXES, 0x400001 },
864864
{ Opcode.SMSG_BACKPACK_DEFAULT_SIZE_CHANGED, 0x3C0328 },
@@ -1427,7 +1427,7 @@ public static BiDictionary<Opcode, int> Opcodes(Direction direction)
14271427
{ Opcode.SMSG_MAP_OBJECTIVES_INIT, 0x42002E },
14281428
{ Opcode.SMSG_MASTER_LOOT_CANDIDATE_LIST, 0x3C00BB },
14291429
{ Opcode.SMSG_MEETING_STONE_FAILED, 0x3C031A },
1430-
{ Opcode.SMSG_MESSAGE_BOX, 0x3C000A },
1430+
{ Opcode.SMSG_MESSAGE_BOX, 0x3C000A }, // NYI
14311431
{ Opcode.SMSG_MINIMAP_PING, 0x3C016D },
14321432
{ Opcode.SMSG_MIRROR_IMAGE_COMPONENTED_DATA, 0x520004 },
14331433
{ Opcode.SMSG_MIRROR_IMAGE_CREATURE_DATA, 0x520003 },

WowPacketParserModule.V5_5_0_61735/Parser/AchievementHandler.cs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,50 @@ namespace WowPacketParserModule.V5_5_0_61735.Parsers
88
{
99
public static class AchievementHandler
1010
{
11+
public static void ReadEarnedAchievement(Packet packet, params object[] idx)
12+
{
13+
packet.ReadInt32<AchievementId>("Id", idx);
14+
packet.ReadPackedTime("Date", idx);
15+
packet.ReadPackedGuid128("Owner", idx);
16+
packet.ReadInt32("VirtualRealmAddress", idx);
17+
packet.ReadInt32("NativeRealmAddress", idx);
18+
}
19+
20+
public static void ReadCriteriaProgress(Packet packet, params object[] indexes)
21+
{
22+
var criteriaId = packet.ReadInt32<CriteriaId>("CriteriaID", indexes);
23+
var quantity = packet.ReadUInt64("Quantity", indexes);
24+
packet.ReadPackedGuid128("PlayerGUID", indexes);
25+
packet.ReadInt32("Unused_10_1_5", indexes);
26+
packet.ReadInt32("Flags", indexes);
27+
packet.ReadPackedTime("CurrentTime", indexes);
28+
packet.ReadTime64("ElapsedTime", indexes);
29+
packet.ReadTime64("CreationTime", indexes);
30+
31+
packet.ResetBitReader();
32+
33+
var hasDynamicID = packet.ReadBit("HasDynamicID", indexes);
34+
if (hasDynamicID)
35+
packet.ReadUInt64("DynamicID", indexes);
36+
37+
if (Settings.UseDBC)
38+
if (DBC.Criteria.ContainsKey(criteriaId))
39+
if (DBC.Criteria[criteriaId].Type == 46)
40+
CoreParsers.AchievementHandler.FactionReputationStore[DBC.Criteria[criteriaId].Asset] = quantity;
41+
}
42+
43+
public static void ReadAllAchievements(Packet packet, params object[] idx)
44+
{
45+
var earnedCount = packet.ReadUInt32("EarnedCount", idx);
46+
var progressCount = packet.ReadUInt32("ProgressCount", idx);
47+
48+
for (var i = 0; i < earnedCount; ++i)
49+
ReadEarnedAchievement(packet, idx, "Earned", i);
50+
51+
for (var i = 0; i < progressCount; ++i)
52+
ReadCriteriaProgress(packet, idx, "Progress", i);
53+
}
54+
1155
[Parser(Opcode.SMSG_BROADCAST_ACHIEVEMENT)]
1256
public static void HandleBroadcastAchievement(Packet packet)
1357
{
@@ -17,5 +61,27 @@ public static void HandleBroadcastAchievement(Packet packet)
1761
packet.ReadUInt32("AchievementID");
1862
packet.ReadWoWString("Name", nameLength);
1963
}
64+
65+
[Parser(Opcode.SMSG_ALL_ACHIEVEMENT_DATA)]
66+
public static void HandleAllAchievementDataPlayer(Packet packet)
67+
{
68+
ReadAllAchievements(packet, "Data");
69+
}
70+
71+
[Parser(Opcode.SMSG_ALL_ACCOUNT_CRITERIA)]
72+
public static void HandleAllAchievementCriteriaDataAccount(Packet packet)
73+
{
74+
var count = packet.ReadUInt32("ProgressCount");
75+
76+
for (var i = 0; i < count; ++i)
77+
ReadCriteriaProgress(packet, "Progress", i);
78+
}
79+
80+
[Parser(Opcode.SMSG_RESPOND_INSPECT_ACHIEVEMENTS)]
81+
public static void HandleRespondInspectAchievements(Packet packet)
82+
{
83+
packet.ReadPackedGuid128("Player");
84+
ReadAllAchievements(packet, "Data");
85+
}
2086
}
2187
}

WowPacketParserModule.V5_5_0_61735/Parser/AuthenticationHandler.cs

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Text;
12
using WowPacketParser.Enums;
23
using WowPacketParser.Misc;
34
using WowPacketParser.Parsing;
@@ -80,6 +81,110 @@ public static void HandleRedirectClient(Packet packet)
8081
packet.ReadUInt64("Key");
8182
}
8283

84+
[Parser(Opcode.SMSG_AUTH_RESPONSE)]
85+
public static void HandleAuthResponse(Packet packet)
86+
{
87+
packet.ReadUInt32E<BattlenetRpcErrorCode>("Result");
88+
89+
var ok = packet.ReadBit("Success");
90+
var queued = packet.ReadBit("Queued");
91+
if (ok)
92+
{
93+
packet.ReadUInt32("VirtualRealmAddress");
94+
var realms = packet.ReadUInt32();
95+
packet.ReadUInt32("TimeRested");
96+
packet.ReadByte("ActiveExpansionLevel");
97+
packet.ReadByte("AccountExpansionLevel");
98+
packet.ReadUInt32("TimeSecondsUntilPCKick");
99+
var classes = packet.ReadUInt32("AvailableClasses");
100+
var templates = packet.ReadUInt32("Templates");
101+
packet.ReadUInt32("AccountCurrency");
102+
packet.ReadTime64("Time");
103+
104+
for (var i = 0; i < classes; ++i)
105+
{
106+
packet.ReadByteE<Race>("RaceID", "AvailableClasses", i);
107+
var classesForRace = packet.ReadUInt32();
108+
for (var j = 0u; j < classesForRace; ++j)
109+
{
110+
packet.ReadByteE<Class>("ClassID", "AvailableClasses", i, "Classes", j);
111+
packet.ReadByteE<ClientType>("ActiveExpansionLevel", "AvailableClasses", i, "Classes", j);
112+
packet.ReadByteE<ClientType>("AccountExpansionLevel", "AvailableClasses", i, "Classes", j);
113+
packet.ReadByte("MinActiveExpansionLevel", "AvailableClasses", i, "Classes", j);
114+
}
115+
}
116+
117+
packet.ResetBitReader();
118+
packet.ReadBit("IsExpansionTrial");
119+
packet.ReadBit("ForceCharacterTemplate");
120+
var horde = packet.ReadBit(); // NumPlayersHorde
121+
var alliance = packet.ReadBit(); // NumPlayersAlliance
122+
var trialExpiration = packet.ReadBit(); // ExpansionTrialExpiration
123+
var hasNewBuildKeys = packet.ReadBit();
124+
125+
packet.ResetBitReader();
126+
packet.ReadUInt32("BillingPlan");
127+
packet.ReadUInt32("TimeRemain");
128+
packet.ReadUInt32("Unk_V7_3_5");
129+
130+
packet.ReadBit("InGameRoom");
131+
packet.ReadBit("InGameRoom");
132+
packet.ReadBit("InGameRoom");
133+
134+
if (horde)
135+
packet.ReadUInt16("NumPlayersHorde");
136+
137+
if (alliance)
138+
packet.ReadUInt16("NumPlayersAlliance");
139+
140+
if (trialExpiration)
141+
packet.ReadInt64("ExpansionTrialExpiration");
142+
143+
if (hasNewBuildKeys)
144+
{
145+
var newBuildKey = new byte[16];
146+
var someKey = new byte[16];
147+
for (var i = 0; i < 16; i++)
148+
{
149+
newBuildKey[i] = packet.ReadByte();
150+
someKey[i] = packet.ReadByte();
151+
}
152+
packet.AddValue("NewBuildKey", Encoding.UTF8.GetString(newBuildKey));
153+
packet.AddValue("SomeKey", Encoding.UTF8.GetString(someKey));
154+
}
155+
156+
for (var i = 0; i < realms; ++i)
157+
SessionHandler.ReadVirtualRealmInfo(packet, "VirtualRealms", i);
158+
159+
for (var i = 0; i < templates; ++i)
160+
{
161+
packet.ReadUInt32("TemplateSetId", i);
162+
var templateClasses = packet.ReadUInt32();
163+
for (var j = 0; j < templateClasses; ++j)
164+
{
165+
packet.ReadByteE<Class>("Class", i, j);
166+
packet.ReadByte("FactionGroup", i, j);
167+
}
168+
169+
packet.ResetBitReader();
170+
var nameLen = packet.ReadBits(7);
171+
var descLen = packet.ReadBits(10);
172+
packet.ReadWoWString("Name", nameLen, i);
173+
packet.ReadWoWString("Description", descLen, i);
174+
}
175+
}
176+
177+
if (queued)
178+
{
179+
packet.ReadUInt32("WaitCount");
180+
packet.ReadUInt32("WaitTime");
181+
packet.ReadByte("AllowedFactionGroupForCharacterCreate");
182+
packet.ResetBitReader();
183+
packet.ReadBit("HasFCM");
184+
packet.ReadBit("CanCreateOnlyIfExisting");
185+
}
186+
}
187+
83188
[Parser(Opcode.SMSG_RESUME_COMMS)]
84189
public static void HandleZeroLengthPackets(Packet packet)
85190
{
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
using WowPacketParser.Enums;
2+
using WowPacketParser.Misc;
3+
using WowPacketParser.Parsing;
4+
5+
namespace WowPacketParserModule.V5_5_0_61735.Parsers
6+
{
7+
public static class CurrencyHandler
8+
{
9+
[Parser(Opcode.SMSG_SETUP_CURRENCY)]
10+
public static void HandleSetupCurrency(Packet packet)
11+
{
12+
var count = packet.ReadInt32("SetupCurrencyRecord");
13+
14+
// ClientSetupCurrencyRecord
15+
for (var i = 0; i < count; ++i)
16+
{
17+
packet.ReadUInt32("Type", i);
18+
packet.ReadUInt32("Quantity", i);
19+
20+
packet.ResetBitReader();
21+
22+
var hasWeeklyQuantity = packet.ReadBit();
23+
var hasMaxWeeklyQuantity = packet.ReadBit();
24+
var hasTrackedQuantity = packet.ReadBit();
25+
var hasMaxQuantity = packet.ReadBit();
26+
var hasTotalEarned = packet.ReadBit("HasTotalEarned");
27+
var hasNextRechargeTime = packet.ReadBit("HasNextRechargeTime");
28+
var hasRechargeCyclicStartTime = packet.ReadBit("HasRechargeCyclicStartTime");
29+
30+
packet.ReadBits("Flags", 5, i);
31+
32+
if (hasWeeklyQuantity)
33+
packet.ReadUInt32("WeeklyQuantity", i);
34+
35+
if (hasMaxWeeklyQuantity)
36+
packet.ReadUInt32("MaxWeeklyQuantity", i);
37+
38+
if (hasTrackedQuantity)
39+
packet.ReadUInt32("TrackedQuantity", i);
40+
41+
if (hasMaxQuantity)
42+
packet.ReadUInt32("MaxQuantity", i);
43+
44+
if (hasTotalEarned)
45+
packet.ReadInt32("TotalEarned", i);
46+
47+
if (hasNextRechargeTime)
48+
packet.ReadTime64("NextRechargeTime", i);
49+
50+
if (hasRechargeCyclicStartTime)
51+
packet.ReadTime64("RechargeCyclicStartTime", i);
52+
}
53+
}
54+
55+
[Parser(Opcode.SMSG_SET_CURRENCY)]
56+
public static void HandleSetCurrency(Packet packet)
57+
{
58+
packet.ReadInt32("Type");
59+
packet.ReadInt32("Quantity");
60+
packet.ReadUInt32("Flags");
61+
uint toastCount = packet.ReadUInt32("UiEventToastCount");
62+
for (var i = 0; i < toastCount; i++)
63+
ItemHandler.ReadUIEventToast(packet, "UiEventToast", i);
64+
65+
var hasWeeklyQuantity = packet.ReadBit("HasWeeklyQuantity");
66+
var hasTrackedQuantity = packet.ReadBit("HasTrackedQuantity");
67+
var hasMaxQuantity = packet.ReadBit("HasMaxQuantity");
68+
var hasTotalEarned = packet.ReadBit("HasTotalEarned");
69+
packet.ReadBit("SuppressChatLog");
70+
var hasQuantityChange = packet.ReadBit("HasQuantityChange");
71+
var hasQuantityLostSource = packet.ReadBit("HasQuantityLostSource");
72+
var hasQuantityGainSource = packet.ReadBit("HasQuantityGainSource");
73+
74+
var hasFirstCraftOperationID = packet.ReadBit("HasFirstCraftOperationID");
75+
var hasHasNextRechargeTime = packet.ReadBit("HasNextRechargeTime");
76+
var hasRechargeCycleStartTime = packet.ReadBit("HasRechargeCycleStartTime");
77+
var hasOverflownCurrencyID = packet.ReadBit("HasOverflownCurrencyID");
78+
79+
if (hasWeeklyQuantity)
80+
packet.ReadInt32("WeeklyQuantity");
81+
82+
if (hasTrackedQuantity)
83+
packet.ReadInt32("TrackedQuantity");
84+
85+
if (hasMaxQuantity)
86+
packet.ReadInt32("MaxQuantity");
87+
88+
if (hasTotalEarned)
89+
packet.ReadInt32("TotalEarned");
90+
91+
if (hasQuantityChange)
92+
packet.ReadInt32("QuantityChange");
93+
94+
if (hasQuantityLostSource)
95+
packet.ReadInt32("QuantityLostSource");
96+
97+
if (hasQuantityGainSource)
98+
packet.ReadInt32("QuantityGainSource");
99+
100+
if (hasFirstCraftOperationID)
101+
packet.ReadUInt32("FirstCraftOperationID");
102+
103+
if (hasHasNextRechargeTime)
104+
packet.ReadTime64("NextRechargeTime");
105+
106+
if (hasRechargeCycleStartTime)
107+
packet.ReadTime64("RechargeCycleStartTime");
108+
109+
if (hasOverflownCurrencyID)
110+
packet.ReadInt32("OverflownCurrencyID");
111+
}
112+
113+
[Parser(Opcode.SMSG_RESET_WEEKLY_CURRENCY)]
114+
public static void HandleCurrencyZero(Packet packet)
115+
{
116+
}
117+
}
118+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using WowPacketParser.Enums;
2+
using WowPacketParser.Misc;
3+
using WowPacketParser.Parsing;
4+
using WowPacketParser.Store.Objects;
5+
6+
namespace WowPacketParserModule.V5_5_0_61735.Parsers
7+
{
8+
public static class ItemHandler
9+
{
10+
public static void ReadUIEventToast(Packet packet, params object[] args)
11+
{
12+
packet.ReadInt32("UiEventToastID", args);
13+
packet.ReadInt32("Asset", args);
14+
}
15+
}
16+
}

0 commit comments

Comments
 (0)