Skip to content

Commit

Permalink
9.2.0 packet structures (excluding SMSG_UPDATE_OBJECT)
Browse files Browse the repository at this point in the history
  • Loading branch information
Shauren committed Feb 23, 2022
1 parent 6bf52d2 commit 565d59d
Show file tree
Hide file tree
Showing 20 changed files with 212 additions and 19 deletions.
3 changes: 2 additions & 1 deletion WowPacketParser/Enums/AccountDataType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public enum AccountDataType
GlobalTTSCache = 8,
PerCharacterTTSCache = 9,
GlobalFlaggedCache = 10,
PerCharacterFlaggedCache = 11
PerCharacterFlaggedCache = 11,
PerCharacterClickBindingsCache = 12,
}
}
11 changes: 11 additions & 0 deletions WowPacketParser/Enums/Language.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,17 @@ public enum Language : uint
AddonBfA = 183,
AddonLogged = 184,
Vulpera = 285,
ComplexCipher = 287,
BasicCypher = 288,
Metrial = 290,
Altonian = 291,
Sopranian = 292,
Aealic = 293,
Dealic = 294,
Trebelim = 295,
Bassalim = 296,
EmbeddedLanguages = 297,
Unknowable = 298,
Addon = uint.MaxValue
}
}
2 changes: 2 additions & 0 deletions WowPacketParser/Parsing/Parsers/NpcHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -621,6 +621,8 @@ public static void HandleNpcGossip(Packet packet)
[Parser(Opcode.SMSG_GOSSIP_COMPLETE)]
public static void HandleGossipComplete(Packet packet)
{
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
packet.ReadBit("SuppressSound");
}

[Parser(Opcode.SMSG_THREAT_UPDATE)]
Expand Down
4 changes: 2 additions & 2 deletions WowPacketParser/Store/Objects/AreaTriggerCreateProperties.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ public sealed record AreaTriggerCreateProperties : WoWObject, IDataModel
[DBFieldName("Shape", TargetedDatabase.Shadowlands)]
public byte? Shape;

[DBFieldName("ShapeData", TargetedDatabase.Shadowlands, 6, true)]
public float?[] ShapeData = { 0, 0, 0, 0, 0, 0 };
[DBFieldName("ShapeData", TargetedDatabase.Shadowlands, 8, true)]
public float?[] ShapeData = { 0, 0, 0, 0, 0, 0, 0, 0 };

[DBFieldName("VerifiedBuild")]
public int? VerifiedBuild = ClientVersion.BuildInt;
Expand Down
3 changes: 3 additions & 0 deletions WowPacketParser/Store/Objects/GossipMenuOption.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ public sealed record GossipMenuOption : IDataModel
[DBFieldName("OptionNpcFlag")]
public NPCFlags? OptionNpcFlag;

[DBFieldName("Language", TargetedDatabase.Shadowlands)]
public Language? Language;

[DBFieldName("ActionMenuID")]
public uint? ActionMenuID;

Expand Down
9 changes: 9 additions & 0 deletions WowPacketParser/Store/Objects/PlayerChoice.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,18 @@ public sealed record PlayerChoiceTemplate : IDataModel
[DBFieldName("SoundKitId", TargetedDatabase.BattleForAzeroth)]
public uint? SoundKitId;

[DBFieldName("CloseSoundKitId", TargetedDatabase.Shadowlands)]
public uint? CloseSoundKitId;

[DBFieldName("Duration", TargetedDatabase.Shadowlands)]
public long? Duration;

[DBFieldName("Question")]
public string Question;

[DBFieldName("PendingChoiceText", TargetedDatabase.Shadowlands)]
public string PendingChoiceText;

[DBFieldName("HideWarboardHeader", TargetedDatabase.Legion)]
public int HideWarboardHeader;

Expand Down
15 changes: 13 additions & 2 deletions WowPacketParserModule.Substructures/MythicPlusHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,14 @@ public static void ReadDungeonScoreMapSummary(Packet packet, params object[] ind

public static void ReadDungeonScoreSummary(Packet packet, params object[] indexes)
{
packet.ReadInt32("CurrentSeasonScore", indexes);
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_1_5_40772))
packet.ReadSingle("CurrentSeasonScore", indexes);
else
packet.ReadInt32("CurrentSeasonScore", indexes);

