Skip to content

Commit 7031a89

Browse files
committed
Initial WoW Forever (beta) support
1 parent 28fc3d1 commit 7031a89

14 files changed

Lines changed: 2909 additions & 0 deletions

‎WowPacketParser.slnx‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<Project Path="WowPacketParserModule.BattleNet.V37165/WowPacketParserModule.BattleNet.V37165.csproj" />
55
<Project Path="WowPacketParserModule.Substructures/WowPacketParserModule.Substructures.csproj" />
66
<Project Path="WowPacketParserModule.V1_13_2_31446/WowPacketParserModule.V1_13_2_31446.csproj" />
7+
<Project Path="WowPacketParserModule.V1_60_1_69876/WowPacketParserModule.V1_60_1_69876.csproj" />
78
<Project Path="WowPacketParserModule.V2_4_3_8606/WowPacketParserModule.V2_4_3_8606.csproj" />
89
<Project Path="WowPacketParserModule.V2_5_1_38707/WowPacketParserModule.V2_5_1_38707.csproj" />
910
<Project Path="WowPacketParserModule.V3_4_0_45166/WowPacketParserModule.V3_4_0_45166.csproj" />

‎WowPacketParser/Enums/ClientType.cs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ public enum ClientType
2222
CataClassic = 9,
2323
TheWarWithin = 10,
2424
Midnight = 11,
25+
Forever = 11,
2526
}
2627
}

‎WowPacketParser/Enums/ClientVersionBuild.cs‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,16 @@ public enum ClientVersionBuild
11441144
V5_5_3_66839 = 66839, // live
11451145
V5_5_3_67158 = 67158, // live
11461146
V5_5_3_67509 = 67509, // live
1147+
1148+
V1_60_69876 = 69876, // beta
1149+
V1_60_69893 = 69893, // beta
1150+
V1_60_69913 = 69913, // beta
1151+
V1_60_69977 = 69977, // beta
1152+
V1_60_70009 = 70009, // beta
1153+
V1_60_70058 = 70058, // beta
1154+
V1_60_70094 = 70094, // beta (china only)
1155+
V1_60_70124 = 70124, // beta (china only)
1156+
11471157
// Battle.net - should probably not mix this but oh well
11481158
BattleNetV37165 = 37165,
11491159

‎WowPacketParser/Enums/Version/Opcodes.cs‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
using WowPacketParser.Enums.Version.V12_1_0_69214;
111111
using WowPacketParser.Misc;
112112
using WowPacketParser.Enums.Version.V2_5_6_68502;
113+
using WowPacketParser.Enums.Version.V1_60_69876;
113114