if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
packet.ReadSingle("LifetimeBestSeasonScore", indexes);

var runCount = packet.ReadUInt32("RunCount", indexes);
for (var i = 0u; i < runCount; ++i)
ReadDungeonScoreMapSummary(packet, indexes, i, "Run");
Expand All @@ -36,7 +43,11 @@ public static void ReadMythicPlusMember(Packet packet, params object[] indexes)
packet.ReadPackedGuid128("GuildGUID", indexes);
packet.ReadUInt32("NativeRealmAddress", indexes);
packet.ReadUInt32("VirtualRealmAddress", indexes);
packet.ReadInt16("ChrSpecializationID", indexes);
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
packet.ReadInt32("ChrSpecializationID", indexes);
else
packet.ReadInt16("ChrSpecializationID", indexes);

packet.ReadInt16E<Race>("RaceID", indexes);
packet.ReadInt32("ItemLevel", indexes);
packet.ReadInt32("CovenantID", indexes);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,8 @@ public static void HandleBattlefieldStatus_Queued(Packet packet)
ReadBattlefieldStatus_Header(packet);
packet.ReadInt32("AverageWaitTime");
packet.ReadInt32("WaitTime");
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
packet.ReadInt32("Unused920");

packet.ResetBitReader();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,14 +100,14 @@ public static void HandleGoReportUse(Packet packet)
use.GameObject = packet.ReadPackedGuid128("GameObjectGUID");
use.Report = true;
}

[Parser(Opcode.CMSG_GAME_OBJ_USE)]
public static void HandleGoUse(Packet packet)
{
var use = packet.Holder.ClientUseGameObject = new PacketClientUseGameObject();
use.GameObject = packet.ReadPackedGuid128("GameObjectGUID");
}

[Parser(Opcode.SMSG_PAGE_TEXT)]
public static void HandleGoPageText(Packet packet)
{
Expand Down Expand Up @@ -166,6 +166,8 @@ public static void HandleGameObjectUiLink(Packet packet)
{
packet.ReadPackedGuid128("GUID");
packet.ReadInt32("UILink");
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
packet.ReadInt32("UIItemInteractionID");
}

[Parser(Opcode.SMSG_FORCE_OBJECT_RELINK)]
Expand Down
14 changes: 11 additions & 3 deletions WowPacketParserModule.V6_0_2_19033/Parsers/MovementHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,9 @@ public static void ReadMoveStateChange(Packet packet, params object[] idx)
var hasVehicle = packet.ReadBit("HasVehicle", idx);
var hasCollisionHeight = packet.ReadBit("HasCollisionHeight", idx);
var hasMovementForce = packet.ReadBit("HasMovementForce", idx);
var hasMoverGUID = packet.ReadBit("HasMoverGUID", idx);
var hasMovementForceGUID = packet.ReadBit("HasMovementForceGUID", idx);
var hasMovementInertiaGUID = packet.ReadBit("HasMovementInertiaGUID", idx);
var hasMovementInertiaLifetimeMs = packet.ReadBit("HasMovementInertiaLifetimeMs", idx);

if (hasSpeed)
packet.ReadSingle("Speed", idx);
Expand All @@ -155,8 +157,14 @@ public static void ReadMoveStateChange(Packet packet, params object[] idx)
if (hasMovementForce)
ReadMovementForce(packet, "MovementForce", idx);

if (hasMoverGUID)
packet.ReadPackedGuid128("MoverGUID", idx);
if (hasMovementForceGUID)
packet.ReadPackedGuid128("MovementForceGUID", idx);

if (hasMovementInertiaGUID)
packet.ReadPackedGuid128("MovementInertiaGUID", idx);

if (hasMovementInertiaLifetimeMs)
packet.ReadUInt32("MovementInertiaLifetimeMs", idx);
}

[Parser(Opcode.CMSG_WORLD_PORT_RESPONSE)]
Expand Down
2 changes: 2 additions & 0 deletions WowPacketParserModule.V6_0_2_19033/Parsers/NpcHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ public static GossipMessageOption ReadGossipOptionsData(uint menuId, WowGuid npc
gossipMessageOption.OptionIcon = (int) gossipOption.OptionIcon;
gossipOption.BoxCoded = gossipMessageOption.BoxCoded = packet.ReadByte("OptionFlags", idx) != 0;
gossipOption.BoxMoney = gossipMessageOption.BoxCost = (uint)packet.ReadInt32("OptionCost", idx);
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
gossipOption.Language = packet.ReadUInt32E<Language>("Language", idx);

packet.ResetBitReader();
uint textLen = packet.ReadBits(12);
Expand Down
22 changes: 20 additions & 2 deletions WowPacketParserModule.V7_0_3_22248/Parsers/MovementHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ public static MovementInfo ReadMovementStats(Packet packet, params object[] idx)
MovementInfo info = new();
info.MoverGuid = packet.ReadPackedGuid128("MoverGUID", idx);

if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
{
info.Flags = (uint)packet.ReadUInt32E<MovementFlag>("MovementFlags", idx);
info.Flags2 = (uint)packet.ReadUInt32E<MovementFlag2>("MovementFlags2", idx);
info.Flags3 = (uint)packet.ReadUInt32E<MovementFlag3>("MovementFlags3", idx);
}

packet.ReadInt32("MoveTime", idx);
var position = packet.ReadVector4("Position", idx);
info.Position = new Vector3 { X = position.X, Y = position.Y, Z = position.Z };
Expand All @@ -38,18 +45,29 @@ public static MovementInfo ReadMovementStats(Packet packet, params object[] idx)

packet.ResetBitReader();

info.Flags = (uint)packet.ReadBitsE<MovementFlag>("MovementFlags", 30, idx);
info.Flags2 = (uint)packet.ReadBitsE<MovementFlag2>("ExtraMovementFlags", 18, idx);
if (ClientVersion.RemovedInVersion(ClientVersionBuild.V9_2_0_42423))
{
info.Flags = (uint)packet.ReadBitsE<MovementFlag>("MovementFlags", 30, idx);
info.Flags2 = (uint)packet.ReadBitsE<MovementFlag2>("MovementFlags2", 18, idx);
}

var hasTransport = packet.ReadBit("HasTransportData", idx);
var hasFall = packet.ReadBit("HasFallData", idx);
packet.ReadBit("HasSpline", idx);
packet.ReadBit("HeightChangeFailed", idx);
packet.ReadBit("RemoteTimeValid", idx);
var hasInertia = ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423) && packet.ReadBit("HasInertia", idx);

if (hasTransport)
info.Transport = V6_0_2_19033.Parsers.MovementHandler.ReadTransportData(packet, idx, "TransportData");

if (hasInertia)
{
packet.ReadPackedGuid128("GUID", idx, "Inertia");
packet.ReadVector3("Force", idx, "Inertia");
packet.ReadUInt32("Lifetime", idx, "Inertia");
}