114115
namespace WowPacketParser.Enums.Version
115116
{
@@ -1325,6 +1326,15 @@ public static ClientVersionBuild GetOpcodeDefiningBuild(ClientVersionBuild build
13251326
case ClientVersionBuild.V2_5_6_69546:
13261327
case ClientVersionBuild.V2_5_6_69795:
13271328
return ClientVersionBuild.V2_5_6_68502;
1329+
case ClientVersionBuild.V1_60_69876:
1330+
case ClientVersionBuild.V1_60_69893:
1331+
case ClientVersionBuild.V1_60_69913:
1332+
case ClientVersionBuild.V1_60_69977:
1333+
case ClientVersionBuild.V1_60_70009:
1334+
case ClientVersionBuild.V1_60_70058:
1335+
case ClientVersionBuild.V1_60_70094:
1336+
case ClientVersionBuild.V1_60_70124:
1337+
return ClientVersionBuild.V1_60_69876;
13281338
default:
13291339
return ClientVersionBuild.V3_3_5a_12340;
13301340
}
@@ -1560,6 +1570,8 @@ public static BiDictionary<Opcode, int> GetOpcodeDictionary(ClientVersionBuild b
15601570
return Opcodes_5_5_2.Opcodes(direction);
15611571
case ClientVersionBuild.V5_5_3_64802:
15621572
return Opcodes_5_5_3.Opcodes(direction);
1573+
case ClientVersionBuild.V1_60_69876:
1574+
return Opcodes_1_60_1.Opcodes(direction);
15631575
default:
15641576
return Opcodes_3_3_5.Opcodes(direction);
15651577
}

‎WowPacketParser/Enums/Version/UpdateFields.cs‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1566,6 +1566,17 @@ private static ClientVersionBuild GetUpdateFieldDictionaryBuild(ClientVersionBui
15661566
{
15671567
return ClientVersionBuild.V5_5_3_64802;
15681568
}
1569+
case ClientVersionBuild.V1_60_69876:
1570+
case ClientVersionBuild.V1_60_69893:
1571+
case ClientVersionBuild.V1_60_69913:
1572+
case ClientVersionBuild.V1_60_69977:
1573+
case ClientVersionBuild.V1_60_70009:
1574+
case ClientVersionBuild.V1_60_70058:
1575+
case ClientVersionBuild.V1_60_70094:
1576+
case ClientVersionBuild.V1_60_70124:
1577+
{
1578+
return ClientVersionBuild.V1_60_69876;
1579+
}
15691580
default:
15701581
{
15711582
return ClientVersionBuild.V3_3_5a_12340;

‎WowPacketParser/Enums/Version/V1_60_69876/Opcodes.cs‎

Lines changed: 2461 additions & 0 deletions
Large diffs are not rendered by default.

‎WowPacketParser/Misc/ClientBranch.cs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,7 @@ public enum ClientBranch
88
WotLK = 3,
99
Cata = 4,
1010
MoP = 5,
11+
// Forever is not Classic, not Vanilla and not Retail
12+
Forever = 60,
1113
}
1214
}

‎WowPacketParser/Misc/ClientVersion.cs‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1816,6 +1816,15 @@ public static ClientVersionBuild GetVersionDefiningBuild(ClientVersionBuild buil
18161816
case ClientVersionBuild.V2_5_6_69546:
18171817
case ClientVersionBuild.V2_5_6_69795:
18181818
return ClientVersionBuild.V5_5_0_61735;
1819+
case ClientVersionBuild.V1_60_69876:
1820+
case ClientVersionBuild.V1_60_69893:
1821+
case ClientVersionBuild.V1_60_69913:
1822+
case ClientVersionBuild.V1_60_69977:
1823+
case ClientVersionBuild.V1_60_70009:
1824+
case ClientVersionBuild.V1_60_70058:
1825+
case ClientVersionBuild.V1_60_70094:
1826+
case ClientVersionBuild.V1_60_70124:
1827+
return ClientVersionBuild.V1_60_69876;
18191828
case ClientVersionBuild.BattleNetV37165:
18201829
return ClientVersionBuild.BattleNetV37165;
18211830
case ClientVersionBuild.Zero:
@@ -1856,6 +1865,10 @@ public static ClientVersionBuild FallbackVersionDefiningBuild(ClientVersionBuild
18561865
return ClientVersionBuild.V10_0_0_46181;
18571866
case ClientVersionBuild.V12_0_0_65390:
18581867
return ClientVersionBuild.V11_0_0_55666;
1868+
// Forever is based on 12.x, so lets fallback for now
1869+
// Do not add any version checks for Forever handlers in 12.x or before
1870+
case ClientVersionBuild.V1_60_69876:
1871+
return ClientVersionBuild.V12_0_0_65390;
18591872
default:
18601873
return ClientVersionBuild.Zero;
18611874
}
@@ -1897,6 +1910,8 @@ private static ClientType GetExpansion(ClientVersionBuild build)
18971910
return ClientType.ClassicSoD;
18981911
if (IsCataClientVersionBuild(build))
18991912
return ClientType.CataClassic;
1913+
if (IsForeverClientVersionBuild(build))
1914+
return ClientType.Forever;
19001915
return build switch
19011916
{
19021917
>= ClientVersionBuild.V12_0_0_65390 => ClientType.Midnight,
@@ -1928,6 +1943,8 @@ private static ClientBranch GetBranch(ClientVersionBuild build)
19281943
return ClientBranch.Cata;
19291944
if (IsMoPClassicClientVersionBuild(build))
19301945
return ClientBranch.MoP;
1946+
if (IsForeverClientVersionBuild(build))
1947+
return ClientBranch.Forever;
19311948

19321949
return ClientBranch.Retail;
19331950
}
@@ -2557,5 +2574,23 @@ public static bool IsMoPClassicClientVersionBuild(ClientVersionBuild build)
25572574
return false;
25582575
}
25592576
}
2577+
2578+
public static bool IsForeverClientVersionBuild(ClientVersionBuild build)
2579+
{
2580+
switch (build)
2581+
{
2582+
case ClientVersionBuild.V1_60_69876:
2583+
case ClientVersionBuild.V1_60_69893:
2584+
case ClientVersionBuild.V1_60_69913:
2585+
case ClientVersionBuild.V1_60_69977:
2586+
case ClientVersionBuild.V1_60_70009:
2587+
case ClientVersionBuild.V1_60_70058:
2588+
case ClientVersionBuild.V1_60_70094:
2589+
case ClientVersionBuild.V1_60_70124:
2590+
return true;
2591+
default:
2592+
return false;
2593+
}
2594+
}
25602595
}
25612596
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using WowPacketParser.DBC;
2+
using WowPacketParser.Enums;
3+
using WowPacketParser.Misc;
4+
using WowPacketParser.Parsing;
5+
using CoreParsers = WowPacketParser.Parsing.Parsers;
6+
7+
namespace WowPacketParserModule.V1_60_1_69876.Parsers
8+
{
9+
public static class AchievementHandler
10+
{
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+
CoreParsers.AchievementHandler.TryUpdateFactionStandingFromCriteria(criteriaId, quantity);
38+
}
39+
40+
public static void ReadAllAchievements(Packet packet, params object[] idx)
41+
{
42+
var earnedCount = packet.ReadUInt32("EarnedCount", idx);
43+
var progressCount = packet.ReadUInt32("ProgressCount", idx);
44+
45+
for (var i = 0; i < earnedCount; ++i)
46+
ReadEarnedAchievement(packet, idx, "Earned", i);
47+
48+
for (var i = 0; i < progressCount; ++i)
49+
ReadCriteriaProgress(packet, idx, "Progress", i);
50+
}
51+
52+
[Parser(Opcode.SMSG_ALL_ACHIEVEMENT_DATA)]
53+
public static void HandleAllAchievementDataPlayer(Packet packet)
54+
{
55+
ReadAllAchievements(packet, "Data");
56+
}
57+
58+
[Parser(Opcode.SMSG_ALL_ACCOUNT_CRITERIA)]
59+
public static void HandleAllAchievementCriteriaDataAccount(Packet packet)
60+
{
61+
var count = packet.ReadUInt32("ProgressCount");
62+
63+
for (var i = 0; i < count; ++i)
64+
ReadCriteriaProgress(packet, "Progress", i);
65+
}
66+
67+
[Parser(Opcode.SMSG_RESPOND_INSPECT_ACHIEVEMENTS)]
68+
public static void HandleRespondInspectAchievements(Packet packet)
69+
{
70+
packet.ReadPackedGuid128("Player");
71+
ReadAllAchievements(packet, "Data");
72+
}
73+
}
74+
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
using System.Text;
2+
using WowPacketParser.Enums;
3+
using WowPacketParser.Misc;
4+
using WowPacketParser.Parsing;
5+
6+
namespace WowPacketParserModule.V1_60_1_69876.Parsers
7+
{
8+
public static class AuthenticationHandler
9+
{
10+
public static void ReadGameTimeInfo(Packet packet, params object[] idx)
11+
{
12+
packet.ReadUInt32("BillingType");
13+
packet.ReadUInt32("MinutesRemaining");
14+
packet.ReadUInt32("RealBillingType");
15+
16+
packet.ResetBitReader();
17+
packet.ReadBit("IsInIGR");
18+
packet.ReadBit("IsPaidForByIGR");
19+
packet.ReadBit("IsCAISEnabled");
20+
}
21+
22+
[Parser(Opcode.SMSG_AUTH_RESPONSE)]
23+
public static void HandleAuthResponse(Packet packet)
24+
{
25+
packet.ReadUInt32E<BattlenetRpcErrorCode>("Result");
26+
27+
var ok = packet.ReadBit("Success");
28+
var queued = packet.ReadBit("Queued");
29+
if (ok)
30+
{
31+
packet.ReadUInt32("VirtualRealmAddress");
32+
var realms = packet.ReadUInt32();
33+
packet.ReadUInt32("TimeRested");
34+
packet.ReadByte("ActiveExpansionLevel");
35+
packet.ReadByte("AccountExpansionLevel");
36+
packet.ReadUInt32("TimeSecondsUntilPCKick");
37+
var classes = packet.ReadUInt32("AvailableClasses");
38+
var templates = packet.ReadUInt32("Templates");
39+
packet.ReadUInt32("AccountCurrency");
40+
ReadGameTimeInfo(packet, "GameTimeInfo");
41+
packet.ReadTime64("Time");
42+
43+
for (var i = 0; i < realms; ++i)
44+
SessionHandler.ReadVirtualRealmInfo(packet, "VirtualRealms", i);
45+
46+
for (var i = 0; i < classes; ++i)
47+
{
48+
packet.ReadByteE<Race>("RaceID", "AvailableClasses", i);
49+
var classesForRace = packet.ReadUInt32();
50+
for (var j = 0u; j < classesForRace; ++j)
51+
{
52+
packet.ReadByteE<Class>("ClassID", "AvailableClasses", i, "Classes", j);
53+
packet.ReadByteE<ClientType>("ActiveExpansionLevel", "AvailableClasses", i, "Classes", j);
54+
packet.ReadByteE<ClientType>("AccountExpansionLevel", "AvailableClasses", i, "Classes", j);
55+
packet.ReadByte("MinActiveExpansionLevel", "AvailableClasses", i, "Classes", j);
56+
}
57+
}
58+
59+
for (var i = 0; i < templates; ++i)
60+
{
61+
// switch?
62+
packet.ReadUInt32("Unk_1_60_1", i);
63+
packet.ReadUInt32("TemplateSetId", i);
64+
var templateClasses = packet.ReadUInt32();
65+
for (var j = 0; j < templateClasses; ++j)
66+
{
67+
packet.ReadByteE<Class>("Class", i, j);
68+
packet.ReadByte("FactionGroup", i, j);
69+
}
70+
71+
packet.ResetBitReader();
72+
var nameLen = packet.ReadBits(7);
73+
var descLen = packet.ReadBits(10);
74+
packet.ReadWoWString("Name", nameLen, i);
75+
packet.ReadWoWString("Description", descLen, i);
76+
}
77+
78+
packet.ResetBitReader();
79+
packet.ReadBit("IsExpansionTrial");
80+
packet.ReadBit("ForceCharacterTemplate");
81+
var horde = packet.ReadBit(); // NumPlayersHorde
82+
var alliance = packet.ReadBit(); // NumPlayersAlliance
83+
var trialExpiration = packet.ReadBit(); // ExpansionTrialExpiration
84+
var hasNewBuildKeys = packet.ReadBit();
85+
86+
if (horde)
87+
packet.ReadUInt16("NumPlayersHorde");
88+
89+
if (alliance)
90+
packet.ReadUInt16("NumPlayersAlliance");
91+
92+
if (trialExpiration)
93+
packet.ReadInt64("ExpansionTrialExpiration");
94+
95+
if (hasNewBuildKeys)
96+
{
97+
var newBuildKey = new byte[16];
98+
var someKey = new byte[16];
99+
for (var i = 0; i < 16; i++)
100+
{
101+
newBuildKey[i] = packet.ReadByte();
102+
someKey[i] = packet.ReadByte();
103+
}
104+
packet.AddValue("NewBuildKey", Encoding.UTF8.GetString(newBuildKey));
105+
packet.AddValue("SomeKey", Encoding.UTF8.GetString(someKey));
106+
}
107+
}
108+
109+
if (queued)
110+
{
111+
packet.ReadUInt32("WaitCount");
112+
packet.ReadUInt32("WaitTime");
113+
packet.ReadByte("AllowedFactionGroupForCharacterCreate");
114+
packet.ResetBitReader();
115+
packet.ReadBit("HasFCM");
116+
packet.ReadBit("CanCreateOnlyIfExisting");
117+
}
118+
}
119+
}
120+
}

0 commit comments

Comments
 (0)