if (hasFall)
V6_0_2_19033.Parsers.MovementHandler.ReadFallData(packet, idx, "FallData");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ public static void ReadPvPMatchPlayerStatistics(Packet packet, params object[] i
packet.ReadInt32E<Class>("Class", idx);
packet.ReadInt32("CreatureID", idx);
packet.ReadInt32("HonorLevel", idx);
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
packet.ReadInt32("Role", idx);

for (int i = 0; i < statsCount; i++)
packet.ReadUInt32("Stats", i, idx);
Expand Down
3 changes: 2 additions & 1 deletion WowPacketParserModule.V8_0_1_27101/Parsers/GuildHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ public static class GuildHandler
public static void HandleGuildQueryResponse(Packet packet)
{
packet.ReadPackedGuid128("Guild Guid");
packet.ReadPackedGuid128("PlayerGUID");
if (ClientVersion.RemovedInVersion(ClientVersionBuild.V9_2_0_42423))
packet.ReadPackedGuid128("PlayerGUID");

var hasData = packet.ReadBit();
if (hasData)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ public static void HandleAccountDataTimes(Packet packet)
packet.ReadPackedGuid128("Guid");
packet.ReadTime64("ServerTime");

for (var i = 0; i < 12; ++i)
var count = ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423) ? 13 : 12;

for (var i = 0; i < count; ++i)
packet.ReadTime64($"[{(AccountDataType)i}] Time", i);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@ public static class BattlegroundHandler
[Parser(Opcode.SMSG_SEASON_INFO)]
public static void HandleSeasonInfo(Packet packet)
{
packet.ReadInt32("MythicPlusSeasonID");
packet.ReadInt32("CurrentSeason");
packet.ReadInt32("PreviousSeason");
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
packet.ReadInt32("MythicPlusDisplaySeasonID");

packet.ReadInt32("MythicPlusMilestoneSeasonID");
packet.ReadInt32("CurrentArenaSeason");
packet.ReadInt32("PreviousArenaSeason");
packet.ReadInt32("ConquestWeeklyProgressCurrencyID");
packet.ReadInt32("PvpSeasonID");
packet.ReadBit("WeeklyRewardChestsEnabled");
Expand Down
50 changes: 50 additions & 0 deletions WowPacketParserModule.V9_0_1_36216/Parsers/CharacterHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using WowPacketParser.Enums;
using WowPacketParser.Misc;
using WowPacketParser.Parsing;
using WowPacketParser.Proto;
using WowPacketParser.Store;
using WowPacketParser.Store.Objects;

Expand Down Expand Up @@ -259,5 +260,54 @@ public static void HandleCheckCharacterNameAvailability(Packet packet)
packet.ReadUInt32("SequenceIndex");
packet.ReadWoWString("Character Name", packet.ReadBits(6));
}

public static PacketQueryPlayerNameResponse ReadNameCacheLookupResult(Packet packet, params object[] idx)
{
var response = new PacketQueryPlayerNameResponse();
packet.ResetBitReader();
packet.ReadByte("Result", idx);
packet.ReadPackedGuid128("Player", idx);
var hasPlayerGuidLookupData = packet.ReadBit("HasPlayerGuidLookupData", idx);
var hasThingy = packet.ReadBit("HasNameCacheUnused920", idx);

if (hasPlayerGuidLookupData)
{
var data = V8_0_1_27101.Parsers.CharacterHandler.ReadPlayerGuidLookupData(packet, idx, "PlayerGuidLookupData");
response.Race = (uint)data.Race;
response.Gender = (uint)data.Gender;
response.Class = (uint)data.Class;
response.Level = data.Level;
response.HasData = true;
}

if (hasThingy)
{
packet.ResetBitReader();
packet.ReadUInt32("Unused1", idx, "NameCacheUnused920");
packet.ReadPackedGuid128("Unused2", idx, "NameCacheUnused920");
var length = packet.ReadBits(7);
packet.ReadWoWString("Unused3", length, idx, "NameCacheUnused920");
}

return response;
}

[Parser(Opcode.CMSG_QUERY_PLAYER_NAME, ClientVersionBuild.V9_2_0_42423)]
public static void HandleNameQuery(Packet packet)
{
var count = packet.ReadUInt32();
for (var i = 0; i < count; ++i)
packet.ReadPackedGuid128("Players", i);
}

[Parser(Opcode.SMSG_QUERY_PLAYER_NAME_RESPONSE, ClientVersionBuild.V9_2_0_42423)]
public static void HandleNameQueryResponse(Packet packet)
{
var response = packet.Holder.QueryPlayerNameResponse = new();

var count = packet.ReadUInt32("Count");
for (var i = 0; i < count; ++i)
response.Responses.Add(ReadNameCacheLookupResult(packet, i));
}
}
}
6 changes: 6 additions & 0 deletions WowPacketParserModule.V9_0_1_36216/Parsers/ChatHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ public static void HandleEmote(Packet packet)
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_0_5_37503))
{
var count = packet.ReadUInt32("SpellVisualKitCount");
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
packet.ReadInt32("SequenceVariation");

for (var i = 0; i < count; ++i)
packet.ReadUInt32("SpellVisualKitID", i);
}
Expand All @@ -102,6 +105,9 @@ public static void HandleSendTextEmote(Packet packet)
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_0_5_37503) || ClientVersion.IsBurningCrusadeClassicClientVersionBuild(ClientVersion.Build))
{
var count = packet.ReadUInt32("SpellVisualKitCount");
if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423))
packet.ReadInt32("SequenceVariation");

for (var i = 0; i < count; ++i)
packet.ReadUInt32("SpellVisualKitID", i);
}
Expand Down
Loading

0 comments on commit 565d59d

Please sign in to comment.