diff --git a/WowPacketParser/Enums/ClientVersionBuild.cs b/WowPacketParser/Enums/ClientVersionBuild.cs index 5da281b0c8..3dab29535e 100644 --- a/WowPacketParser/Enums/ClientVersionBuild.cs +++ b/WowPacketParser/Enums/ClientVersionBuild.cs @@ -892,6 +892,13 @@ public enum ClientVersionBuild V2_5_4_44400 = 44400, // both live and ptr V2_5_4_44833 = 44833, // both live and ptr + V2_5_5_64796 = 64796, // ptr + V2_5_5_64912 = 64912, // ptr + V2_5_5_65000 = 65000, // ptr + V2_5_5_65417 = 65417, // ptr and live + V2_5_5_65676 = 65676, // live + V2_5_5_65795 = 65795, // live + V3_4_0_44832 = 44832, // ptr / beta V3_4_0_45166 = 45166, // ptr / beta V3_4_0_45189 = 45189, // ptr / beta diff --git a/WowPacketParser/Enums/Version/Opcodes.cs b/WowPacketParser/Enums/Version/Opcodes.cs index f9bdd53cac..2c23a69859 100644 --- a/WowPacketParser/Enums/Version/Opcodes.cs +++ b/WowPacketParser/Enums/Version/Opcodes.cs @@ -103,6 +103,7 @@ using WowPacketParser.Enums.Version.V11_2_7_64877; using WowPacketParser.Enums.Version.V12_0_0_65390; using WowPacketParser.Misc; +using WowPacketParser.Enums.Version.V2_5_5_64796; namespace WowPacketParser.Enums.Version { @@ -1214,6 +1215,13 @@ public static ClientVersionBuild GetOpcodeDefiningBuild(ClientVersionBuild build case ClientVersionBuild.V5_5_2_64271: case ClientVersionBuild.V5_5_2_64481: return ClientVersionBuild.V5_5_2_64068; + case ClientVersionBuild.V2_5_5_64796: + case ClientVersionBuild.V2_5_5_64912: + case ClientVersionBuild.V2_5_5_65000: + case ClientVersionBuild.V2_5_5_65417: + case ClientVersionBuild.V2_5_5_65676: + case ClientVersionBuild.V2_5_5_65795: + return ClientVersionBuild.V2_5_5_64796; default: return ClientVersionBuild.V3_3_5a_12340; } @@ -1411,6 +1419,8 @@ public static BiDictionary GetOpcodeDictionary(ClientVersionBuild b return Opcodes_2_5_3.Opcodes(direction); case ClientVersionBuild.V2_5_4_42695: return Opcodes_2_5_4.Opcodes(direction); + case ClientVersionBuild.V2_5_5_64796: + return Opcodes_2_5_5.Opcodes(direction); case ClientVersionBuild.V3_4_0_45166: return Opcodes_3_4_0.Opcodes(direction); case ClientVersionBuild.V3_4_1_47014: diff --git a/WowPacketParser/Enums/Version/UpdateFields.cs b/WowPacketParser/Enums/Version/UpdateFields.cs index 407e317865..f0375c3298 100644 --- a/WowPacketParser/Enums/Version/UpdateFields.cs +++ b/WowPacketParser/Enums/Version/UpdateFields.cs @@ -1278,6 +1278,15 @@ private static string GetUpdateFieldDictionaryBuildName(ClientVersionBuild build { return "V2_5_4_42800"; } + case ClientVersionBuild.V2_5_5_64796: + case ClientVersionBuild.V2_5_5_64912: + case ClientVersionBuild.V2_5_5_65000: + case ClientVersionBuild.V2_5_5_65417: + case ClientVersionBuild.V2_5_5_65676: + case ClientVersionBuild.V2_5_5_65795: + { + return "V2_5_5_64796"; + } case ClientVersionBuild.V3_4_0_45166: case ClientVersionBuild.V3_4_0_44832: case ClientVersionBuild.V3_4_0_45189: diff --git a/WowPacketParser/Enums/Version/V2_5_5_64796/Opcodes.cs b/WowPacketParser/Enums/Version/V2_5_5_64796/Opcodes.cs new file mode 100644 index 0000000000..85c1a56f0c --- /dev/null +++ b/WowPacketParser/Enums/Version/V2_5_5_64796/Opcodes.cs @@ -0,0 +1,42 @@ +using WowPacketParser.Misc; + +namespace WowPacketParser.Enums.Version.V2_5_5_64796 +{ + public static class Opcodes_2_5_5 + { + public static BiDictionary Opcodes(Direction direction) + { + switch (direction) + { + case Direction.ClientToServer: + return ClientOpcodes; + case Direction.ServerToClient: + return ServerOpcodes; + default: + return MiscOpcodes; + } + } + + private static readonly BiDictionary ClientOpcodes = new() + { + { Opcode.CMSG_CHAT_MESSAGE_SAY, 0x2F0023 }, + { Opcode.CMSG_SEND_TEXT_EMOTE, 0x3E0013 }, + { Opcode.CMSG_USE_ITEM, 0x30016B }, + }; + + private static readonly BiDictionary ServerOpcodes = new() + { + { Opcode.SMSG_TEXT_EMOTE, 0x440121 }, + { Opcode.SMSG_EMOTE, 0x440270 }, + { Opcode.SMSG_CHAT, 0x490001 }, + { Opcode.SMSG_ON_MONSTER_MOVE, 0x5C0002 }, + { Opcode.SMSG_UPDATE_OBJECT, 0x5A0000 }, + { Opcode.SMSG_AURA_UPDATE, 0x630011 }, + { Opcode.SMSG_SPELL_GO, 0x630028 }, + { Opcode.SMSG_SPELL_START, 0x630029 }, + { Opcode.SMSG_PET_SPELLS_MESSAGE, 0x630014 }, + }; + + private static readonly BiDictionary MiscOpcodes = new(); + } +} diff --git a/WowPacketParser/Misc/ClientVersion.cs b/WowPacketParser/Misc/ClientVersion.cs index 256ff5a84c..d551bce44f 100644 --- a/WowPacketParser/Misc/ClientVersion.cs +++ b/WowPacketParser/Misc/ClientVersion.cs @@ -1665,6 +1665,12 @@ public static ClientVersionBuild GetVersionDefiningBuild(ClientVersionBuild buil case ClientVersionBuild.V1_15_8_64272: case ClientVersionBuild.V1_15_8_64858: case ClientVersionBuild.V1_15_8_64907: + case ClientVersionBuild.V2_5_5_64796: + case ClientVersionBuild.V2_5_5_64912: + case ClientVersionBuild.V2_5_5_65000: + case ClientVersionBuild.V2_5_5_65417: + case ClientVersionBuild.V2_5_5_65676: + case ClientVersionBuild.V2_5_5_65795: return ClientVersionBuild.V5_5_0_61735; case ClientVersionBuild.BattleNetV37165: return ClientVersionBuild.BattleNetV37165; @@ -2159,6 +2165,12 @@ public static bool IsBurningCrusadeClassicClientVersionBuild(ClientVersionBuild case ClientVersionBuild.V2_5_4_44171: case ClientVersionBuild.V2_5_4_44400: case ClientVersionBuild.V2_5_4_44833: + case ClientVersionBuild.V2_5_5_64796: + case ClientVersionBuild.V2_5_5_64912: + case ClientVersionBuild.V2_5_5_65000: + case ClientVersionBuild.V2_5_5_65417: + case ClientVersionBuild.V2_5_5_65676: + case ClientVersionBuild.V2_5_5_65795: return true; default: return false; diff --git a/WowPacketParserModule.V5_5_0_61735/Parsers/MovementHandler1158.cs b/WowPacketParserModule.V5_5_0_61735/Parsers/MovementHandler1158.cs index 961abca498..1e1cd2f357 100644 --- a/WowPacketParserModule.V5_5_0_61735/Parsers/MovementHandler1158.cs +++ b/WowPacketParserModule.V5_5_0_61735/Parsers/MovementHandler1158.cs @@ -369,6 +369,7 @@ public static void ReadMoveStateChange(Packet packet, params object[] idx) } [Parser(Opcode.SMSG_ON_MONSTER_MOVE, ClientBranch.Classic)] + [Parser(Opcode.SMSG_ON_MONSTER_MOVE, ClientBranch.TBC)] public static void HandleOnMonsterMove(Packet packet) { PacketMonsterMove monsterMove = packet.Holder.MonsterMove = new(); diff --git a/WowPacketParserModule.V5_5_0_61735/Parsers/SpellHandler.cs b/WowPacketParserModule.V5_5_0_61735/Parsers/SpellHandler.cs index 20306a5c5e..3975f615cd 100644 --- a/WowPacketParserModule.V5_5_0_61735/Parsers/SpellHandler.cs +++ b/WowPacketParserModule.V5_5_0_61735/Parsers/SpellHandler.cs @@ -778,7 +778,7 @@ public static void HandleSpellDispelLog(Packet packet) } [HasSniffData] - [Parser(Opcode.SMSG_AURA_UPDATE)] + [Parser(Opcode.SMSG_AURA_UPDATE, ClientBranch.MoP)] public static void HandleAuraUpdate(Packet packet) { PacketAuraUpdate packetAuraUpdate = packet.Holder.AuraUpdate = new(); @@ -1064,7 +1064,7 @@ public static void SpellPrepare(Packet packet) packet.ReadPackedGuid128("ServerCastID"); } - [Parser(Opcode.SMSG_SPELL_GO)] + [Parser(Opcode.SMSG_SPELL_GO, ClientBranch.MoP)] public static void HandleSpellGo(Packet packet) { PacketSpellGo packetSpellGo = new(); diff --git a/WowPacketParserModule.V5_5_0_61735/Parsers/SpellHandler1158.cs b/WowPacketParserModule.V5_5_0_61735/Parsers/SpellHandler1158.cs index 62477f3174..ddd5bdcd45 100644 --- a/WowPacketParserModule.V5_5_0_61735/Parsers/SpellHandler1158.cs +++ b/WowPacketParserModule.V5_5_0_61735/Parsers/SpellHandler1158.cs @@ -40,6 +40,7 @@ public static void ReadPetSpellHistoryData(Packet packet, params object[] idx) } [Parser(Opcode.SMSG_PET_SPELLS_MESSAGE, ClientBranch.Classic)] + [Parser(Opcode.SMSG_PET_SPELLS_MESSAGE, ClientBranch.TBC)] public static void HandlePetSpells(Packet packet) { var petGuid = packet.ReadPackedGuid128("PetGUID"); @@ -95,5 +96,347 @@ public static void HandlePetSpells(Packet packet) for (int i = 0; i < spellHistoryCount; i++) ReadPetSpellHistoryData(packet, i, "PetSpellHistory"); } + + [HasSniffData] + [Parser(Opcode.SMSG_AURA_UPDATE, ClientBranch.TBC)] + public static void HandleAuraUpdate(Packet packet) + { + PacketAuraUpdate packetAuraUpdate = packet.Holder.AuraUpdate = new(); + packet.ReadBit("UpdateAll"); + var count = packet.ReadBits("AurasCount", 9); + + var auras = new List(); + for (var i = 0; i < count; ++i) + { + var auraEntry = new PacketAuraUpdateEntry(); + packetAuraUpdate.Updates.Add(auraEntry); + var aura = new Aura(); + + auraEntry.Slot = packet.ReadUInt16("Slot", i); + + packet.ResetBitReader(); + var hasAura = packet.ReadBit("HasAura", i); + auraEntry.Remove = !hasAura; + if (hasAura) + { + packet.ReadPackedGuid128("CastID", i); + aura.SpellId = auraEntry.Spell = (uint)packet.ReadInt32("SpellID", i); + packet.ReadInt32("SpellXSpellVisualID", i); + var flags = packet.ReadUInt16E("Flags", i); + aura.AuraFlags = flags; + auraEntry.Flags = flags.ToUniversal(); + packet.ReadUInt32("ActiveFlags", i); + aura.Level = packet.ReadUInt16("CastLevel", i); + aura.Charges = packet.ReadByte("Applications", i); + packet.ReadInt32("ContentTuningID", i); + packet.ReadVector3("DstLocation", i); + + packet.ResetBitReader(); + + var hasCastUnit = packet.ReadBit("HasCastUnit", i); + var hasCastItem = ClientVersion.AddedInVersion(ClientBranch.TBC, ClientVersionBuild.V2_5_5_64796) && packet.ReadBit("HasCastItem", i); + var hasDuration = packet.ReadBit("HasDuration", i); + var hasRemaining = packet.ReadBit("HasRemaining", i); + + var hasTimeMod = packet.ReadBit("HasTimeMod", i); + + var pointsCount = packet.ReadBits("PointsCount", 6, i); + var effectCount = packet.ReadBits("EstimatedPoints", 6, i); + + var hasContentTuning = packet.ReadBit("HasContentTuning", i); + + if (hasContentTuning) + CombatLogHandler.ReadContentTuningParams(packet, i, "ContentTuning"); + + if (hasCastUnit) + auraEntry.CasterUnit = packet.ReadPackedGuid128("CastUnit", i); + + if (hasCastItem) + packet.ReadPackedGuid128("CastItem", i); + + aura.Duration = hasDuration ? packet.ReadInt32("Duration", i) : 0; + aura.MaxDuration = hasRemaining ? packet.ReadInt32("Remaining", i) : 0; + + if (hasDuration) + auraEntry.Duration = aura.Duration; + + if (hasRemaining) + auraEntry.Remaining = aura.MaxDuration; + + if (hasTimeMod) + packet.ReadSingle("TimeMod"); + + for (var j = 0; j < pointsCount; ++j) + packet.ReadSingle("Points", i, j); + + for (var j = 0; j < effectCount; ++j) + packet.ReadSingle("EstimatedPoints", i, j); + + auras.Add(aura); + packet.AddSniffData(StoreNameType.Spell, (int)aura.SpellId, "AURA_UPDATE"); + } + } + + var guid = packet.ReadPackedGuid128("UnitGUID"); + packetAuraUpdate.Unit = guid; + + if (Storage.Objects.ContainsKey(guid)) + { + var unit = Storage.Objects[guid].Item1 as Unit; + if (unit != null) + { + // If this is the first packet that sends auras + // (hopefully at spawn time) add it to the "Auras" field, + // if not create another row of auras in AddedAuras + // (similar to ChangedUpdateFields) + + if (unit.Auras == null) + unit.Auras = auras; + else + unit.AddedAuras.Add(auras); + } + } + } + + public static void ReadSpellCastLogData(Packet packet, params object[] idx) + { + packet.ReadInt64("Health", idx); + packet.ReadInt32("AttackPower", idx); + packet.ReadInt32("SpellPower", idx); + packet.ReadInt32("Armor", idx); + packet.ReadInt32("Unknown_1105_1", idx); + packet.ReadInt32("Unknown_1105_2", idx); + + packet.ResetBitReader(); + + var spellLogPowerDataCount = packet.ReadBits("SpellLogPowerData", 9, idx); + + // SpellLogPowerData + for (var i = 0; i < spellLogPowerDataCount; ++i) + { + packet.ReadByteE("PowerType", idx, i); + packet.ReadInt32("Amount", idx, i); + packet.ReadInt32("Cost", idx, i); + } + } + + public static void ReadMissileTrajectoryResult(Packet packet, params object[] idx) + { + packet.ReadUInt32("TravelTime", idx); + packet.ReadSingle("Pitch", idx); + } + + public static void ReadCreatureImmunities(Packet packet, params object[] idx) + { + packet.ReadUInt32("School", idx); + packet.ReadUInt32("Value", idx); + } + + public static void ReadSpellHealPrediction(Packet packet, params object[] idx) + { + packet.ReadInt32("Points", idx); + if (ClientVersion.AddedInVersion(ClientBranch.TBC, ClientVersionBuild.V2_5_5_64796)) + packet.ReadInt32("Type", idx); + else + packet.ReadByte("Type", idx); + packet.ReadPackedGuid128("BeaconGUID", idx); + } + + public static Vector3 ReadLocation(Packet packet, params object[] idx) + { + packet.ReadPackedGuid128("Transport", idx); + return packet.ReadVector3("Location", idx); + } + + public static void ReadSpellTargetData(Packet packet, PacketSpellData packetSpellData, uint spellID, params object[] idx) + { + packet.ResetBitReader(); + + if (ClientVersion.AddedInVersion(ClientBranch.TBC, ClientVersionBuild.V2_5_5_64796)) + packet.ReadUInt32E("Flags", idx); + else + packet.ReadBitsE("Flags", 28, idx); + + if (ClientVersion.AddedInVersion(ClientBranch.TBC, ClientVersionBuild.V2_5_5_64796)) + { + var targetUnit = packet.ReadPackedGuid128("Unit", idx); + if (packetSpellData != null) + packetSpellData.TargetUnit = targetUnit; + packet.ReadPackedGuid128("Item", idx); + } + + if (ClientVersion.AddedInVersion(ClientBranch.TBC, ClientVersionBuild.V2_5_5_64796)) + { + packet.ReadPackedGuid128("HousingGUID", idx); + packet.ReadBit("HousingIsResident", idx); + } + + var hasSrcLoc = packet.ReadBit("HasSrcLocation", idx); + var hasDstLoc = packet.ReadBit("HasDstLocation", idx); + var hasOrient = packet.ReadBit("HasOrientation", idx); + var hasMapID = packet.ReadBit("hasMapID ", idx); + var nameLength = packet.ReadBits(7); + + if (ClientVersion.RemovedInVersion(ClientBranch.TBC, ClientVersionBuild.V2_5_5_64796)) + { + var targetUnit = packet.ReadPackedGuid128("Unit", idx); + if (packetSpellData != null) + packetSpellData.TargetUnit = targetUnit; + packet.ReadPackedGuid128("Item", idx); + } + + if (hasSrcLoc) + ReadLocation(packet, idx, "SrcLocation"); + + Vector3? dstLocation = null; + if (hasDstLoc) + { + ReadLocation(packet, idx, "DstLocation"); + if (packetSpellData != null) + packetSpellData.DstLocation = dstLocation; + } + + if (hasOrient) + packet.ReadSingle("Orientation", idx); + + int mapID = -1; + if (hasMapID) + mapID = (ushort)packet.ReadInt32("MapID", idx); + + if (Settings.UseDBC && dstLocation != null && mapID != -1) + { + for (uint i = 0; i < 32; i++) + { + var tuple = Tuple.Create(spellID, i); + if (DBC.SpellEffectStores.ContainsKey(tuple)) + { + var effect = DBC.SpellEffectStores[tuple]; + if ((Targets)effect.ImplicitTarget[0] == Targets.TARGET_DEST_DB || (Targets)effect.ImplicitTarget[1] == Targets.TARGET_DEST_DB) + { + string effectHelper = $"Spell: {StoreGetters.GetName(StoreNameType.Spell, (int)spellID)} Efffect: {effect.Effect} ({(SpellEffects)effect.Effect})"; + + var spellTargetPosition = new SpellTargetPosition + { + ID = spellID, + EffectIndex = (byte)i, + PositionX = dstLocation.Value.X, + PositionY = dstLocation.Value.Y, + PositionZ = dstLocation.Value.Z, + MapID = (ushort)mapID, + EffectHelper = effectHelper + }; + + if (!Storage.SpellTargetPositions.ContainsKey(spellTargetPosition)) + Storage.SpellTargetPositions.Add(spellTargetPosition); + } + } + } + } + + packet.ReadWoWString("Name", nameLength, idx); + } + + public static void ReadSpellMissStatus(Packet packet, params object[] idx) + { + var reason = packet.ReadByte("Reason", idx); // TODO enum + if (reason == 11) + packet.ReadByte("ReflectStatus", idx); + } + + public static void ReadSpellPowerData(Packet packet, params object[] idx) + { + packet.ReadByteE("Type", idx); + packet.ReadInt32("Cost", idx); + } + + public static void ReadRuneData(Packet packet, params object[] indexes) + { + packet.ReadByte("Start", indexes); + packet.ReadByte("Count", indexes); + + var cooldownCount = packet.ReadUInt32("CooldownCount", indexes); + for (var i = 0; i < cooldownCount; ++i) + packet.ReadByte("Cooldown", indexes); + } + + public static PacketSpellData ReadSpellCastData(Packet packet, params object[] idx) + { + var packetSpellData = new PacketSpellData(); + packet.ReadPackedGuid128("CasterGUID", idx); + packetSpellData.Caster = packet.ReadPackedGuid128("CasterUnit", idx); + + packetSpellData.CastGuid = packet.ReadPackedGuid128("CastID", idx); + packet.ReadPackedGuid128("OriginalCastID", idx); + + var spellID = packetSpellData.Spell = packet.ReadUInt32("SpellID", idx); + packet.ReadUInt32("SpellXSpellVisualID", idx); + + packetSpellData.Flags = packet.ReadUInt32("CastFlags", idx); + packetSpellData.Flags2 = packet.ReadUInt32("CastFlagsEx", idx); + packet.ReadUInt32("CastFlagsEx2", idx); + packetSpellData.CastTime = packet.ReadUInt32("CastTime", idx); + + ReadMissileTrajectoryResult(packet, idx, "MissileTrajectory"); + + packet.ReadByte("DestLocSpellCastIndex", idx); + + ReadCreatureImmunities(packet, idx, "Immunities"); + + ReadSpellHealPrediction(packet, idx, "Predict"); + + packet.ResetBitReader(); + + var hitTargetsCount = packet.ReadBits("HitTargetsCount", 16, idx); + var missTargetsCount = packet.ReadBits("MissTargetsCount", 16, idx); + var missStatusCount = packet.ReadBits("MissStatusCount", 16, idx); + var remainingPowerCount = packet.ReadBits("RemainingPowerCount", 9, idx); + + var hasRuneData = packet.ReadBit("HasRuneData", idx); + var targetPointsCount = packet.ReadBits("TargetPointsCount", 16, idx); + var hasAmmoDisplayId = packet.ReadBit("HasAmmoDisplayId", idx); + var hasAmmoInventoryType = packet.ReadBit("HasAmmoInventoryType", idx); + + ReadSpellTargetData(packet, packetSpellData, spellID, idx, "Target"); + + for (var i = 0; i < hitTargetsCount; ++i) + packetSpellData.HitTargets.Add(packet.ReadPackedGuid128("HitTarget", idx, i)); + + for (var i = 0; i < missTargetsCount; ++i) + packetSpellData.MissedTargets.Add(packet.ReadPackedGuid128("MissTarget", idx, i)); + + for (var i = 0; i < missStatusCount; ++i) + ReadSpellMissStatus(packet, idx, "MissStatus", i); + + for (var i = 0; i < remainingPowerCount; ++i) + ReadSpellPowerData(packet, idx, "RemainingPower", i); + + if (hasRuneData) + ReadRuneData(packet, idx, "RemainingRunes"); + + for (var i = 0; i < targetPointsCount; ++i) + packetSpellData.TargetPoints.Add(ReadLocation(packet, idx, "TargetPoints", i)); + + if (hasAmmoDisplayId) + packetSpellData.AmmoDisplayId = packet.ReadInt32("AmmoDisplayId", idx); + + if (hasAmmoInventoryType) + packetSpellData.AmmoInventoryType = (uint)packet.ReadInt32E("InventoryType", idx); + + return packetSpellData; + } + + [Parser(Opcode.SMSG_SPELL_GO, ClientBranch.Classic)] + [Parser(Opcode.SMSG_SPELL_GO, ClientBranch.TBC)] + public static void HandleSpellGo(Packet packet) + { + PacketSpellGo packetSpellGo = new(); + packetSpellGo.Data = ReadSpellCastData(packet, "Cast"); + packet.Holder.SpellGo = packetSpellGo; + + packet.ResetBitReader(); + var hasLog = packet.ReadBit(); + if (hasLog) + ReadSpellCastLogData(packet, "LogData"); + } } } diff --git a/WowPacketParserModule.V5_5_0_61735/Parsers/UpdateFieldsHandler1158.cs b/WowPacketParserModule.V5_5_0_61735/Parsers/UpdateFieldsHandler1158.cs index f8ffa2ddf7..161632e043 100644 --- a/WowPacketParserModule.V5_5_0_61735/Parsers/UpdateFieldsHandler1158.cs +++ b/WowPacketParserModule.V5_5_0_61735/Parsers/UpdateFieldsHandler1158.cs @@ -495,6 +495,8 @@ public static IUnitChannel ReadUpdateUnitChannel(Packet packet, params object[] packet.ResetBitReader(); data.SpellID = packet.ReadInt32("SpellID", indexes); data.SpellXSpellVisualID = packet.ReadInt32("SpellXSpellVisualID", indexes); + data.StartTimeMs = packet.ReadUInt32("StartTimeMs", indexes); + data.Duration = packet.ReadUInt32("Duration", indexes); return data; } diff --git a/WowPacketParserModule.V5_5_0_61735/Parsers/UpdateFieldsHandler255.cs b/WowPacketParserModule.V5_5_0_61735/Parsers/UpdateFieldsHandler255.cs new file mode 100644 index 0000000000..3c9c4cfc29 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/Parsers/UpdateFieldsHandler255.cs @@ -0,0 +1,5128 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using System.Collections; +using System.Linq; +using WowPacketParser.Enums; +using WowPacketParser.Misc; +using WowPacketParser.Parsing.Parsers; +using WowPacketParser.Store.Objects.UpdateFields; +using WowPacketParserModule.V5_5_0_61735.Parsers; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class UpdateFieldHandler : UpdateFieldsHandlerBase + { + public override IObjectData ReadCreateObjectData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new ObjectData(); + packet.ResetBitReader(); + data.EntryID = packet.ReadInt32("EntryID", indexes); + data.DynamicFlags = packet.ReadUInt32("DynamicFlags", indexes); + data.Scale = packet.ReadSingle("Scale", indexes); + return data; + } + + public override IObjectData ReadUpdateObjectData(Packet packet, params object[] indexes) + { + var data = new ObjectData(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(4); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.EntryID = packet.ReadInt32("EntryID", indexes); + } + if (changesMask[2]) + { + data.DynamicFlags = packet.ReadUInt32("DynamicFlags", indexes); + } + if (changesMask[3]) + { + data.Scale = packet.ReadSingle("Scale", indexes); + } + } + return data; + } + + public static IItemEnchantment ReadCreateItemEnchantment(Packet packet, params object[] indexes) + { + var data = new ItemEnchantment(); + packet.ResetBitReader(); + data.ID = packet.ReadInt32("ID", indexes); + data.Duration = packet.ReadUInt32("Duration", indexes); + data.Charges = packet.ReadInt16("Charges", indexes); + data.Inactive = packet.ReadUInt16("Inactive", indexes); + return data; + } + + public static IItemEnchantment ReadUpdateItemEnchantment(Packet packet, params object[] indexes) + { + var data = new ItemEnchantment(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(5); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.ID = packet.ReadInt32("ID", indexes); + } + if (changesMask[2]) + { + data.Duration = packet.ReadUInt32("Duration", indexes); + } + if (changesMask[3]) + { + data.Charges = packet.ReadInt16("Charges", indexes); + } + if (changesMask[4]) + { + data.Inactive = packet.ReadUInt16("Inactive", indexes); + } + } + return data; + } + + public static IItemMod ReadCreateItemMod(Packet packet, params object[] indexes) + { + var data = new ItemMod(); + packet.ResetBitReader(); + data.Type = packet.ReadByte("Type", indexes); + data.Value = packet.ReadInt32("Value", indexes); + return data; + } + + public static IItemMod ReadUpdateItemMod(Packet packet, params object[] indexes) + { + var data = new ItemMod(); + packet.ResetBitReader(); + data.Type = packet.ReadByte("Type", indexes); + data.Value = packet.ReadInt32("Value", indexes); + return data; + } + + public static IItemModList ReadCreateItemModList(Packet packet, params object[] indexes) + { + var data = new ItemModList(); + packet.ResetBitReader(); + data.Values.Resize(packet.ReadBits(6)); + for (var i = 0; i < data.Values.Count; ++i) + { + data.Values[i] = ReadCreateItemMod(packet, indexes, "Values", i); + } + return data; + } + + public static IItemModList ReadUpdateItemModList(Packet packet, params object[] indexes) + { + var data = new ItemModList(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(1); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + data.Values.ReadUpdateMask(packet, 6); + } + packet.ResetBitReader(); + if (changesMask[0]) + { + for (var i = 0; i < data.Values.Count; ++i) + { + if (data.Values.UpdateMask[i]) + { + data.Values[i] = ReadUpdateItemMod(packet, indexes, "Values", i); + } + } + } + return data; + } + + public static IArtifactPower ReadCreateArtifactPower(Packet packet, params object[] indexes) + { + var data = new ArtifactPower(); + packet.ResetBitReader(); + data.ArtifactPowerID = packet.ReadInt16("ArtifactPowerID", indexes); + data.PurchasedRank = packet.ReadByte("PurchasedRank", indexes); + data.CurrentRankWithBonus = packet.ReadByte("CurrentRankWithBonus", indexes); + return data; + } + + public static IArtifactPower ReadUpdateArtifactPower(Packet packet, params object[] indexes) + { + var data = new ArtifactPower(); + packet.ResetBitReader(); + data.ArtifactPowerID = packet.ReadInt16("ArtifactPowerID", indexes); + data.PurchasedRank = packet.ReadByte("PurchasedRank", indexes); + data.CurrentRankWithBonus = packet.ReadByte("CurrentRankWithBonus", indexes); + return data; + } + + public static ISocketedGem ReadCreateSocketedGem(Packet packet, params object[] indexes) + { + var data = new SocketedGem(); + packet.ResetBitReader(); + data.ItemID = packet.ReadInt32("ItemID", indexes); + for (var i = 0; i < 16; ++i) + { + data.BonusListIDs[i] = packet.ReadUInt16("BonusListIDs", indexes, i); + } + data.Context = packet.ReadByte("Context", indexes); + return data; + } + + public static ISocketedGem ReadUpdateSocketedGem(Packet packet, params object[] indexes) + { + var data = new SocketedGem(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + var rawMaskMask = new int[1]; + rawMaskMask[0] = (int)packet.ReadBits(1); + var maskMask = new BitArray(rawMaskMask); + if (maskMask[0]) + rawChangesMask[0] = (int)packet.ReadBits(32); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.ItemID = packet.ReadInt32("ItemID", indexes); + } + if (changesMask[2]) + { + data.Context = packet.ReadByte("Context", indexes); + } + } + if (changesMask[3]) + { + for (var i = 0; i < 16; ++i) + { + if (changesMask[4 + i]) + { + data.BonusListIDs[i] = packet.ReadUInt16("BonusListIDs", indexes, i); + } + } + } + return data; + } + + public override IItemData ReadCreateItemData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new ItemData(); + packet.ResetBitReader(); + data.Owner = packet.ReadPackedGuid128("Owner", indexes); + data.ContainedIn = packet.ReadPackedGuid128("ContainedIn", indexes); + data.Creator = packet.ReadPackedGuid128("Creator", indexes); + data.GiftCreator = packet.ReadPackedGuid128("GiftCreator", indexes); + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + data.StackCount = packet.ReadUInt32("StackCount", indexes); + data.Expiration = packet.ReadUInt32("Expiration", indexes); + for (var i = 0; i < 5; ++i) + { + data.SpellCharges[i] = packet.ReadInt32("SpellCharges", indexes, i); + } + } + data.DynamicFlags = packet.ReadUInt32("DynamicFlags", indexes); + for (var i = 0; i < 13; ++i) + { + data.Enchantment[i] = ReadCreateItemEnchantment(packet, indexes, "Enchantment", i); + } + data.PropertySeed = packet.ReadInt32("PropertySeed", indexes); + data.RandomPropertiesID = packet.ReadInt32("RandomPropertiesID", indexes); + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + data.Durability = packet.ReadUInt32("Durability", indexes); + data.MaxDurability = packet.ReadUInt32("MaxDurability", indexes); + } + data.CreatePlayedTime = packet.ReadUInt32("CreatePlayedTime", indexes); + data.Context = packet.ReadByte("Context", indexes); + data.CreateTime = packet.ReadInt64("CreateTime", indexes); + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + data.ArtifactXP = packet.ReadUInt64("ArtifactXP", indexes); + data.ItemAppearanceModID = packet.ReadByte("ItemAppearanceModID", indexes); + } + data.ArtifactPowers.Resize(packet.ReadUInt32()); + data.Gems.Resize(packet.ReadUInt32()); + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + data.ZoneFlags = packet.ReadUInt32("ZoneFlags", indexes); + } + Substructures.ItemHandler.ReadItemBonusKey(packet, indexes, "ItemBonusKey"); + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + data.DEBUGItemLevel = packet.ReadUInt16("DEBUGItemLevel", indexes); + } + for (var i = 0; i < data.ArtifactPowers.Count; ++i) + { + data.ArtifactPowers[i] = ReadCreateArtifactPower(packet, indexes, "ArtifactPowers", i); + } + for (var i = 0; i < data.Gems.Count; ++i) + { + data.Gems[i] = ReadCreateSocketedGem(packet, indexes, "Gems", i); + } + data.Modifiers = ReadCreateItemModList(packet, indexes, "Modifiers"); + return data; + } + + public override IItemData ReadUpdateItemData(Packet packet, params object[] indexes) + { + var data = new ItemData(); + packet.ResetBitReader(); + var rawChangesMask = new int[2]; + var rawMaskMask = new int[1]; + rawMaskMask[0] = (int)packet.ReadBits(2); + var maskMask = new BitArray(rawMaskMask); + for (var i = 0; i < 2; ++i) + if (maskMask[i]) + rawChangesMask[i] = (int)packet.ReadBits(32); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.ArtifactPowers.ReadUpdateMask(packet); + } + if (changesMask[2]) + { + data.Gems.ReadUpdateMask(packet); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (var i = 0; i < data.ArtifactPowers.Count; ++i) + { + if (data.ArtifactPowers.UpdateMask[i]) + { + data.ArtifactPowers[i] = ReadUpdateArtifactPower(packet, indexes, "ArtifactPowers", i); + } + } + } + if (changesMask[2]) + { + for (var i = 0; i < data.Gems.Count; ++i) + { + if (data.Gems.UpdateMask[i]) + { + data.Gems[i] = ReadUpdateSocketedGem(packet, indexes, "Gems", i); + } + } + } + if (changesMask[3]) + { + data.Owner = packet.ReadPackedGuid128("Owner", indexes); + } + if (changesMask[4]) + { + data.ContainedIn = packet.ReadPackedGuid128("ContainedIn", indexes); + } + if (changesMask[5]) + { + data.Creator = packet.ReadPackedGuid128("Creator", indexes); + } + if (changesMask[6]) + { + data.GiftCreator = packet.ReadPackedGuid128("GiftCreator", indexes); + } + if (changesMask[7]) + { + data.StackCount = packet.ReadUInt32("StackCount", indexes); + } + if (changesMask[8]) + { + data.Expiration = packet.ReadUInt32("Expiration", indexes); + } + if (changesMask[9]) + { + data.DynamicFlags = packet.ReadUInt32("DynamicFlags", indexes); + } + if (changesMask[10]) + { + data.PropertySeed = packet.ReadInt32("PropertySeed", indexes); + } + if (changesMask[11]) + { + data.RandomPropertiesID = packet.ReadInt32("RandomPropertiesID", indexes); + } + if (changesMask[12]) + { + data.Durability = packet.ReadUInt32("Durability", indexes); + } + if (changesMask[13]) + { + data.MaxDurability = packet.ReadUInt32("MaxDurability", indexes); + } + if (changesMask[14]) + { + data.CreatePlayedTime = packet.ReadUInt32("CreatePlayedTime", indexes); + } + if (changesMask[15]) + { + data.Context = packet.ReadByte("Context", indexes); + } + if (changesMask[16]) + { + data.CreateTime = packet.ReadInt64("CreateTime", indexes); + } + if (changesMask[17]) + { + data.ArtifactXP = packet.ReadUInt64("ArtifactXP", indexes); + } + if (changesMask[18]) + { + data.ItemAppearanceModID = packet.ReadByte("ItemAppearanceModID", indexes); + } + if (changesMask[20]) + { + data.ZoneFlags = packet.ReadUInt32("ZoneFlags", indexes); + } + if (changesMask[21]) + { + Substructures.ItemHandler.ReadItemBonusKey(packet, indexes, "ItemBonusKey"); + } + if (changesMask[22]) + { + data.DEBUGItemLevel = packet.ReadUInt16("DEBUGItemLevel", indexes); + } + if (changesMask[19]) + { + data.Modifiers = ReadUpdateItemModList(packet, indexes, "Modifiers"); + } + } + if (changesMask[23]) + { + for (var i = 0; i < 5; ++i) + { + if (changesMask[24 + i]) + { + data.SpellCharges[i] = packet.ReadInt32("SpellCharges", indexes, i); + } + } + } + if (changesMask[29]) + { + for (var i = 0; i < 13; ++i) + { + if (changesMask[30 + i]) + { + data.Enchantment[i] = ReadUpdateItemEnchantment(packet, indexes, "Enchantment", i); + } + } + } + return data; + } + + public override IContainerData ReadCreateContainerData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new ContainerData(); + packet.ResetBitReader(); + for (var i = 0; i < 36; ++i) + { + data.Slots[i] = packet.ReadPackedGuid128("Slots", indexes, i); + } + data.NumSlots = packet.ReadUInt32("NumSlots", indexes); + return data; + } + + public override IContainerData ReadUpdateContainerData(Packet packet, params object[] indexes) + { + var data = new ContainerData(); + packet.ResetBitReader(); + var rawChangesMask = new int[2]; + var rawMaskMask = new int[1]; + rawMaskMask[0] = (int)packet.ReadBits(2); + var maskMask = new BitArray(rawMaskMask); + for (var i = 0; i < 2; ++i) + if (maskMask[i]) + rawChangesMask[i] = (int)packet.ReadBits(32); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.NumSlots = packet.ReadUInt32("NumSlots", indexes); + } + } + if (changesMask[2]) + { + for (var i = 0; i < 36; ++i) + { + if (changesMask[3 + i]) + { + data.Slots[i] = packet.ReadPackedGuid128("Slots", indexes, i); + } + } + } + return data; + } + + public static IUnitChannel ReadCreateUnitChannel(Packet packet, params object[] indexes) + { + var data = new UnitChannel(); + packet.ResetBitReader(); + data.SpellID = packet.ReadInt32("SpellID", indexes); + data.SpellXSpellVisualID = packet.ReadInt32("SpellXSpellVisualID", indexes); + data.StartTimeMs = packet.ReadUInt32("StartTimeMs", indexes); + data.Duration = packet.ReadUInt32("Duration", indexes); + return data; + } + + public static IUnitChannel ReadUpdateUnitChannel(Packet packet, params object[] indexes) + { + var data = new UnitChannel(); + packet.ResetBitReader(); + data.SpellID = packet.ReadInt32("SpellID", indexes); + data.SpellXSpellVisualID = packet.ReadInt32("SpellXSpellVisualID", indexes); + data.StartTimeMs = packet.ReadUInt32("StartTimeMs", indexes); + data.Duration = packet.ReadUInt32("Duration", indexes); + return data; + } + + public static IVisibleItem ReadCreateVisibleItem(Packet packet, params object[] indexes) + { + var data = new VisibleItem(); + packet.ResetBitReader(); + data.ItemID = packet.ReadInt32("ItemID", indexes); + data.SecondaryItemModifiedAppearanceID = packet.ReadInt32("SecondaryItemModifiedAppearanceID", indexes); + data.ConditionalItemAppearanceID = packet.ReadInt32("ConditionalItemAppearanceID", indexes); + data.ItemAppearanceModID = packet.ReadUInt16("ItemAppearanceModID", indexes); + data.ItemVisual = packet.ReadUInt16("ItemVisual", indexes); + return data; + } + + public static IVisibleItem ReadUpdateVisibleItem(Packet packet, params object[] indexes) + { + var data = new VisibleItem(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(6); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.ItemID = packet.ReadInt32("ItemID", indexes); + } + if (changesMask[2]) + { + data.SecondaryItemModifiedAppearanceID = packet.ReadInt32("SecondaryItemModifiedAppearanceID", indexes); + } + if (changesMask[3]) + { + data.ConditionalItemAppearanceID = packet.ReadInt32("ConditionalItemAppearanceID", indexes); + } + if (changesMask[4]) + { + data.ItemAppearanceModID = packet.ReadUInt16("ItemAppearanceModID", indexes); + } + if (changesMask[5]) + { + data.ItemVisual = packet.ReadUInt16("ItemVisual", indexes); + } + } + return data; + } + + public static IPassiveSpellHistory ReadCreatePassiveSpellHistory(Packet packet, params object[] indexes) + { + var data = new PassiveSpellHistory(); + packet.ResetBitReader(); + data.SpellID = packet.ReadInt32("SpellID", indexes); + data.AuraSpellID = packet.ReadInt32("AuraSpellID", indexes); + return data; + } + + public static IPassiveSpellHistory ReadUpdatePassiveSpellHistory(Packet packet, params object[] indexes) + { + var data = new PassiveSpellHistory(); + packet.ResetBitReader(); + data.SpellID = packet.ReadInt32("SpellID", indexes); + data.AuraSpellID = packet.ReadInt32("AuraSpellID", indexes); + return data; + } + + public override IUnitData ReadCreateUnitData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new UnitData(); + packet.ResetBitReader(); + data.Health = packet.ReadInt64("Health", indexes); + data.MaxHealth = packet.ReadInt64("MaxHealth", indexes); + data.DisplayID = packet.ReadInt32("DisplayID", indexes); + data.NpcFlags = packet.ReadUInt32("NpcFlags", indexes); + data.NpcFlags2 = packet.ReadUInt32("NpcFlags2", indexes); + data.StateSpellVisualID = packet.ReadUInt32("StateSpellVisualID", indexes); + data.StateAnimID = packet.ReadUInt32("StateAnimID", indexes); + data.StateAnimKitID = packet.ReadUInt32("StateAnimKitID", indexes); + data.StateWorldEffectIDs = new System.Nullable[packet.ReadUInt32()]; + for (var i = 0; i < data.StateWorldEffectIDs.Length; ++i) + { + data.StateWorldEffectIDs[i] = packet.ReadUInt32("StateWorldEffectIDs", indexes, i); + } + data.Charm = packet.ReadPackedGuid128("Charm", indexes); + data.Summon = packet.ReadPackedGuid128("Summon", indexes); + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + data.Critter = packet.ReadPackedGuid128("Critter", indexes); + } + data.CharmedBy = packet.ReadPackedGuid128("CharmedBy", indexes); + data.SummonedBy = packet.ReadPackedGuid128("SummonedBy", indexes); + data.CreatedBy = packet.ReadPackedGuid128("CreatedBy", indexes); + data.DemonCreator = packet.ReadPackedGuid128("DemonCreator", indexes); + data.LookAtControllerTarget = packet.ReadPackedGuid128("LookAtControllerTarget", indexes); + data.Target = packet.ReadPackedGuid128("Target", indexes); + data.BattlePetCompanionGUID = packet.ReadPackedGuid128("BattlePetCompanionGUID", indexes); + data.BattlePetDBID = packet.ReadUInt64("BattlePetDBID", indexes); + data.ChannelData = ReadCreateUnitChannel(packet, indexes, "ChannelData"); + data.SummonedByHomeRealm = packet.ReadUInt32("SummonedByHomeRealm", indexes); + data.Race = packet.ReadByte("Race", indexes); + data.ClassId = packet.ReadByte("ClassId", indexes); + data.PlayerClassId = packet.ReadByte("PlayerClassId", indexes); + data.Sex = packet.ReadByte("Sex", indexes); + data.DisplayPower = packet.ReadByte("DisplayPower", indexes); + data.OverrideDisplayPowerID = packet.ReadUInt32("OverrideDisplayPowerID", indexes); + if ((flags & (UpdateFieldFlag.Owner | UpdateFieldFlag.UnitAll)) != UpdateFieldFlag.None) + { + for (var i = 0; i < 10; ++i) + { + data.PowerRegenFlatModifier[i] = packet.ReadSingle("PowerRegenFlatModifier", indexes, i); + data.PowerRegenInterruptedFlatModifier[i] = packet.ReadSingle("PowerRegenInterruptedFlatModifier", indexes, i); + } + } + for (var i = 0; i < 10; ++i) + { + data.Power[i] = packet.ReadInt32("Power", indexes, i); + data.MaxPower[i] = packet.ReadInt32("MaxPower", indexes, i); + data.ModPowerRegen[i] = packet.ReadSingle("ModPowerRegen", indexes, i); + } + data.Level = packet.ReadInt32("Level", indexes); + data.EffectiveLevel = packet.ReadInt32("EffectiveLevel", indexes); + data.ContentTuningID = packet.ReadInt32("ContentTuningID", indexes); + data.ScalingLevelMin = packet.ReadInt32("ScalingLevelMin", indexes); + data.ScalingLevelMax = packet.ReadInt32("ScalingLevelMax", indexes); + data.ScalingLevelDelta = packet.ReadInt32("ScalingLevelDelta", indexes); + data.ScalingFactionGroup = packet.ReadByte("ScalingFactionGroup", indexes); + data.FactionTemplate = packet.ReadInt32("FactionTemplate", indexes); + for (var i = 0; i < 3; ++i) + { + data.VirtualItems[i] = ReadCreateVisibleItem(packet, indexes, "VirtualItems", i); + } + data.Flags = packet.ReadUInt32("Flags", indexes); + data.Flags2 = packet.ReadUInt32("Flags2", indexes); + data.Flags3 = packet.ReadUInt32("Flags3", indexes); + data.Flags4 = packet.ReadUInt32("Flags4", indexes); + data.AuraState = packet.ReadUInt32("AuraState", indexes); + for (var i = 0; i < 3; ++i) + { + data.AttackRoundBaseTime[i] = packet.ReadUInt32("AttackRoundBaseTime", indexes, i); + } + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + data.RangedAttackRoundBaseTime = packet.ReadUInt32("RangedAttackRoundBaseTime", indexes); + } + data.BoundingRadius = packet.ReadSingle("BoundingRadius", indexes); + data.CombatReach = packet.ReadSingle("CombatReach", indexes); + data.DisplayScale = packet.ReadSingle("DisplayScale", indexes); + data.NativeDisplayID = packet.ReadInt32("NativeDisplayID", indexes); + data.NativeXDisplayScale = packet.ReadSingle("NativeXDisplayScale", indexes); + data.MountDisplayID = packet.ReadInt32("MountDisplayID", indexes); + if ((flags & (UpdateFieldFlag.Owner | UpdateFieldFlag.Empath)) != UpdateFieldFlag.None) + { + data.MinDamage = packet.ReadSingle("MinDamage", indexes); + data.MaxDamage = packet.ReadSingle("MaxDamage", indexes); + data.MinOffHandDamage = packet.ReadSingle("MinOffHandDamage", indexes); + data.MaxOffHandDamage = packet.ReadSingle("MaxOffHandDamage", indexes); + } + data.StandState = packet.ReadByte("StandState", indexes); + data.PetTalentPoints = packet.ReadByte("PetTalentPoints", indexes); + data.VisFlags = packet.ReadByte("VisFlags", indexes); + data.AnimTier = packet.ReadByte("AnimTier", indexes); + data.PetNumber = packet.ReadUInt32("PetNumber", indexes); + data.PetNameTimestamp = packet.ReadUInt32("PetNameTimestamp", indexes); + data.PetExperience = packet.ReadUInt32("PetExperience", indexes); + data.PetNextLevelExperience = packet.ReadUInt32("PetNextLevelExperience", indexes); + data.ModCastingSpeed = packet.ReadSingle("ModCastingSpeed", indexes); + data.ModSpellHaste = packet.ReadSingle("ModSpellHaste", indexes); + data.ModHaste = packet.ReadSingle("ModHaste", indexes); + data.ModRangedHaste = packet.ReadSingle("ModRangedHaste", indexes); + data.ModHasteRegen = packet.ReadSingle("ModHasteRegen", indexes); + data.ModTimeRate = packet.ReadSingle("ModTimeRate", indexes); + data.CreatedBySpell = packet.ReadInt32("CreatedBySpell", indexes); + data.EmoteState = packet.ReadInt32("EmoteState", indexes); + data.TrainingPointsUsed = packet.ReadInt16("TrainingPointsUsed", indexes); + data.TrainingPointsTotal = packet.ReadInt16("TrainingPointsTotal", indexes); + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + for (var i = 0; i < 5; ++i) + { + data.Stats[i] = packet.ReadInt32("Stats", indexes, i); + data.StatPosBuff[i] = packet.ReadInt32("StatPosBuff", indexes, i); + data.StatNegBuff[i] = packet.ReadInt32("StatNegBuff", indexes, i); + } + } + if ((flags & (UpdateFieldFlag.Owner | UpdateFieldFlag.Empath)) != UpdateFieldFlag.None) + { + for (var i = 0; i < 7; ++i) + { + data.Resistances[i] = packet.ReadInt32("Resistances", indexes, i); + } + } + for (var i = 0; i < 7; ++i) + { + data.ResistanceBuffModsPositive[i] = packet.ReadInt32("ResistanceBuffModsPositive", indexes, i); + data.ResistanceBuffModsNegative[i] = packet.ReadInt32("ResistanceBuffModsNegative", indexes, i); + } + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + for (var i = 0; i < 7; ++i) + { + data.PowerCostModifier[i] = packet.ReadInt32("PowerCostModifier", indexes, i); + data.PowerCostMultiplier[i] = packet.ReadSingle("PowerCostMultiplier", indexes, i); + } + } + data.BaseMana = packet.ReadInt32("BaseMana", indexes); + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + data.BaseHealth = packet.ReadInt32("BaseHealth", indexes); + } + data.SheatheState = packet.ReadByte("SheatheState", indexes); + data.PvpFlags = packet.ReadByte("PvpFlags", indexes); + data.PetFlags = packet.ReadByte("PetFlags", indexes); + data.ShapeshiftForm = packet.ReadByte("ShapeshiftForm", indexes); + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + data.AttackPower = packet.ReadInt32("AttackPower", indexes); + data.AttackPowerModPos = packet.ReadInt32("AttackPowerModPos", indexes); + data.AttackPowerModNeg = packet.ReadInt32("AttackPowerModNeg", indexes); + data.AttackPowerMultiplier = packet.ReadSingle("AttackPowerMultiplier", indexes); + data.RangedAttackPower = packet.ReadInt32("RangedAttackPower", indexes); + data.RangedAttackPowerModPos = packet.ReadInt32("RangedAttackPowerModPos", indexes); + data.RangedAttackPowerModNeg = packet.ReadInt32("RangedAttackPowerModNeg", indexes); + data.RangedAttackPowerMultiplier = packet.ReadSingle("RangedAttackPowerMultiplier", indexes); + data.SetAttackSpeedAura = packet.ReadInt32("SetAttackSpeedAura", indexes); + data.Lifesteal = packet.ReadSingle("Lifesteal", indexes); + data.MinRangedDamage = packet.ReadSingle("MinRangedDamage", indexes); + data.MaxRangedDamage = packet.ReadSingle("MaxRangedDamage", indexes); + } + data.MaxHealthModifier = packet.ReadSingle("MaxHealthModifier", indexes); + data.HoverHeight = packet.ReadSingle("HoverHeight", indexes); + data.MinItemLevelCutoff = packet.ReadInt32("MinItemLevelCutoff", indexes); + data.MinItemLevel = packet.ReadInt32("MinItemLevel", indexes); + data.MaxItemLevel = packet.ReadInt32("MaxItemLevel", indexes); + data.WildBattlePetLevel = packet.ReadInt32("WildBattlePetLevel", indexes); + data.BattlePetCompanionNameTimestamp = packet.ReadUInt32("BattlePetCompanionNameTimestamp", indexes); + data.InteractSpellID = packet.ReadInt32("InteractSpellID", indexes); + data.ScaleDuration = packet.ReadInt32("ScaleDuration", indexes); + data.LooksLikeMountID = packet.ReadInt32("LooksLikeMountID", indexes); + data.LooksLikeCreatureID = packet.ReadInt32("LooksLikeCreatureID", indexes); + data.LookAtControllerID = packet.ReadInt32("LookAtControllerID", indexes); + data.PerksVendorItemID = packet.ReadInt32("PerksVendorItemID", indexes); + data.GuildGUID = packet.ReadPackedGuid128("GuildGUID", indexes); + data.PassiveSpells.Resize(packet.ReadUInt32()); + data.WorldEffects.Resize(packet.ReadUInt32()); + data.ChannelObjects.Resize(packet.ReadUInt32()); + data.SkinningOwnerGUID = packet.ReadPackedGuid128("SkinningOwnerGUID", indexes); + data.FlightCapabilityID = packet.ReadInt32("FlightCapabilityID", indexes); + data.GlideEventSpeedDivisor = packet.ReadSingle("GlideEventSpeedDivisor", indexes); + data.DriveCapabilityID = packet.ReadInt32("DriveCapabilityID", indexes); + data.SilencedSchoolMask = packet.ReadUInt32("SilencedSchoolMask", indexes); + data.CurrentAreaID = packet.ReadUInt32("CurrentAreaID", indexes); + if ((flags & UpdateFieldFlag.Owner) != UpdateFieldFlag.None) + { + data.ComboTarget = packet.ReadPackedGuid128("ComboTarget", indexes); + } + data.Field_2F0 = packet.ReadSingle("Field_2F0", indexes); + data.Field_2F4 = packet.ReadSingle("Field_2F4", indexes); + for (var i = 0; i < data.PassiveSpells.Count; ++i) + { + data.PassiveSpells[i] = ReadCreatePassiveSpellHistory(packet, indexes, "PassiveSpells", i); + } + for (var i = 0; i < data.WorldEffects.Count; ++i) + { + data.WorldEffects[i] = packet.ReadInt32("WorldEffects", indexes, i); + } + for (var i = 0; i < data.ChannelObjects.Count; ++i) + { + data.ChannelObjects[i] = packet.ReadPackedGuid128("ChannelObjects", indexes, i); + } + packet.ResetBitReader(); + data.Field_314 = packet.ReadBit("Field_314", indexes); + bool hasAssistActionData = packet.ReadBit("HasAssistActionData", indexes); + if (hasAssistActionData) + { + data.AssistActionData = ReadCreateUnitAssistActionData(packet, indexes, "AssistActionData"); + } + return data; + } + + public static IUnitAssistActionData ReadCreateUnitAssistActionData(Packet packet, params object[] indexes) + { + var data = new UnitAssistActionData(); + packet.ResetBitReader(); + data.Type = packet.ReadByte("Type", indexes); + data.VirtualRealmAddress = packet.ReadUInt32("VirtualRealmAddress", indexes); + data.PlayerName = new string('*', (int)packet.ReadBits(6)); + packet.ResetBitReader(); + data.PlayerName = packet.ReadWoWString("PlayerName", data.PlayerName.Length, indexes); + return data; + } + + public override IUnitData ReadUpdateUnitData(Packet packet, params object[] indexes) + { + var data = new UnitData(); + packet.ResetBitReader(); + var rawChangesMask = new int[8]; + var rawMaskMask = new int[1]; + rawMaskMask[0] = (int)packet.ReadBits(8); + var maskMask = new BitArray(rawMaskMask); + for (var i = 0; i < 8; ++i) + if (maskMask[i]) + rawChangesMask[i] = (int)packet.ReadBits(32); + var changesMask = new BitArray(rawChangesMask); + + var hasAssistActionData = false; + if (changesMask[0]) + { + if (changesMask[1]) + { + data.StateWorldEffectIDs = Enumerable.Range(0, (int)packet.ReadBits(32)).Select(x => new uint()).Cast>().ToArray(); + for (var i = 0; i < data.StateWorldEffectIDs.Length; ++i) + { + data.StateWorldEffectIDs[i] = packet.ReadUInt32("StateWorldEffectIDs", indexes, i); + } + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[2]) + { + data.PassiveSpells.ReadUpdateMask(packet); + } + if (changesMask[3]) + { + data.WorldEffects.ReadUpdateMask(packet); + } + if (changesMask[4]) + { + data.ChannelObjects.ReadUpdateMask(packet); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[2]) + { + for (var i = 0; i < data.PassiveSpells.Count; ++i) + { + if (data.PassiveSpells.UpdateMask[i]) + { + data.PassiveSpells[i] = ReadUpdatePassiveSpellHistory(packet, indexes, "PassiveSpells", i); + } + } + } + if (changesMask[3]) + { + for (var i = 0; i < data.WorldEffects.Count; ++i) + { + if (data.WorldEffects.UpdateMask[i]) + { + data.WorldEffects[i] = packet.ReadInt32("WorldEffects", indexes, i); + } + } + } + if (changesMask[4]) + { + for (var i = 0; i < data.ChannelObjects.Count; ++i) + { + if (data.ChannelObjects.UpdateMask[i]) + { + data.ChannelObjects[i] = packet.ReadPackedGuid128("ChannelObjects", indexes, i); + } + } + } + if (changesMask[5]) + { + data.Health = packet.ReadInt64("Health", indexes); + } + if (changesMask[6]) + { + data.MaxHealth = packet.ReadInt64("MaxHealth", indexes); + } + if (changesMask[7]) + { + data.DisplayID = packet.ReadInt32("DisplayID", indexes); + } + if (changesMask[8]) + { + data.NpcFlags = packet.ReadUInt32("NpcFlags", indexes); + } + if (changesMask[9]) + { + data.NpcFlags2 = packet.ReadUInt32("NpcFlags2", indexes); + } + if (changesMask[10]) + { + data.StateSpellVisualID = packet.ReadUInt32("StateSpellVisualID", indexes); + } + if (changesMask[11]) + { + data.StateAnimID = packet.ReadUInt32("StateAnimID", indexes); + } + if (changesMask[12]) + { + data.StateAnimKitID = packet.ReadUInt32("StateAnimKitID", indexes); + } + if (changesMask[13]) + { + data.Charm = packet.ReadPackedGuid128("Charm", indexes); + } + if (changesMask[14]) + { + data.Summon = packet.ReadPackedGuid128("Summon", indexes); + } + if (changesMask[15]) + { + data.Critter = packet.ReadPackedGuid128("Critter", indexes); + } + if (changesMask[16]) + { + data.CharmedBy = packet.ReadPackedGuid128("CharmedBy", indexes); + } + if (changesMask[17]) + { + data.SummonedBy = packet.ReadPackedGuid128("SummonedBy", indexes); + } + if (changesMask[18]) + { + data.CreatedBy = packet.ReadPackedGuid128("CreatedBy", indexes); + } + if (changesMask[19]) + { + data.DemonCreator = packet.ReadPackedGuid128("DemonCreator", indexes); + } + if (changesMask[20]) + { + data.LookAtControllerTarget = packet.ReadPackedGuid128("LookAtControllerTarget", indexes); + } + if (changesMask[21]) + { + data.Target = packet.ReadPackedGuid128("Target", indexes); + } + if (changesMask[22]) + { + data.BattlePetCompanionGUID = packet.ReadPackedGuid128("BattlePetCompanionGUID", indexes); + } + if (changesMask[23]) + { + data.BattlePetDBID = packet.ReadUInt64("BattlePetDBID", indexes); + } + if (changesMask[24]) + { + data.ChannelData = ReadUpdateUnitChannel(packet, indexes, "ChannelData"); + } + if (changesMask[25]) + { + data.SummonedByHomeRealm = packet.ReadUInt32("SummonedByHomeRealm", indexes); + } + if (changesMask[26]) + { + data.Race = packet.ReadByte("Race", indexes); + } + if (changesMask[27]) + { + data.ClassId = packet.ReadByte("ClassId", indexes); + } + if (changesMask[28]) + { + data.PlayerClassId = packet.ReadByte("PlayerClassId", indexes); + } + if (changesMask[29]) + { + data.Sex = packet.ReadByte("Sex", indexes); + } + if (changesMask[30]) + { + data.DisplayPower = packet.ReadByte("DisplayPower", indexes); + } + if (changesMask[31]) + { + data.OverrideDisplayPowerID = packet.ReadUInt32("OverrideDisplayPowerID", indexes); + } + } + if (changesMask[32]) + { + if (changesMask[33]) + { + data.Level = packet.ReadInt32("Level", indexes); + } + if (changesMask[34]) + { + data.EffectiveLevel = packet.ReadInt32("EffectiveLevel", indexes); + } + if (changesMask[35]) + { + data.ContentTuningID = packet.ReadInt32("ContentTuningID", indexes); + } + if (changesMask[36]) + { + data.ScalingLevelMin = packet.ReadInt32("ScalingLevelMin", indexes); + } + if (changesMask[37]) + { + data.ScalingLevelMax = packet.ReadInt32("ScalingLevelMax", indexes); + } + if (changesMask[38]) + { + data.ScalingLevelDelta = packet.ReadInt32("ScalingLevelDelta", indexes); + } + if (changesMask[39]) + { + data.ScalingFactionGroup = packet.ReadByte("ScalingFactionGroup", indexes); + } + if (changesMask[40]) + { + data.FactionTemplate = packet.ReadInt32("FactionTemplate", indexes); + } + if (changesMask[41]) + { + data.Flags = packet.ReadUInt32("Flags", indexes); + } + if (changesMask[42]) + { + data.Flags2 = packet.ReadUInt32("Flags2", indexes); + } + if (changesMask[43]) + { + data.Flags3 = packet.ReadUInt32("Flags3", indexes); + } + if (changesMask[44]) + { + data.Flags4 = packet.ReadUInt32("Flags4", indexes); + } + if (changesMask[45]) + { + data.AuraState = packet.ReadUInt32("AuraState", indexes); + } + if (changesMask[46]) + { + data.RangedAttackRoundBaseTime = packet.ReadUInt32("RangedAttackRoundBaseTime", indexes); + } + if (changesMask[47]) + { + data.BoundingRadius = packet.ReadSingle("BoundingRadius", indexes); + } + if (changesMask[48]) + { + data.CombatReach = packet.ReadSingle("CombatReach", indexes); + } + if (changesMask[49]) + { + data.DisplayScale = packet.ReadSingle("DisplayScale", indexes); + } + if (changesMask[50]) + { + data.NativeDisplayID = packet.ReadInt32("NativeDisplayID", indexes); + } + if (changesMask[51]) + { + data.NativeXDisplayScale = packet.ReadSingle("NativeXDisplayScale", indexes); + } + if (changesMask[52]) + { + data.MountDisplayID = packet.ReadInt32("MountDisplayID", indexes); + } + if (changesMask[53]) + { + data.MinDamage = packet.ReadSingle("MinDamage", indexes); + } + if (changesMask[54]) + { + data.MaxDamage = packet.ReadSingle("MaxDamage", indexes); + } + if (changesMask[55]) + { + data.MinOffHandDamage = packet.ReadSingle("MinOffHandDamage", indexes); + } + if (changesMask[56]) + { + data.MaxOffHandDamage = packet.ReadSingle("MaxOffHandDamage", indexes); + } + if (changesMask[57]) + { + data.StandState = packet.ReadByte("StandState", indexes); + } + if (changesMask[58]) + { + data.PetTalentPoints = packet.ReadByte("PetTalentPoints", indexes); + } + if (changesMask[59]) + { + data.VisFlags = packet.ReadByte("VisFlags", indexes); + } + if (changesMask[60]) + { + data.AnimTier = packet.ReadByte("AnimTier", indexes); + } + if (changesMask[61]) + { + data.PetNumber = packet.ReadUInt32("PetNumber", indexes); + } + if (changesMask[62]) + { + data.PetNameTimestamp = packet.ReadUInt32("PetNameTimestamp", indexes); + } + if (changesMask[63]) + { + data.PetExperience = packet.ReadUInt32("PetExperience", indexes); + } + } + if (changesMask[64]) + { + if (changesMask[65]) + { + data.PetNextLevelExperience = packet.ReadUInt32("PetNextLevelExperience", indexes); + } + if (changesMask[66]) + { + data.ModCastingSpeed = packet.ReadSingle("ModCastingSpeed", indexes); + } + if (changesMask[67]) + { + data.ModSpellHaste = packet.ReadSingle("ModSpellHaste", indexes); + } + if (changesMask[68]) + { + data.ModHaste = packet.ReadSingle("ModHaste", indexes); + } + if (changesMask[69]) + { + data.ModRangedHaste = packet.ReadSingle("ModRangedHaste", indexes); + } + if (changesMask[70]) + { + data.ModHasteRegen = packet.ReadSingle("ModHasteRegen", indexes); + } + if (changesMask[71]) + { + data.ModTimeRate = packet.ReadSingle("ModTimeRate", indexes); + } + if (changesMask[72]) + { + data.CreatedBySpell = packet.ReadInt32("CreatedBySpell", indexes); + } + if (changesMask[73]) + { + data.EmoteState = packet.ReadInt32("EmoteState", indexes); + } + if (changesMask[74]) + { + data.TrainingPointsUsed = packet.ReadInt16("TrainingPointsUsed", indexes); + } + if (changesMask[75]) + { + data.TrainingPointsTotal = packet.ReadInt16("TrainingPointsTotal", indexes); + } + if (changesMask[76]) + { + data.BaseMana = packet.ReadInt32("BaseMana", indexes); + } + if (changesMask[77]) + { + data.BaseHealth = packet.ReadInt32("BaseHealth", indexes); + } + if (changesMask[78]) + { + data.SheatheState = packet.ReadByte("SheatheState", indexes); + } + if (changesMask[79]) + { + data.PvpFlags = packet.ReadByte("PvpFlags", indexes); + } + if (changesMask[80]) + { + data.PetFlags = packet.ReadByte("PetFlags", indexes); + } + if (changesMask[81]) + { + data.ShapeshiftForm = packet.ReadByte("ShapeshiftForm", indexes); + } + if (changesMask[82]) + { + data.AttackPower = packet.ReadInt32("AttackPower", indexes); + } + if (changesMask[83]) + { + data.AttackPowerModPos = packet.ReadInt32("AttackPowerModPos", indexes); + } + if (changesMask[84]) + { + data.AttackPowerModNeg = packet.ReadInt32("AttackPowerModNeg", indexes); + } + if (changesMask[85]) + { + data.AttackPowerMultiplier = packet.ReadSingle("AttackPowerMultiplier", indexes); + } + if (changesMask[86]) + { + data.RangedAttackPower = packet.ReadInt32("RangedAttackPower", indexes); + } + if (changesMask[87]) + { + data.RangedAttackPowerModPos = packet.ReadInt32("RangedAttackPowerModPos", indexes); + } + if (changesMask[88]) + { + data.RangedAttackPowerModNeg = packet.ReadInt32("RangedAttackPowerModNeg", indexes); + } + if (changesMask[89]) + { + data.RangedAttackPowerMultiplier = packet.ReadSingle("RangedAttackPowerMultiplier", indexes); + } + if (changesMask[90]) + { + data.SetAttackSpeedAura = packet.ReadInt32("SetAttackSpeedAura", indexes); + } + if (changesMask[91]) + { + data.Lifesteal = packet.ReadSingle("Lifesteal", indexes); + } + if (changesMask[92]) + { + data.MinRangedDamage = packet.ReadSingle("MinRangedDamage", indexes); + } + if (changesMask[93]) + { + data.MaxRangedDamage = packet.ReadSingle("MaxRangedDamage", indexes); + } + if (changesMask[94]) + { + data.MaxHealthModifier = packet.ReadSingle("MaxHealthModifier", indexes); + } + if (changesMask[95]) + { + data.HoverHeight = packet.ReadSingle("HoverHeight", indexes); + } + } + if (changesMask[96]) + { + if (changesMask[97]) + { + data.MinItemLevelCutoff = packet.ReadInt32("MinItemLevelCutoff", indexes); + } + if (changesMask[98]) + { + data.MinItemLevel = packet.ReadInt32("MinItemLevel", indexes); + } + if (changesMask[99]) + { + data.MaxItemLevel = packet.ReadInt32("MaxItemLevel", indexes); + } + if (changesMask[100]) + { + data.WildBattlePetLevel = packet.ReadInt32("WildBattlePetLevel", indexes); + } + if (changesMask[101]) + { + data.BattlePetCompanionNameTimestamp = packet.ReadUInt32("BattlePetCompanionNameTimestamp", indexes); + } + if (changesMask[102]) + { + data.InteractSpellID = packet.ReadInt32("InteractSpellID", indexes); + } + if (changesMask[103]) + { + data.ScaleDuration = packet.ReadInt32("ScaleDuration", indexes); + } + if (changesMask[104]) + { + data.LooksLikeMountID = packet.ReadInt32("LooksLikeMountID", indexes); + } + if (changesMask[105]) + { + data.LooksLikeCreatureID = packet.ReadInt32("LooksLikeCreatureID", indexes); + } + if (changesMask[106]) + { + data.LookAtControllerID = packet.ReadInt32("LookAtControllerID", indexes); + } + if (changesMask[107]) + { + data.PerksVendorItemID = packet.ReadInt32("PerksVendorItemID", indexes); + } + if (changesMask[108]) + { + data.GuildGUID = packet.ReadPackedGuid128("GuildGUID", indexes); + } + if (changesMask[109]) + { + data.SkinningOwnerGUID = packet.ReadPackedGuid128("SkinningOwnerGUID", indexes); + } + if (changesMask[110]) + { + data.FlightCapabilityID = packet.ReadInt32("FlightCapabilityID", indexes); + } + if (changesMask[111]) + { + data.GlideEventSpeedDivisor = packet.ReadSingle("GlideEventSpeedDivisor", indexes); + } + if (changesMask[112]) + { + data.DriveCapabilityID = packet.ReadInt32("DriveCapabilityID", indexes); + } + if (changesMask[113]) + { + data.SilencedSchoolMask = packet.ReadUInt32("SilencedSchoolMask", indexes); + } + if (changesMask[114]) + { + data.CurrentAreaID = packet.ReadUInt32("CurrentAreaID", indexes); + } + if (changesMask[115]) + { + data.ComboTarget = packet.ReadPackedGuid128("ComboTarget", indexes); + } + if (changesMask[116]) + { + data.Field_2F0 = packet.ReadSingle("Field_2F0", indexes); + } + if (changesMask[117]) + { + data.Field_2F4 = packet.ReadSingle("Field_2F4", indexes); + } + hasAssistActionData = packet.ReadBit("HasAssistActionData", indexes); + if (changesMask[118]) + { + if (hasAssistActionData) + { + data.AssistActionData = ReadUpdateUnitAssistActionData(packet, indexes, "AssistActionData"); + } + } + } + if (changesMask[119]) + { + for (var i = 0; i < 10; ++i) + { + if (changesMask[120 + i]) + { + data.PowerRegenFlatModifier[i] = packet.ReadSingle("PowerRegenFlatModifier", indexes, i); + } + if (changesMask[130 + i]) + { + data.PowerRegenInterruptedFlatModifier[i] = packet.ReadSingle("PowerRegenInterruptedFlatModifier", indexes, i); + } + if (changesMask[140 + i]) + { + data.Power[i] = packet.ReadInt32("Power", indexes, i); + } + if (changesMask[150 + i]) + { + data.MaxPower[i] = packet.ReadInt32("MaxPower", indexes, i); + } + if (changesMask[160 + i]) + { + data.ModPowerRegen[i] = packet.ReadSingle("ModPowerRegen", indexes, i); + } + } + } + if (changesMask[170]) + { + for (var i = 0; i < 3; ++i) + { + if (changesMask[171 + i]) + { + data.VirtualItems[i] = ReadUpdateVisibleItem(packet, indexes, "VirtualItems", i); + } + } + } + if (changesMask[174]) + { + for (var i = 0; i < 3; ++i) + { + if (changesMask[175 + i]) + { + data.AttackRoundBaseTime[i] = packet.ReadUInt32("AttackRoundBaseTime", indexes, i); + } + } + } + if (changesMask[178]) + { + for (var i = 0; i < 5; ++i) + { + if (changesMask[179 + i]) + { + data.Stats[i] = packet.ReadInt32("Stats", indexes, i); + } + if (changesMask[184 + i]) + { + data.StatPosBuff[i] = packet.ReadInt32("StatPosBuff", indexes, i); + } + if (changesMask[189 + i]) + { + data.StatNegBuff[i] = packet.ReadInt32("StatNegBuff", indexes, i); + } + } + } + if (changesMask[194]) + { + for (var i = 0; i < 7; ++i) + { + if (changesMask[195 + i]) + { + data.Resistances[i] = packet.ReadInt32("Resistances", indexes, i); + } + if (changesMask[202 + i]) + { + data.ResistanceBuffModsPositive[i] = packet.ReadInt32("ResistanceBuffModsPositive", indexes, i); + } + if (changesMask[209 + i]) + { + data.ResistanceBuffModsNegative[i] = packet.ReadInt32("ResistanceBuffModsNegative", indexes, i); + } + if (changesMask[216 + i]) + { + data.PowerCostModifier[i] = packet.ReadInt32("PowerCostModifier", indexes, i); + } + if (changesMask[223 + i]) + { + data.PowerCostMultiplier[i] = packet.ReadSingle("PowerCostMultiplier", indexes, i); + } + } + } + return data; + } + + public static IUnitAssistActionData ReadUpdateUnitAssistActionData(Packet packet, params object[] indexes) + { + var data = new UnitAssistActionData(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(4); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.Type = packet.ReadByte("Type", indexes); + } + if (changesMask[3]) + { + data.VirtualRealmAddress = packet.ReadUInt32("VirtualRealmAddress", indexes); + } + if (changesMask[2]) + { + data.PlayerName = new string('*', (int)packet.ReadBits(6)); + packet.ResetBitReader(); + data.PlayerName = packet.ReadWoWString("PlayerName", data.PlayerName.Length, indexes); + } + } + return data; + } + + public static IChrCustomizationChoice ReadCreateChrCustomizationChoice(Packet packet, params object[] indexes) + { + var data = new ChrCustomizationChoice(); + packet.ResetBitReader(); + data.ChrCustomizationOptionID = packet.ReadUInt32("ChrCustomizationOptionID", indexes); + data.ChrCustomizationChoiceID = packet.ReadUInt32("ChrCustomizationChoiceID", indexes); + return data; + } + + public static IChrCustomizationChoice ReadUpdateChrCustomizationChoice(Packet packet, params object[] indexes) + { + var data = new ChrCustomizationChoice(); + packet.ResetBitReader(); + data.ChrCustomizationOptionID = packet.ReadUInt32("ChrCustomizationOptionID", indexes); + data.ChrCustomizationChoiceID = packet.ReadUInt32("ChrCustomizationChoiceID", indexes); + return data; + } + + public static IQuestLog ReadCreateQuestLog(Packet packet, params object[] indexes) + { + var data = new QuestLog(); + packet.ResetBitReader(); + data.QuestID = packet.ReadInt32("QuestID", indexes); + data.StateFlags = packet.ReadUInt16("StateFlags", indexes); + for (var i = 0; i < 24; ++i) + { + data.ObjectiveProgress[i] = packet.ReadUInt16("ObjectiveProgress", indexes, i); + } + data.EndTime = packet.ReadInt64("EndTime", indexes); + return data; + } + + public static IQuestLog ReadUpdateQuestLog(Packet packet, params object[] indexes) + { + var data = new QuestLog(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + var rawMaskMask = new int[1]; + rawMaskMask[0] = (int)packet.ReadBits(1); + var maskMask = new BitArray(rawMaskMask); + if (maskMask[0]) + rawChangesMask[0] = (int)packet.ReadBits(32); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.EndTime = packet.ReadInt64("EndTime", indexes); + } + if (changesMask[2]) + { + data.QuestID = packet.ReadInt32("QuestID", indexes); + } + if (changesMask[3]) + { + data.StateFlags = packet.ReadUInt16("StateFlags", indexes); + } + } + if (changesMask[4]) + { + for (var i = 0; i < 24; ++i) + { + if (changesMask[5 + i]) + { + data.ObjectiveProgress[i] = packet.ReadUInt16("ObjectiveProgress", indexes, i); + } + } + } + return data; + } + + public static IArenaCooldown ReadCreateArenaCooldown(Packet packet, params object[] indexes) + { + var data = new ArenaCooldown(); + packet.ResetBitReader(); + data.SpellID = packet.ReadInt32("SpellID", indexes); + data.ItemID = packet.ReadInt32("ItemID", indexes); + data.Charges = packet.ReadInt32("Charges", indexes); + data.Flags = packet.ReadUInt32("Flags", indexes); + data.StartTime = packet.ReadUInt32("StartTime", indexes); + data.EndTime = packet.ReadUInt32("EndTime", indexes); + data.NextChargeTime = packet.ReadUInt32("NextChargeTime", indexes); + data.MaxCharges = packet.ReadByte("MaxCharges", indexes); + return data; + } + + public static IArenaCooldown ReadUpdateArenaCooldown(Packet packet, params object[] indexes) + { + var data = new ArenaCooldown(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(9); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.SpellID = packet.ReadInt32("SpellID", indexes); + } + if (changesMask[2]) + { + data.ItemID = packet.ReadInt32("ItemID", indexes); + } + if (changesMask[3]) + { + data.Charges = packet.ReadInt32("Charges", indexes); + } + if (changesMask[4]) + { + data.Flags = packet.ReadUInt32("Flags", indexes); + } + if (changesMask[5]) + { + data.StartTime = packet.ReadUInt32("StartTime", indexes); + } + if (changesMask[6]) + { + data.EndTime = packet.ReadUInt32("EndTime", indexes); + } + if (changesMask[7]) + { + data.NextChargeTime = packet.ReadUInt32("NextChargeTime", indexes); + } + if (changesMask[8]) + { + data.MaxCharges = packet.ReadByte("MaxCharges", indexes); + } + } + return data; + } + + public static IZonePlayerForcedReaction ReadCreateZonePlayerForcedReaction(Packet packet, params object[] indexes) + { + var data = new ZonePlayerForcedReaction(); + packet.ResetBitReader(); + data.FactionID = packet.ReadInt32("FactionID", indexes); + data.Reaction = packet.ReadInt32("Reaction", indexes); + return data; + } + + public static IZonePlayerForcedReaction ReadUpdateZonePlayerForcedReaction(Packet packet, params object[] indexes) + { + var data = new ZonePlayerForcedReaction(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(3); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.FactionID = packet.ReadInt32("FactionID", indexes); + } + if (changesMask[2]) + { + data.Reaction = packet.ReadInt32("Reaction", indexes); + } + } + return data; + } + + public static IDeclinedNames ReadCreateDeclinedNames(Packet packet, params object[] indexes) + { + var data = new DeclinedNames(); + packet.ResetBitReader(); + for (var i = 0; i < 5; ++i) + { + data.Name[i] = new string('*', (int)packet.ReadBits(10)); + } + for (var i = 0; i < 5; ++i) + { + data.Name[i] = packet.ReadWoWString("Name", data.Name[i].Length, indexes, i); + } + return data; + } + + public static IDeclinedNames ReadUpdateDeclinedNames(Packet packet, params object[] indexes) + { + var data = new DeclinedNames(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + var rawMaskMask = new int[1]; + rawMaskMask[0] = (int)packet.ReadBits(1); + var maskMask = new BitArray(rawMaskMask); + if (maskMask[0]) + rawChangesMask[0] = (int)packet.ReadBits(32); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + for (var i = 0; i < 5; ++i) + { + if (changesMask[1 + i]) + { + data.Name[i] = new string('*', (int)packet.ReadBits(10)); + } + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + for (var i = 0; i < 5; ++i) + { + if (changesMask[1 + i]) + { + data.Name[i] = packet.ReadWoWString("Name", data.Name[i].Length, indexes, i); + } + } + } + return data; + } + + public static ICustomTabardInfo ReadCreateCustomTabardInfo(Packet packet, params object[] indexes) + { + var data = new CustomTabardInfo(); + packet.ResetBitReader(); + data.EmblemStyle = packet.ReadInt32("EmblemStyle", indexes); + data.EmblemColor = packet.ReadInt32("EmblemColor", indexes); + data.BorderStyle = packet.ReadInt32("BorderStyle", indexes); + data.BorderColor = packet.ReadInt32("BorderColor", indexes); + data.BackgroundColor = packet.ReadInt32("BackgroundColor", indexes); + return data; + } + + public static ICustomTabardInfo ReadUpdateCustomTabardInfo(Packet packet, params object[] indexes) + { + var data = new CustomTabardInfo(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(5); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + data.EmblemStyle = packet.ReadInt32("EmblemStyle", indexes); + } + if (changesMask[1]) + { + data.EmblemColor = packet.ReadInt32("EmblemColor", indexes); + } + if (changesMask[2]) + { + data.BorderStyle = packet.ReadInt32("BorderStyle", indexes); + } + if (changesMask[3]) + { + data.BorderColor = packet.ReadInt32("BorderColor", indexes); + } + if (changesMask[4]) + { + data.BackgroundColor = packet.ReadInt32("BackgroundColor", indexes); + } + return data; + } + + public override IPlayerData ReadCreatePlayerData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new PlayerData(); + packet.ResetBitReader(); + var hasDeclinedNames = false; + data.DuelArbiter = packet.ReadPackedGuid128("DuelArbiter", indexes); + data.WowAccount = packet.ReadPackedGuid128("WowAccount", indexes); + data.BnetAccount = packet.ReadPackedGuid128("BnetAccount", indexes); + data.GuildClubMemberID = packet.ReadUInt64("GuildClubMemberID", indexes); + data.LootTargetGUID = packet.ReadPackedGuid128("LootTargetGUID", indexes); + data.PlayerFlags = packet.ReadUInt32("PlayerFlags", indexes); + data.PlayerFlagsEx = packet.ReadUInt32("PlayerFlagsEx", indexes); + data.GuildRankID = packet.ReadUInt32("GuildRankID", indexes); + data.GuildDeleteDate = packet.ReadUInt32("GuildDeleteDate", indexes); + data.GuildLevel = packet.ReadInt32("GuildLevel", indexes); + data.Customizations.Resize(packet.ReadUInt32()); + for (var i = 0; i < 2; ++i) + { + data.PartyType[i] = packet.ReadByte("PartyType", indexes, i); + } + data.NumBankSlots = packet.ReadByte("NumBankSlots", indexes); + data.NativeSex = packet.ReadByte("NativeSex", indexes); + data.Inebriation = packet.ReadByte("Inebriation", indexes); + data.PvpTitle = packet.ReadByte("PvpTitle", indexes); + data.ArenaFaction = packet.ReadByte("ArenaFaction", indexes); + data.PvpRank = packet.ReadByte("PvpRank", indexes); + data.Field_88 = packet.ReadInt32("Field_88", indexes); + data.DuelTeam = packet.ReadUInt32("DuelTeam", indexes); + data.GuildTimeStamp = packet.ReadInt32("GuildTimeStamp", indexes); + if ((flags & UpdateFieldFlag.PartyMember) != UpdateFieldFlag.None) + { + for (var i = 0; i < 25; ++i) + { + data.QuestLog[i] = ReadCreateQuestLog(packet, indexes, "QuestLog", i); + } + } + for (var i = 0; i < 19; ++i) + { + data.VisibleItems[i] = ReadCreateVisibleItem(packet, indexes, "VisibleItems", i); + } + data.PlayerTitle = packet.ReadInt32("PlayerTitle", indexes); + data.FakeInebriation = packet.ReadInt32("FakeInebriation", indexes); + data.VirtualPlayerRealm = packet.ReadUInt32("VirtualPlayerRealm", indexes); + data.CurrentSpecID = packet.ReadUInt32("CurrentSpecID", indexes); + data.TaxiMountAnimKitID = packet.ReadInt32("TaxiMountAnimKitID", indexes); + packet.ReadInt32("Unk", indexes); + for (var i = 0; i < 6; ++i) + { + data.AvgItemLevel[i] = packet.ReadSingle("AvgItemLevel", indexes, i); + } + data.CurrentBattlePetBreedQuality = packet.ReadByte("CurrentBattlePetBreedQuality", indexes); + data.HonorLevel = packet.ReadInt32("HonorLevel", indexes); + data.LogoutTime = packet.ReadInt64("LogoutTime", indexes); + data.ArenaCooldowns.Resize(packet.ReadUInt32()); + for (var i = 0; i < 32; ++i) + { + data.ForcedReactions[i] = ReadCreateZonePlayerForcedReaction(packet, indexes, "ForcedReactions", i); + } + data.Field_13C = packet.ReadInt32("Field_13C", indexes); + data.Field_140 = packet.ReadInt32("Field_140", indexes); + data.CurrentBattlePetSpeciesID = packet.ReadInt32("CurrentBattlePetSpeciesID", indexes); + data.PetNames.Resize(packet.ReadUInt32()); + data.VisualItemReplacements.Resize(packet.ReadUInt32()); + for (var i = 0; i < 19; ++i) + { + data.Field_3120[i] = packet.ReadUInt32("Field_3120", indexes, i); + } + data.PersonalTabard = ReadCreateCustomTabardInfo(packet, indexes, "PersonalTabard"); + for (var i = 0; i < data.Customizations.Count; ++i) + { + data.Customizations[i] = ReadCreateChrCustomizationChoice(packet, indexes, "Customizations", i); + } + for (var i = 0; i < data.ArenaCooldowns.Count; ++i) + { + data.ArenaCooldowns[i] = ReadCreateArenaCooldown(packet, indexes, "ArenaCooldowns", i); + } + for (var i = 0; i < data.VisualItemReplacements.Count; ++i) + { + data.VisualItemReplacements[i] = packet.ReadInt32("VisualItemReplacements", indexes, i); + } + data.Name = new string('*', (int)packet.ReadBits(6)); + data.HasLevelLink = packet.ReadBit("HasLevelLink", indexes); + hasDeclinedNames = packet.ReadBit("HasDeclinedNames", indexes); + Substructures.MythicPlusHandler.ReadDungeonScoreSummary(packet, indexes, "DungeonScore"); + data.Name = packet.ReadWoWString("Name", data.Name.Length, indexes); + data.LeaverInfo = ReadCreateLeaverInfo(packet, indexes); + for (var i = 0; i < data.PetNames.Count; ++i) + { + data.PetNames[i] = ReadCreatePetCreatureName(packet, indexes, "PetNames", i); + } + if (hasDeclinedNames) + { + data.DeclinedNames = ReadCreateDeclinedNames(packet, indexes, "DeclinedNames"); + } + return data; + } + + public static IPetCreatureName ReadCreatePetCreatureName(Packet packet, params object[] indexes) + { + var data = new PetCreatureName(); + packet.ResetBitReader(); + data.CreatureID = packet.ReadUInt32("CreatureID", indexes); + data.Name = new string('*', (int)packet.ReadBits(8)); + data.Name = packet.ReadWoWString("Name", data.Name.Length, indexes); + return data; + } + + public static ILeaverInfo ReadCreateLeaverInfo(Packet packet, params object[] indexes) + { + var data = new LeaverInfo(); + packet.ResetBitReader(); + data.BnetAccountGUID = packet.ReadPackedGuid128("BnetAccountGUID", indexes); + data.LeaveScore = packet.ReadSingle("LeaveScore", indexes); + data.SeasonID = packet.ReadUInt32("SeasonID", indexes); + data.TotalLeaves = packet.ReadUInt32("TotalLeaves", indexes); + data.TotalSuccesses = packet.ReadUInt32("TotalSuccesses", indexes); + data.ConsecutiveSuccesses = packet.ReadInt32("ConsecutiveSuccesses", indexes); + data.LastPenaltyTime = packet.ReadInt64("LastPenaltyTime", indexes); + data.LeaverExpirationTime = packet.ReadInt64("LeaverExpirationTime", indexes); + data.Unknown_1120 = packet.ReadInt32("Unknown_1120", indexes); + data.LeaverStatus = packet.ReadBits("LeaverStatus", 1, indexes); + return data; + } + + public override IPlayerData ReadUpdatePlayerData(Packet packet, params object[] indexes) + { + var data = new PlayerData(); + //packet.ResetBitReader(); + //var rawChangesMask = new int[5]; + //var rawMaskMask = new int[1]; + //rawMaskMask[0] = (int)packet.ReadBits(5); + //var maskMask = new BitArray(rawMaskMask); + //for (var i = 0; i < 5; ++i) + // if (maskMask[i]) + // rawChangesMask[i] = (int)packet.ReadBits(32); + //var changesMask = new BitArray(rawChangesMask); + + //var noQuestLogChangesMask = packet.ReadBit(); + //var hasDeclinedNames = false; + //if (changesMask[0]) + //{ + // if (changesMask[1]) + // { + // data.HasLevelLink = packet.ReadBit("HasLevelLink", indexes); + // } + // if (changesMask[2]) + // { + // data.Customizations.ReadUpdateMask(packet); + // } + // if (changesMask[3]) + // { + // data.ArenaCooldowns.ReadUpdateMask(packet); + // } + // // todo pet names + // if (changesMask[4]) + // { + // data.VisualItemReplacements.ReadUpdateMask(packet); + // } + //} + //packet.ResetBitReader(); + //if (changesMask[0]) + //{ + // if (changesMask[2]) + // { + // for (var i = 0; i < data.Customizations.Count; ++i) + // { + // if (data.Customizations.UpdateMask[i]) + // { + // data.Customizations[i] = ReadUpdateChrCustomizationChoice(packet, indexes, "Customizations", i); + // } + // } + // } + // if (changesMask[3]) + // { + // for (var i = 0; i < data.ArenaCooldowns.Count; ++i) + // { + // if (data.ArenaCooldowns.UpdateMask[i]) + // { + // data.ArenaCooldowns[i] = ReadUpdateArenaCooldown(packet, indexes, "ArenaCooldowns", i); + // } + // } + // } + // if (changesMask[4]) + // { + // for (var i = 0; i < data.VisualItemReplacements.Count; ++i) + // { + // if (data.VisualItemReplacements.UpdateMask[i]) + // { + // data.VisualItemReplacements[i] = packet.ReadInt32("VisualItemReplacements", indexes, i); + // } + // } + // } + // // todo pet names? + // if (changesMask[5]) + // { + // data.DuelArbiter = packet.ReadPackedGuid128("DuelArbiter", indexes); + // } + // if (changesMask[6]) + // { + // data.WowAccount = packet.ReadPackedGuid128("WowAccount", indexes); + // } + // if (changesMask[7]) + // { + // data.BnetAccount = packet.ReadPackedGuid128("BnetAccount", indexes); + // } + // if (changesMask[8]) + // { + // data.GuildClubMemberID = packet.ReadUInt64("GuildClubMemberID", indexes); + // } + // if (changesMask[9]) + // { + // data.LootTargetGUID = packet.ReadPackedGuid128("LootTargetGUID", indexes); + // } + // if (changesMask[10]) + // { + // data.PlayerFlags = packet.ReadUInt32("PlayerFlags", indexes); + // } + // if (changesMask[11]) + // { + // data.PlayerFlagsEx = packet.ReadUInt32("PlayerFlagsEx", indexes); + // } + // if (changesMask[12]) + // { + // data.GuildRankID = packet.ReadUInt32("GuildRankID", indexes); + // } + // if (changesMask[13]) + // { + // data.GuildDeleteDate = packet.ReadUInt32("GuildDeleteDate", indexes); + // } + // if (changesMask[14]) + // { + // data.GuildLevel = packet.ReadInt32("GuildLevel", indexes); + // } + // if (changesMask[15]) + // { + // data.NumBankSlots = packet.ReadByte("NumBankSlots", indexes); + // } + // if (changesMask[16]) + // { + // data.NativeSex = packet.ReadByte("NativeSex", indexes); + // } + // if (changesMask[17]) + // { + // data.Inebriation = packet.ReadByte("Inebriation", indexes); + // } + // if (changesMask[18]) + // { + // data.PvpTitle = packet.ReadByte("PvpTitle", indexes); + // } + // if (changesMask[19]) + // { + // data.ArenaFaction = packet.ReadByte("ArenaFaction", indexes); + // } + // if (changesMask[20]) + // { + // data.PvpRank = packet.ReadByte("PvpRank", indexes); + // } + // if (changesMask[21]) + // { + // data.Field_88 = packet.ReadInt32("Field_88", indexes); + // } + // if (changesMask[22]) + // { + // data.DuelTeam = packet.ReadUInt32("DuelTeam", indexes); + // } + // if (changesMask[23]) + // { + // data.GuildTimeStamp = packet.ReadInt32("GuildTimeStamp", indexes); + // } + // if (changesMask[24]) + // { + // data.PlayerTitle = packet.ReadInt32("PlayerTitle", indexes); + // } + // if (changesMask[25]) + // { + // data.FakeInebriation = packet.ReadInt32("FakeInebriation", indexes); + // } + // if (changesMask[26]) + // { + // data.VirtualPlayerRealm = packet.ReadUInt32("VirtualPlayerRealm", indexes); + // } + // if (changesMask[27]) + // { + // data.CurrentSpecID = packet.ReadUInt32("CurrentSpecID", indexes); + // } + // if (changesMask[28]) + // { + // data.TaxiMountAnimKitID = packet.ReadInt32("TaxiMountAnimKitID", indexes); + // } + // // todo unk + // if (changesMask[29]) + // { + // data.CurrentBattlePetBreedQuality = packet.ReadByte("CurrentBattlePetBreedQuality", indexes); + // } + // if (changesMask[30]) + // { + // data.HonorLevel = packet.ReadInt32("HonorLevel", indexes); + // } + // if (changesMask[31]) + // { + // data.LogoutTime = packet.ReadInt64("LogoutTime", indexes); + // } + //} + //if (changesMask[32]) + //{ + // if (changesMask[34]) + // { + // data.Field_13C = packet.ReadInt32("Field_13C", indexes); + // } + // if (changesMask[35]) + // { + // data.Field_140 = packet.ReadInt32("Field_140", indexes); + // } + // if (changesMask[36]) + // { + // data.CurrentBattlePetSpeciesID = packet.ReadInt32("CurrentBattlePetSpeciesID", indexes); + // } + // if (changesMask[39]) + // { + // data.PersonalTabard = ReadUpdateCustomTabardInfo(packet, indexes, "PersonalTabard"); + // } + // if (changesMask[33]) + // { + // data.Name = new string('*', (int)packet.ReadBits(6)); + // } + // hasDeclinedNames = packet.ReadBit("HasDeclinedNames", indexes); + // packet.ResetBitReader(); + // if (changesMask[37]) + // { + // Substructures.MythicPlusHandler.ReadDungeonScoreSummary(packet, indexes, "DungeonScore"); + // } + // if (changesMask[33]) + // { + // data.Name = packet.ReadWoWString("Name", data.Name.Length, indexes); + // } + // // leaverinfo + // if (changesMask[38]) + // { + // if (hasDeclinedNames) + // { + // data.DeclinedNames = ReadUpdateDeclinedNames(packet, indexes, "DeclinedNames"); + // } + // } + //} + //if (changesMask[40]) + //{ + // for (var i = 0; i < 2; ++i) + // { + // if (changesMask[41 + i]) + // { + // data.PartyType[i] = packet.ReadByte("PartyType", indexes, i); + // } + // } + //} + //if (changesMask[43]) + //{ + // for (var i = 0; i < 25; ++i) + // { + // if (changesMask[44 + i]) + // { + // if (noQuestLogChangesMask) + // data.QuestLog[i] = ReadCreateQuestLog(packet, indexes, "QuestLog", i); + // else + // data.QuestLog[i] = ReadUpdateQuestLog(packet, indexes, "QuestLog", i); + // } + // } + //} + //if (changesMask[69]) + //{ + // for (var i = 0; i < 19; ++i) + // { + // if (changesMask[70 + i]) + // { + // data.VisibleItems[i] = ReadUpdateVisibleItem(packet, indexes, "VisibleItems", i); + // } + // } + //} + //if (changesMask[89]) + //{ + // for (var i = 0; i < 6; ++i) + // { + // if (changesMask[90 + i]) + // { + // data.AvgItemLevel[i] = packet.ReadSingle("AvgItemLevel", indexes, i); + // } + // } + //} + //if (changesMask[96]) + //{ + // for (var i = 0; i < 32; ++i) + // { + // if (changesMask[97 + i]) + // { + // data.ForcedReactions[i] = ReadUpdateZonePlayerForcedReaction(packet, indexes, "ForcedReactions", i); + // } + // } + //} + //if (changesMask[129]) + //{ + // for (var i = 0; i < 19; ++i) + // { + // if (changesMask[130 + i]) + // { + // data.Field_3120[i] = packet.ReadUInt32("Field_3120", indexes, i); + // } + // } + //} + return data; + } + + public static ISkillInfo ReadCreateSkillInfo(Packet packet, params object[] indexes) + { + var data = new SkillInfo(); + packet.ResetBitReader(); + for (var i = 0; i < 256; ++i) + { + data.SkillLineID[i] = packet.ReadUInt16("SkillLineID", indexes, i); + data.SkillStep[i] = packet.ReadUInt16("SkillStep", indexes, i); + data.SkillRank[i] = packet.ReadUInt16("SkillRank", indexes, i); + data.SkillStartingRank[i] = packet.ReadUInt16("SkillStartingRank", indexes, i); + data.SkillMaxRank[i] = packet.ReadUInt16("SkillMaxRank", indexes, i); + data.SkillTempBonus[i] = packet.ReadInt16("SkillTempBonus", indexes, i); + data.SkillPermBonus[i] = packet.ReadUInt16("SkillPermBonus", indexes, i); + } + return data; + } + + public static ISkillInfo ReadUpdateSkillInfo(Packet packet, params object[] indexes) + { + var data = new SkillInfo(); + packet.ResetBitReader(); + var rawChangesMask = new int[57]; + var rawMaskMask = new int[2]; + for (var i = 0; i < 1; ++i) + rawMaskMask[i] = packet.ReadInt32(); + rawMaskMask[1] = (int)packet.ReadBits(25); + var maskMask = new BitArray(rawMaskMask); + for (var i = 0; i < 57; ++i) + if (maskMask[i]) + rawChangesMask[i] = (int)packet.ReadBits(32); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + for (var i = 0; i < 256; ++i) + { + if (changesMask[1 + i]) + { + data.SkillLineID[i] = packet.ReadUInt16("SkillLineID", indexes, i); + } + if (changesMask[257 + i]) + { + data.SkillStep[i] = packet.ReadUInt16("SkillStep", indexes, i); + } + if (changesMask[513 + i]) + { + data.SkillRank[i] = packet.ReadUInt16("SkillRank", indexes, i); + } + if (changesMask[769 + i]) + { + data.SkillStartingRank[i] = packet.ReadUInt16("SkillStartingRank", indexes, i); + } + if (changesMask[1025 + i]) + { + data.SkillMaxRank[i] = packet.ReadUInt16("SkillMaxRank", indexes, i); + } + if (changesMask[1281 + i]) + { + data.SkillTempBonus[i] = packet.ReadInt16("SkillTempBonus", indexes, i); + } + if (changesMask[1537 + i]) + { + data.SkillPermBonus[i] = packet.ReadUInt16("SkillPermBonus", indexes, i); + } + } + } + return data; + } + + public static IBitVector ReadCreateBitVector(Packet packet, params object[] indexes) + { + var data = new BitVector(); + packet.ResetBitReader(); + data.Values.Resize(packet.ReadUInt32()); + for (var i = 0; i < data.Values.Count; ++i) + { + data.Values[i] = packet.ReadUInt64("Values", indexes, i); + } + return data; + } + + public static IBitVector ReadUpdateBitVector(Packet packet, params object[] indexes) + { + var data = new BitVector(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(2); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.Values.ReadUpdateMask(packet); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (var i = 0; i < data.Values.Count; ++i) + { + if (data.Values.UpdateMask[i]) + { + data.Values[i] = packet.ReadUInt64("Values", indexes, i); + } + } + } + } + return data; + } + + public static IBitVectors ReadCreateBitVectors(Packet packet, params object[] indexes) + { + var data = new BitVectors(); + packet.ResetBitReader(); + for (var i = 0; i < 13; ++i) + { + data.Values[i] = ReadCreateBitVector(packet, indexes, "Values", i); + } + return data; + } + + public static IBitVectors ReadUpdateBitVectors(Packet packet, params object[] indexes) + { + var data = new BitVectors(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + var rawMaskMask = new int[1]; + rawMaskMask[0] = (int)packet.ReadBits(1); + var maskMask = new BitArray(rawMaskMask); + if (maskMask[0]) + rawChangesMask[0] = (int)packet.ReadBits(32); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + for (var i = 0; i < 13; ++i) + { + if (changesMask[1 + i]) + { + data.Values[i] = ReadUpdateBitVector(packet, indexes, "Values", i); + } + } + } + return data; + } + + public static IPlayerDataElement ReadCreatePlayerDataElement(Packet packet, params object[] indexes) + { + var data = new PlayerDataElement(); + packet.ResetBitReader(); + data.Type = packet.ReadUInt32("Type", indexes); + if (data.Type == 1) + { + data.FloatValue = packet.ReadSingle("FloatValue", indexes); + } + if (data.Type == 0) + { + data.Int64Value = packet.ReadInt64("Int64Value", indexes); + } + return data; + } + + public static IPlayerDataElement ReadUpdatePlayerDataElement(Packet packet, params object[] indexes) + { + var data = new PlayerDataElement(); + packet.ResetBitReader(); + data.Type = packet.ReadBits("Type", 1, indexes); + if (data.Type == 1) + { + data.FloatValue = packet.ReadSingle("FloatValue", indexes); + } + if (data.Type == 0) + { + data.Int64Value = packet.ReadInt64("Int64Value", indexes); + } + return data; + } + + public static IRestInfo ReadCreateRestInfo(Packet packet, params object[] indexes) + { + var data = new RestInfo(); + packet.ResetBitReader(); + data.Threshold = packet.ReadUInt32("Threshold", indexes); + data.StateID = packet.ReadByte("StateID", indexes); + return data; + } + + public static IRestInfo ReadUpdateRestInfo(Packet packet, params object[] indexes) + { + var data = new RestInfo(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(3); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.Threshold = packet.ReadUInt32("Threshold", indexes); + } + if (changesMask[2]) + { + data.StateID = packet.ReadByte("StateID", indexes); + } + } + return data; + } + + public static IPVPInfo ReadCreatePVPInfo(Packet packet, params object[] indexes) + { + var data = new PVPInfo(); + packet.ResetBitReader(); + data.Bracket = packet.ReadSByte("Bracket", indexes); + data.PvpRatingID = packet.ReadInt32("PvpRatingID", indexes); + data.WeeklyPlayed = packet.ReadUInt32("WeeklyPlayed", indexes); + data.WeeklyWon = packet.ReadUInt32("WeeklyWon", indexes); + data.SeasonPlayed = packet.ReadUInt32("SeasonPlayed", indexes); + data.SeasonWon = packet.ReadUInt32("SeasonWon", indexes); + data.Rating = packet.ReadUInt32("Rating", indexes); + data.WeeklyBestRating = packet.ReadUInt32("WeeklyBestRating", indexes); + data.SeasonBestRating = packet.ReadUInt32("SeasonBestRating", indexes); + data.PvpTierID = packet.ReadUInt32("PvpTierID", indexes); + data.WeeklyBestWinPvpTierID = packet.ReadUInt32("WeeklyBestWinPvpTierID", indexes); + data.Field_28 = packet.ReadUInt32("Field_28", indexes); + data.Field_2C = packet.ReadUInt32("Field_2C", indexes); + data.WeeklyRoundsPlayed = packet.ReadUInt32("WeeklyRoundsPlayed", indexes); + data.WeeklyRoundsWon = packet.ReadUInt32("WeeklyRoundsWon", indexes); + data.SeasonRoundsPlayed = packet.ReadUInt32("SeasonRoundsPlayed", indexes); + data.SeasonRoundsWon = packet.ReadUInt32("SeasonRoundsWon", indexes); + data.Disqualified = packet.ReadBit("Disqualified", indexes); + return data; + } + + public static IPVPInfo ReadUpdatePVPInfo(Packet packet, params object[] indexes) + { + var data = new PVPInfo(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(19); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.Disqualified = packet.ReadBit("Disqualified", indexes); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[2]) + { + data.Bracket = packet.ReadSByte("Bracket", indexes); + } + if (changesMask[3]) + { + data.PvpRatingID = packet.ReadInt32("PvpRatingID", indexes); + } + if (changesMask[4]) + { + data.WeeklyPlayed = packet.ReadUInt32("WeeklyPlayed", indexes); + } + if (changesMask[5]) + { + data.WeeklyWon = packet.ReadUInt32("WeeklyWon", indexes); + } + if (changesMask[6]) + { + data.SeasonPlayed = packet.ReadUInt32("SeasonPlayed", indexes); + } + if (changesMask[7]) + { + data.SeasonWon = packet.ReadUInt32("SeasonWon", indexes); + } + if (changesMask[8]) + { + data.Rating = packet.ReadUInt32("Rating", indexes); + } + if (changesMask[9]) + { + data.WeeklyBestRating = packet.ReadUInt32("WeeklyBestRating", indexes); + } + if (changesMask[10]) + { + data.SeasonBestRating = packet.ReadUInt32("SeasonBestRating", indexes); + } + if (changesMask[11]) + { + data.PvpTierID = packet.ReadUInt32("PvpTierID", indexes); + } + if (changesMask[12]) + { + data.WeeklyBestWinPvpTierID = packet.ReadUInt32("WeeklyBestWinPvpTierID", indexes); + } + if (changesMask[13]) + { + data.Field_28 = packet.ReadUInt32("Field_28", indexes); + } + if (changesMask[14]) + { + data.Field_2C = packet.ReadUInt32("Field_2C", indexes); + } + if (changesMask[15]) + { + data.WeeklyRoundsPlayed = packet.ReadUInt32("WeeklyRoundsPlayed", indexes); + } + if (changesMask[16]) + { + data.WeeklyRoundsWon = packet.ReadUInt32("WeeklyRoundsWon", indexes); + } + if (changesMask[17]) + { + data.SeasonRoundsPlayed = packet.ReadUInt32("SeasonRoundsPlayed", indexes); + } + if (changesMask[18]) + { + data.SeasonRoundsWon = packet.ReadUInt32("SeasonRoundsWon", indexes); + } + } + return data; + } + + public static IResearch ReadCreateResearch(Packet packet, params object[] indexes) + { + var data = new Research(); + packet.ResetBitReader(); + data.ResearchProjectID = packet.ReadInt16("ResearchProjectID", indexes); + return data; + } + + public static IResearch ReadUpdateResearch(Packet packet, params object[] indexes) + { + var data = new Research(); + packet.ResetBitReader(); + data.ResearchProjectID = packet.ReadInt16("ResearchProjectID", indexes); + return data; + } + + public static ICharacterRestriction ReadCreateCharacterRestriction(Packet packet, params object[] indexes) + { + var data = new CharacterRestriction(); + packet.ResetBitReader(); + data.Field_0 = packet.ReadInt32("Field_0", indexes); + data.Field_4 = packet.ReadInt32("Field_4", indexes); + data.Field_8 = packet.ReadInt32("Field_8", indexes); + data.Type = packet.ReadBits("Type", 5, indexes); + return data; + } + + public static ICharacterRestriction ReadUpdateCharacterRestriction(Packet packet, params object[] indexes) + { + var data = new CharacterRestriction(); + packet.ResetBitReader(); + data.Field_0 = packet.ReadInt32("Field_0", indexes); + data.Field_4 = packet.ReadInt32("Field_4", indexes); + data.Field_8 = packet.ReadInt32("Field_8", indexes); + data.Type = packet.ReadBits("Type", 5, indexes); + return data; + } + + public static ISpellPctModByLabel ReadCreateSpellPctModByLabel(Packet packet, params object[] indexes) + { + var data = new SpellPctModByLabel(); + packet.ResetBitReader(); + data.ModIndex = packet.ReadInt32("ModIndex", indexes); + data.ModifierValue = packet.ReadSingle("ModifierValue", indexes); + data.LabelID = packet.ReadInt32("LabelID", indexes); + return data; + } + + public static ISpellPctModByLabel ReadUpdateSpellPctModByLabel(Packet packet, params object[] indexes) + { + var data = new SpellPctModByLabel(); + packet.ResetBitReader(); + data.ModIndex = packet.ReadInt32("ModIndex", indexes); + data.ModifierValue = packet.ReadSingle("ModifierValue", indexes); + data.LabelID = packet.ReadInt32("LabelID", indexes); + return data; + } + + public static ISpellFlatModByLabel ReadCreateSpellFlatModByLabel(Packet packet, params object[] indexes) + { + var data = new SpellFlatModByLabel(); + packet.ResetBitReader(); + data.ModIndex = packet.ReadInt32("ModIndex", indexes); + data.ModifierValue = packet.ReadInt32("ModifierValue", indexes); + data.LabelID = packet.ReadInt32("LabelID", indexes); + return data; + } + + public static ISpellFlatModByLabel ReadUpdateSpellFlatModByLabel(Packet packet, params object[] indexes) + { + var data = new SpellFlatModByLabel(); + packet.ResetBitReader(); + data.ModIndex = packet.ReadInt32("ModIndex", indexes); + data.ModifierValue = packet.ReadInt32("ModifierValue", indexes); + data.LabelID = packet.ReadInt32("LabelID", indexes); + return data; + } + + public static ICompletedProject ReadCreateCompletedProject(Packet packet, params object[] indexes) + { + var data = new CompletedProject(); + packet.ResetBitReader(); + + long firstCompleted = packet.ReadInt64(); + data.FirstCompleted = firstCompleted; + packet.AddValue("FirstCompleted", Utilities.GetDateTimeFromUnixTime(firstCompleted), indexes); + + data.ProjectID = packet.ReadUInt32("ProjectID", indexes); + data.CompletionCount = packet.ReadUInt32("CompletionCount", indexes); + return data; + } + + public static ICompletedProject ReadUpdateCompletedProject(Packet packet, params object[] indexes) + { + var data = new CompletedProject(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(4); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + long firstCompleted = packet.ReadInt64(); + data.FirstCompleted = firstCompleted; + packet.AddValue("FirstCompleted", Utilities.GetDateTimeFromUnixTime(firstCompleted), indexes); + } + if (changesMask[2]) + { + data.ProjectID = packet.ReadUInt32("ProjectID", indexes); + } + if (changesMask[3]) + { + data.CompletionCount = packet.ReadUInt32("CompletionCount", indexes); + } + } + return data; + } + + public static IResearchHistory ReadCreateResearchHistory(Packet packet, params object[] indexes) + { + var data = new ResearchHistory(); + packet.ResetBitReader(); + data.CompletedProjects.Resize(packet.ReadUInt32()); + for (var i = 0; i < data.CompletedProjects.Count; ++i) + { + data.CompletedProjects[i] = ReadCreateCompletedProject(packet, indexes, "CompletedProjects", i); + } + return data; + } + + public static IResearchHistory ReadUpdateResearchHistory(Packet packet, params object[] indexes) + { + var data = new ResearchHistory(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(2); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.CompletedProjects.ReadUpdateMask(packet); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (var i = 0; i < data.CompletedProjects.Count; ++i) + { + if (data.CompletedProjects.UpdateMask[i]) + { + data.CompletedProjects[i] = ReadUpdateCompletedProject(packet, indexes, "CompletedProjects", i); + } + } + } + } + return data; + } + + public static ITraitEntry ReadCreateTraitEntry(Packet packet, params object[] indexes) + { + var data = new TraitEntry(); + packet.ResetBitReader(); + data.TraitNodeID = packet.ReadInt32("TraitNodeID", indexes); + data.TraitNodeEntryID = packet.ReadInt32("TraitNodeEntryID", indexes); + data.Rank = packet.ReadInt32("Rank", indexes); + data.GrantedRanks = packet.ReadInt32("GrantedRanks", indexes); + return data; + } + + public static ITraitEntry ReadUpdateTraitEntry(Packet packet, params object[] indexes) + { + var data = new TraitEntry(); + packet.ResetBitReader(); + data.TraitNodeID = packet.ReadInt32("TraitNodeID", indexes); + data.TraitNodeEntryID = packet.ReadInt32("TraitNodeEntryID", indexes); + data.Rank = packet.ReadInt32("Rank", indexes); + data.GrantedRanks = packet.ReadInt32("GrantedRanks", indexes); + return data; + } + + public static ITraitSubTreeCache ReadCreateTraitSubTreeCache(Packet packet, params object[] indexes) + { + var data = new TraitSubTreeCache(); + packet.ResetBitReader(); + data.TraitSubTreeID = packet.ReadInt32("TraitSubTreeID", indexes); + data.Entries = new ITraitEntry[packet.ReadUInt32()]; + for (var i = 0; i < data.Entries.Length; ++i) + { + data.Entries[i] = ReadCreateTraitEntry(packet, indexes, "Entries", i); + } + data.Active = packet.ReadBits("Active", 1, indexes); + return data; + } + + public static ITraitSubTreeCache ReadUpdateTraitSubTreeCache(Packet packet, params object[] indexes) + { + var data = new TraitSubTreeCache(); + packet.ResetBitReader(); + data.TraitSubTreeID = packet.ReadInt32("TraitSubTreeID", indexes); + data.Entries = new ITraitEntry[packet.ReadUInt32()]; + for (var i = 0; i < data.Entries.Length; ++i) + { + data.Entries[i] = ReadUpdateTraitEntry(packet, indexes, "Entries", i); + } + packet.ResetBitReader(); + data.Active = packet.ReadBits("Active", 1, indexes); + return data; + } + + public static ITraitConfig ReadCreateTraitConfig(Packet packet, params object[] indexes) + { + var data = new TraitConfig(); + packet.ResetBitReader(); + data.ID = packet.ReadInt32("ID", indexes); + data.Type = packet.ReadInt32("Type", indexes); + data.Entries.Resize(packet.ReadUInt32()); + data.SubTrees.Resize(packet.ReadUInt32()); + if (data.Type == 2) + { + data.SkillLineID = packet.ReadInt32("SkillLineID", indexes); + } + if (data.Type == 1) + { + data.ChrSpecializationID = packet.ReadInt32("ChrSpecializationID", indexes); + data.CombatConfigFlags = packet.ReadInt32("CombatConfigFlags", indexes); + data.LocalIdentifier = packet.ReadInt32("LocalIdentifier", indexes); + } + if (data.Type == 3) + { + data.TraitSystemID = packet.ReadInt32("TraitSystemID", indexes); + } + for (var i = 0; i < data.Entries.Count; ++i) + { + data.Entries[i] = ReadCreateTraitEntry(packet, indexes, "Entries", i); + } + data.Name = new string('*', (int)packet.ReadBits(9)); + for (var i = 0; i < data.SubTrees.Count; ++i) + { + data.SubTrees[i] = ReadCreateTraitSubTreeCache(packet, indexes, "SubTrees", i); + } + data.Name = packet.ReadWoWString("Name", data.Name.Length, indexes); + return data; + } + + public static ITraitConfig ReadUpdateTraitConfig(Packet packet, params object[] indexes) + { + var data = new TraitConfig(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(14); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.Entries.ReadUpdateMask(packet); + } + if (changesMask[2]) + { + data.SubTrees.ReadUpdateMask(packet); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (var i = 0; i < data.Entries.Count; ++i) + { + if (data.Entries.UpdateMask[i]) + { + data.Entries[i] = ReadUpdateTraitEntry(packet, indexes, "Entries", i); + } + } + } + if (changesMask[2]) + { + for (var i = 0; i < data.SubTrees.Count; ++i) + { + if (data.SubTrees.UpdateMask[i]) + { + data.SubTrees[i] = ReadUpdateTraitSubTreeCache(packet, indexes, "SubTrees", i); + } + } + } + if (changesMask[3]) + { + data.ID = packet.ReadInt32("ID", indexes); + } + } + if (changesMask[4]) + { + if (changesMask[6]) + { + data.Type = packet.ReadInt32("Type", indexes); + } + if (changesMask[7]) + { + if (data.Type == 2) + { + data.SkillLineID = packet.ReadInt32("SkillLineID", indexes); + } + } + } + if (changesMask[8]) + { + if (changesMask[9]) + { + if (data.Type == 1) + { + data.ChrSpecializationID = packet.ReadInt32("ChrSpecializationID", indexes); + } + } + if (changesMask[10]) + { + if (data.Type == 1) + { + data.CombatConfigFlags = packet.ReadInt32("CombatConfigFlags", indexes); + } + } + if (changesMask[11]) + { + if (data.Type == 1) + { + data.LocalIdentifier = packet.ReadInt32("LocalIdentifier", indexes); + } + } + } + if (changesMask[12]) + { + if (changesMask[13]) + { + if (data.Type == 3) + { + data.TraitSystemID = packet.ReadInt32("TraitSystemID", indexes); + } + } + } + if (changesMask[4]) + { + if (changesMask[5]) + { + data.Name = new string('*', (int)packet.ReadBits(9)); + data.Name = packet.ReadWoWString("Name", data.Name.Length, indexes); + } + } + return data; + } + + public static ICategoryCooldownMod ReadCreateCategoryCooldownMod(Packet packet, params object[] indexes) + { + var data = new CategoryCooldownMod(); + packet.ResetBitReader(); + data.SpellCategoryID = packet.ReadInt32("SpellCategoryID", indexes); + data.ModCooldown = packet.ReadInt32("ModCooldown", indexes); + return data; + } + + public static ICategoryCooldownMod ReadUpdateCategoryCooldownMod(Packet packet, params object[] indexes) + { + var data = new CategoryCooldownMod(); + packet.ResetBitReader(); + data.SpellCategoryID = packet.ReadInt32("SpellCategoryID", indexes); + data.ModCooldown = packet.ReadInt32("ModCooldown", indexes); + return data; + } + + public static IWeeklySpellUse ReadCreateWeeklySpellUse(Packet packet, params object[] indexes) + { + var data = new WeeklySpellUse(); + packet.ResetBitReader(); + data.SpellCategoryID = packet.ReadInt32("SpellCategoryID", indexes); + data.Uses = packet.ReadByte("Uses", indexes); + return data; + } + + public static IWeeklySpellUse ReadUpdateWeeklySpellUse(Packet packet, params object[] indexes) + { + var data = new WeeklySpellUse(); + packet.ResetBitReader(); + data.SpellCategoryID = packet.ReadInt32("SpellCategoryID", indexes); + data.Uses = packet.ReadByte("Uses", indexes); + return data; + } + + public static IStablePetInfo ReadCreateStablePetInfo(Packet packet, params object[] indexes) + { + var data = new StablePetInfo(); + packet.ResetBitReader(); + data.PetSlot = packet.ReadUInt32("PetSlot", indexes); + data.PetNumber = packet.ReadUInt32("PetNumber", indexes); + data.CreatureID = packet.ReadUInt32("CreatureID", indexes); + data.DisplayID = packet.ReadUInt32("DisplayID", indexes); + data.ExperienceLevel = packet.ReadUInt32("ExperienceLevel", indexes); + data.PetFlags = packet.ReadByte("PetFlags", indexes); + data.Field_96 = packet.ReadByte("Field_96", indexes); + data.Specialization = packet.ReadUInt32("Specialization", indexes); + data.Name = new string('*', (int)packet.ReadBits(8)); + data.Name = packet.ReadWoWString("Name", data.Name.Length, indexes); + return data; + } + + public static IStablePetInfo ReadUpdateStablePetInfo(Packet packet, params object[] indexes) + { + var data = new StablePetInfo(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(10); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.PetSlot = packet.ReadUInt32("PetSlot", indexes); + } + if (changesMask[2]) + { + data.PetNumber = packet.ReadUInt32("PetNumber", indexes); + } + if (changesMask[3]) + { + data.CreatureID = packet.ReadUInt32("CreatureID", indexes); + } + if (changesMask[4]) + { + data.DisplayID = packet.ReadUInt32("DisplayID", indexes); + } + if (changesMask[5]) + { + data.ExperienceLevel = packet.ReadUInt32("ExperienceLevel", indexes); + } + if (changesMask[7]) + { + data.PetFlags = packet.ReadByte("PetFlags", indexes); + } + if (changesMask[8]) + { + data.Field_96 = packet.ReadByte("Field_96", indexes); + } + if (changesMask[9]) + { + data.Specialization = packet.ReadUInt32("Specialization", indexes); + } + if (changesMask[6]) + { + data.Name = new string('*', (int)packet.ReadBits(8)); + data.Name = packet.ReadWoWString("Name", data.Name.Length, indexes); + } + } + return data; + } + + public static IStableInfo ReadCreateStableInfo(Packet packet, params object[] indexes) + { + var data = new StableInfo(); + packet.ResetBitReader(); + data.Pets.Resize(packet.ReadUInt32()); + data.StableMaster = packet.ReadPackedGuid128("StableMaster", indexes); + for (var i = 0; i < data.Pets.Count; ++i) + { + data.Pets[i] = ReadCreateStablePetInfo(packet, indexes, "Pets", i); + } + return data; + } + + public static IStableInfo ReadUpdateStableInfo(Packet packet, params object[] indexes) + { + var data = new StableInfo(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(3); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.Pets.ReadUpdateMask(packet); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (var i = 0; i < data.Pets.Count; ++i) + { + if (data.Pets.UpdateMask[i]) + { + data.Pets[i] = ReadUpdateStablePetInfo(packet, indexes, "Pets", i); + } + } + } + if (changesMask[2]) + { + data.StableMaster = packet.ReadPackedGuid128("StableMaster", indexes); + } + } + return data; + } + + public static IBankTabSettings ReadCreateBankTabSettings(Packet packet, params object[] indexes) + { + var data = new BankTabSettings(); + packet.ResetBitReader(); + data.Name = new string('*', (int)packet.ReadBits(7)); + data.Icon = new string('*', (int)packet.ReadBits(9)); + data.Description = new string('*', (int)packet.ReadBits(14)); + data.DepositFlags = packet.ReadInt32("DepositFlags", indexes); + data.Name = packet.ReadWoWString("Name", data.Name.Length, indexes); + data.Icon = packet.ReadWoWString("Icon", data.Icon.Length, indexes); + data.Description = packet.ReadWoWString("Description", data.Description.Length, indexes); + return data; + } + + public static IBankTabSettings ReadUpdateBankTabSettings(Packet packet, params object[] indexes) + { + var data = new BankTabSettings(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(4); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + data.Name = new string('*', (int)packet.ReadBits(7)); + } + if (changesMask[1]) + { + data.Icon = new string('*', (int)packet.ReadBits(9)); + } + if (changesMask[2]) + { + data.Description = new string('*', (int)packet.ReadBits(14)); + } + packet.ResetBitReader(); + if (changesMask[3]) + { + data.DepositFlags = packet.ReadInt32("DepositFlags", indexes); + } + if (changesMask[0]) + { + data.Name = packet.ReadWoWString("Name", data.Name.Length, indexes); + } + if (changesMask[1]) + { + data.Icon = packet.ReadWoWString("Icon", data.Icon.Length, indexes); + } + if (changesMask[2]) + { + data.Description = packet.ReadWoWString("Description", data.Description.Length, indexes); + } + return data; + } + + public override IActivePlayerData ReadCreateActivePlayerData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new ActivePlayerData(); + packet.ResetBitReader(); + var hasPetStable = false; + for (var i = 0; i < 146; ++i) + { + data.InvSlots[i] = packet.ReadPackedGuid128("InvSlots", indexes, i); + } + data.FarsightObject = packet.ReadPackedGuid128("FarsightObject", indexes); + data.SummonedBattlePetGUID = packet.ReadPackedGuid128("SummonedBattlePetGUID", indexes); + data.KnownTitles.Resize(packet.ReadUInt32()); + data.Coinage = packet.ReadUInt64("Coinage", indexes); + data.AccountBankCoinage = packet.ReadUInt64("AccountBankCoinage", indexes); + data.XP = packet.ReadInt32("XP", indexes); + data.NextLevelXP = packet.ReadInt32("NextLevelXP", indexes); + data.TrialXP = packet.ReadInt32("TrialXP", indexes); + data.Skill = ReadCreateSkillInfo(packet, indexes, "Skill"); + data.CharacterPoints = packet.ReadInt32("CharacterPoints", indexes); + data.MaxTalentTiers = packet.ReadInt32("MaxTalentTiers", indexes); + data.TrackCreatureMask = packet.ReadUInt32("TrackCreatureMask", indexes); + for (var i = 0; i < 2; ++i) + { + data.TrackResourceMask[i] = packet.ReadUInt32("TrackResourceMask", indexes, i); + } + data.MainhandExpertise = packet.ReadSingle("MainhandExpertise", indexes); + data.OffhandExpertise = packet.ReadSingle("OffhandExpertise", indexes); + data.RangedExpertise = packet.ReadSingle("RangedExpertise", indexes); + data.CombatRatingExpertise = packet.ReadSingle("CombatRatingExpertise", indexes); + data.BlockPercentage = packet.ReadSingle("BlockPercentage", indexes); + data.DodgePercentage = packet.ReadSingle("DodgePercentage", indexes); + data.DodgePercentageFromAttribute = packet.ReadSingle("DodgePercentageFromAttribute", indexes); + data.ParryPercentage = packet.ReadSingle("ParryPercentage", indexes); + data.ParryPercentageFromAttribute = packet.ReadSingle("ParryPercentageFromAttribute", indexes); + data.CritPercentage = packet.ReadSingle("CritPercentage", indexes); + data.RangedCritPercentage = packet.ReadSingle("RangedCritPercentage", indexes); + data.OffhandCritPercentage = packet.ReadSingle("OffhandCritPercentage", indexes); + for (var i = 0; i < 7; ++i) + { + data.SpellCritPercentage[i] = packet.ReadSingle("SpellCritPercentage", indexes, i); + data.ModDamageDonePos[i] = packet.ReadInt32("ModDamageDonePos", indexes, i); + data.ModDamageDoneNeg[i] = packet.ReadInt32("ModDamageDoneNeg", indexes, i); + data.ModDamageDonePercent[i] = packet.ReadSingle("ModDamageDonePercent", indexes, i); + } + data.ShieldBlock = packet.ReadInt32("ShieldBlock", indexes); + data.ShieldBlockCritPercentage = packet.ReadSingle("ShieldBlockCritPercentage", indexes); + data.Mastery = packet.ReadSingle("Mastery", indexes); + data.Speed = packet.ReadSingle("Speed", indexes); + data.Avoidance = packet.ReadSingle("Avoidance", indexes); + data.Sturdiness = packet.ReadSingle("Sturdiness", indexes); + data.Versatility = packet.ReadInt32("Versatility", indexes); + data.VersatilityBonus = packet.ReadSingle("VersatilityBonus", indexes); + data.PvpPowerDamage = packet.ReadSingle("PvpPowerDamage", indexes); + data.PvpPowerHealing = packet.ReadSingle("PvpPowerHealing", indexes); + data.BitVectors = ReadCreateBitVectors(packet, indexes, "BitVectors"); + data.CharacterDataElements.Resize(packet.ReadUInt32()); + data.AccountDataElements.Resize(packet.ReadUInt32()); + for (var i = 0; i < 2; ++i) + { + data.RestInfo[i] = ReadCreateRestInfo(packet, indexes, "RestInfo", i); + } + data.ModHealingDonePos = packet.ReadInt32("ModHealingDonePos", indexes); + data.ModHealingPercent = packet.ReadSingle("ModHealingPercent", indexes); + data.ModHealingDonePercent = packet.ReadSingle("ModHealingDonePercent", indexes); + data.ModPeriodicHealingDonePercent = packet.ReadSingle("ModPeriodicHealingDonePercent", indexes); + for (var i = 0; i < 3; ++i) + { + data.WeaponDmgMultipliers[i] = packet.ReadSingle("WeaponDmgMultipliers", indexes, i); + data.WeaponAtkSpeedMultipliers[i] = packet.ReadSingle("WeaponAtkSpeedMultipliers", indexes, i); + } + data.ModSpellPowerPercent = packet.ReadSingle("ModSpellPowerPercent", indexes); + data.ModResiliencePercent = packet.ReadSingle("ModResiliencePercent", indexes); + data.OverrideSpellPowerByAPPercent = packet.ReadSingle("OverrideSpellPowerByAPPercent", indexes); + data.OverrideAPBySpellPowerPercent = packet.ReadSingle("OverrideAPBySpellPowerPercent", indexes); + data.ModTargetResistance = packet.ReadInt32("ModTargetResistance", indexes); + data.ModTargetPhysicalResistance = packet.ReadInt32("ModTargetPhysicalResistance", indexes); + data.LocalFlags = packet.ReadUInt32("LocalFlags", indexes); + data.GrantableLevels = packet.ReadByte("GrantableLevels", indexes); + data.MultiActionBars = packet.ReadByte("MultiActionBars", indexes); + data.LifetimeMaxRank = packet.ReadByte("LifetimeMaxRank", indexes); + data.NumRespecs = packet.ReadByte("NumRespecs", indexes); + data.AmmoID = packet.ReadInt32("AmmoID", indexes); + data.PvpMedals = packet.ReadUInt32("PvpMedals", indexes); + for (var i = 0; i < 12; ++i) + { + data.BuybackPrice[i] = packet.ReadUInt32("BuybackPrice", indexes, i); + data.BuybackTimestamp[i] = packet.ReadInt64("BuybackTimestamp", indexes, i); + } + data.TodayHonorableKills = packet.ReadUInt16("TodayHonorableKills", indexes); + data.TodayDishonorableKills = packet.ReadUInt16("TodayDishonorableKills", indexes); + data.YesterdayHonorableKills = packet.ReadUInt16("YesterdayHonorableKills", indexes); + data.YesterdayDishonorableKills = packet.ReadUInt16("YesterdayDishonorableKills", indexes); + data.LastWeekHonorableKills = packet.ReadUInt16("LastWeekHonorableKills", indexes); + data.LastWeekDishonorableKills = packet.ReadUInt16("LastWeekDishonorableKills", indexes); + data.ThisWeekHonorableKills = packet.ReadUInt16("ThisWeekHonorableKills", indexes); + data.ThisWeekDishonorableKills = packet.ReadUInt16("ThisWeekDishonorableKills", indexes); + data.ThisWeekContribution = packet.ReadUInt32("ThisWeekContribution", indexes); + data.LifetimeHonorableKills = packet.ReadUInt32("LifetimeHonorableKills", indexes); + data.LifetimeDishonorableKills = packet.ReadUInt32("LifetimeDishonorableKills", indexes); + data.Field_F24 = packet.ReadUInt32("Field_F24", indexes); + data.YesterdayContribution = packet.ReadUInt32("YesterdayContribution", indexes); + data.LastWeekContribution = packet.ReadUInt32("LastWeekContribution", indexes); + data.LastWeekRank = packet.ReadUInt32("LastWeekRank", indexes); + data.WatchedFactionIndex = packet.ReadInt32("WatchedFactionIndex", indexes); + for (var i = 0; i < 32; ++i) + { + data.CombatRatings[i] = packet.ReadInt32("CombatRatings", indexes, i); + } + data.MaxLevel = packet.ReadInt32("MaxLevel", indexes); + data.ScalingPlayerLevelDelta = packet.ReadInt32("ScalingPlayerLevelDelta", indexes); + data.MaxCreatureScalingLevel = packet.ReadInt32("MaxCreatureScalingLevel", indexes); + for (var i = 0; i < 4; ++i) + { + data.NoReagentCostMask[i] = packet.ReadUInt32("NoReagentCostMask", indexes, i); + } + data.PetSpellPower = packet.ReadInt32("PetSpellPower", indexes); + for (var i = 0; i < 2; ++i) + { + data.ProfessionSkillLine[i] = packet.ReadInt32("ProfessionSkillLine", indexes, i); + } + data.UiHitModifier = packet.ReadSingle("UiHitModifier", indexes); + data.UiSpellHitModifier = packet.ReadSingle("UiSpellHitModifier", indexes); + data.HomeRealmTimeOffset = packet.ReadInt32("HomeRealmTimeOffset", indexes); + data.ModPetHaste = packet.ReadSingle("ModPetHaste", indexes); + data.LocalRegenFlags = packet.ReadByte("LocalRegenFlags", indexes); + data.AuraVision = packet.ReadByte("AuraVision", indexes); + data.NumBackpackSlots = packet.ReadByte("NumBackpackSlots", indexes); + data.OverrideSpellsID = packet.ReadInt32("OverrideSpellsID", indexes); + data.LfgBonusFactionID = packet.ReadInt32("LfgBonusFactionID", indexes); + data.LootSpecID = packet.ReadUInt16("LootSpecID", indexes); + data.OverrideZonePVPType = packet.ReadUInt32("OverrideZonePVPType", indexes); + for (var i = 0; i < 4; ++i) + { + data.BagSlotFlags[i] = packet.ReadUInt32("BagSlotFlags", indexes, i); + } + for (var i = 0; i < 6; ++i) + { + data.BankBagSlotFlags[i] = packet.ReadUInt32("BankBagSlotFlags", indexes, i); + } + data.Honor = packet.ReadInt32("Honor", indexes); + data.HonorNextLevel = packet.ReadInt32("HonorNextLevel", indexes); + data.Field_F74 = packet.ReadInt32("Field_F74", indexes); + data.Field_1261 = packet.ReadByte("Field_1261", indexes); + data.PvpTierMaxFromWins = packet.ReadInt32("PvpTierMaxFromWins", indexes); + data.PvpLastWeeksTierMaxFromWins = packet.ReadInt32("PvpLastWeeksTierMaxFromWins", indexes); + data.PvpRankProgress = packet.ReadByte("PvpRankProgress", indexes); + data.PerksProgramCurrency = packet.ReadInt32("PerksProgramCurrency", indexes); + for (var i = 0; i < 1; ++i) + { + data.ResearchSites[i].Resize(packet.ReadUInt32()); + data.ResearchSiteProgress[i].Resize(packet.ReadUInt32()); + data.Research[i].Resize(packet.ReadUInt32()); + for (var j = 0; j < data.ResearchSites[i].Count; ++j) + { + data.ResearchSites[i][j] = packet.ReadUInt16("ResearchSites", indexes, i, j); + } + for (var j = 0; j < data.ResearchSiteProgress[i].Count; ++j) + { + data.ResearchSiteProgress[i][j] = packet.ReadUInt32("ResearchSiteProgress", indexes, i, j); + } + for (var j = 0; j < data.Research[i].Count; ++j) + { + data.Research[i][j] = ReadCreateResearch(packet, indexes, "Research", i, j); + } + } + data.DailyQuestsCompleted.Resize(packet.ReadUInt32()); + data.Field_1000.Resize(packet.ReadUInt32()); + data.AvailableQuestLineXQuestIDs.Resize(packet.ReadUInt32()); + data.Heirlooms.Resize(packet.ReadUInt32()); + data.HeirloomFlags.Resize(packet.ReadUInt32()); + data.Toys.Resize(packet.ReadUInt32()); + data.Transmog.Resize(packet.ReadUInt32()); + data.ConditionalTransmog.Resize(packet.ReadUInt32()); + data.SelfResSpells.Resize(packet.ReadUInt32()); + data.WarbandScenes.Resize(packet.ReadUInt32()); + data.CharacterRestrictions.Resize(packet.ReadUInt32()); + data.SpellPctModByLabel.Resize(packet.ReadUInt32()); + data.SpellFlatModByLabel.Resize(packet.ReadUInt32()); + data.TaskQuests.Resize(packet.ReadUInt32()); + data.TimerunningSeasonID = packet.ReadInt32("TimerunningSeasonID", indexes); + data.TransportServerTime = packet.ReadInt32("TransportServerTime", indexes); + data.TraitConfigs.Resize(packet.ReadUInt32()); + data.ActiveCombatTraitConfigID = packet.ReadUInt32("ActiveCombatTraitConfigID", indexes); + for (var i = 0; i < 9; ++i) + { + data.GlyphSlots[i] = packet.ReadUInt32("GlyphSlots", indexes, i); + data.Glyphs[i] = packet.ReadUInt32("Glyphs", indexes, i); + } + data.GlyphsEnabled = packet.ReadUInt16("GlyphsEnabled", indexes); + data.LfgRoles = packet.ReadByte("LfgRoles", indexes); + data.CategoryCooldownMods.Resize(packet.ReadUInt32()); + data.WeeklySpellUses.Resize(packet.ReadUInt32()); + data.NumStableSlots = packet.ReadByte("NumStableSlots", indexes); + for (var i = 0; i < 13; ++i) + { + data.Field_4348[i] = packet.ReadUInt64("Field_4348", indexes, i); + } + data.Field_17B8 = packet.ReadInt32("Field_17B8", indexes); + for (var i = 0; i < data.KnownTitles.Count; ++i) + { + data.KnownTitles[i] = packet.ReadUInt64("KnownTitles", indexes, i); + } + for (var i = 0; i < data.CharacterDataElements.Count; ++i) + { + data.CharacterDataElements[i] = ReadCreatePlayerDataElement(packet, indexes, "CharacterDataElements", i); + } + for (var i = 0; i < data.AccountDataElements.Count; ++i) + { + data.AccountDataElements[i] = ReadCreatePlayerDataElement(packet, indexes, "AccountDataElements", i); + } + for (var i = 0; i < data.DailyQuestsCompleted.Count; ++i) + { + data.DailyQuestsCompleted[i] = packet.ReadInt32("DailyQuestsCompleted", indexes, i); + } + for (var i = 0; i < data.Field_1000.Count; ++i) + { + data.Field_1000[i] = packet.ReadInt32("Field_1000", indexes, i); + } + for (var i = 0; i < data.AvailableQuestLineXQuestIDs.Count; ++i) + { + data.AvailableQuestLineXQuestIDs[i] = packet.ReadInt32("AvailableQuestLineXQuestIDs", indexes, i); + } + for (var i = 0; i < data.Heirlooms.Count; ++i) + { + data.Heirlooms[i] = packet.ReadInt32("Heirlooms", indexes, i); + } + for (var i = 0; i < data.HeirloomFlags.Count; ++i) + { + data.HeirloomFlags[i] = packet.ReadUInt32("HeirloomFlags", indexes, i); + } + for (var i = 0; i < data.Toys.Count; ++i) + { + data.Toys[i] = packet.ReadInt32("Toys", indexes, i); + } + //for (var i = 0; i < data.ToyFlags.Count; ++i) + //{ + // data.ToyFlags[i] = packet.ReadUInt32("ToyFlags", indexes, i); + //} + for (var i = 0; i < data.Transmog.Count; ++i) + { + data.Transmog[i] = packet.ReadUInt32("Transmog", indexes, i); + } + for (var i = 0; i < data.ConditionalTransmog.Count; ++i) + { + data.ConditionalTransmog[i] = packet.ReadInt32("ConditionalTransmog", indexes, i); + } + for (var i = 0; i < data.SelfResSpells.Count; ++i) + { + data.SelfResSpells[i] = packet.ReadInt32("SelfResSpells", indexes, i); + } + for (var i = 0; i < data.WarbandScenes.Count; ++i) + { + data.WarbandScenes[i] = packet.ReadUInt32("WarbandScenes", indexes, i); + } + for (var i = 0; i < data.SpellPctModByLabel.Count; ++i) + { + data.SpellPctModByLabel[i] = ReadCreateSpellPctModByLabel(packet, indexes, "SpellPctModByLabel", i); + } + for (var i = 0; i < data.SpellFlatModByLabel.Count; ++i) + { + data.SpellFlatModByLabel[i] = ReadCreateSpellFlatModByLabel(packet, indexes, "SpellFlatModByLabel", i); + } + for (var i = 0; i < data.TaskQuests.Count; ++i) + { + data.TaskQuests[i] = ReadCreateQuestLog(packet, indexes, "TaskQuests", i); + } + for (var i = 0; i < data.CategoryCooldownMods.Count; ++i) + { + data.CategoryCooldownMods[i] = ReadCreateCategoryCooldownMod(packet, indexes, "CategoryCooldownMods", i); + } + for (var i = 0; i < data.WeeklySpellUses.Count; ++i) + { + data.WeeklySpellUses[i] = ReadCreateWeeklySpellUse(packet, indexes, "WeeklySpellUses", i); + } + for (var i = 0; i < 9; ++i) + { + data.PvpInfo[i] = ReadCreatePVPInfo(packet, indexes, "PvpInfo", i); + } + packet.ResetBitReader(); + data.SortBagsRightToLeft = packet.ReadBit("SortBagsRightToLeft", indexes); + data.InsertItemsLeftToRight = packet.ReadBit("InsertItemsLeftToRight", indexes); + hasPetStable = packet.ReadBit("HasPetStable", indexes); + data.AccountBankTabSettings.Resize(packet.ReadBits(3)); + data.ResearchHistory = ReadCreateResearchHistory(packet, indexes, "ResearchHistory"); + Substructures.PerksProgramHandler.ReadPerksVendorItem550(packet, indexes, "FrozenPerksVendorItem"); + MythicPlusHandler.ReadDungeonScoreData(packet, indexes, "DungeonScore"); + var mapSizeTraitConfigs = packet.ReadUInt32(); + for (var m = 0u; m < mapSizeTraitConfigs; ++m) + { + var key = packet.ReadInt32("Key", indexes, m); + data.TraitConfigs[key] = ReadCreateTraitConfig(packet, indexes, "Value", m); + } + for (var i = 0; i < data.CharacterRestrictions.Count; ++i) + { + data.CharacterRestrictions[i] = ReadCreateCharacterRestriction(packet, indexes, "CharacterRestrictions", i); + } + if (hasPetStable) + { + data.PetStable = ReadCreateStableInfo(packet, indexes, "PetStable"); + } + for (var i = 0; i < data.AccountBankTabSettings.Count; ++i) + { + data.AccountBankTabSettings[i] = ReadCreateBankTabSettings(packet, indexes, "AccountBankTabSettings", i); + } + return data; + } + + public override IActivePlayerData ReadUpdateActivePlayerData(Packet packet, params object[] indexes) + { + var data = new ActivePlayerData(); + //packet.ResetBitReader(); + //var rawChangesMask = new int[14]; + //var rawMaskMask = new int[1]; + //rawMaskMask[0] = (int)packet.ReadBits(14); + //var maskMask = new BitArray(rawMaskMask); + //for (var i = 0; i < 14; ++i) + // if (maskMask[i]) + // rawChangesMask[i] = (int)packet.ReadBits(32); + //var changesMask = new BitArray(rawChangesMask); + + //var hasPetStable = false; + //if (changesMask[0]) + //{ + // if (changesMask[1]) + // { + // data.SortBagsRightToLeft = packet.ReadBit("SortBagsRightToLeft", indexes); + // } + // if (changesMask[2]) + // { + // data.InsertItemsLeftToRight = packet.ReadBit("InsertItemsLeftToRight", indexes); + // } + // if (changesMask[3]) + // { + // data.KnownTitles.ReadUpdateMask(packet); + // } + // if (changesMask[4]) + // { + // data.CharacterDataElements.ReadUpdateMask(packet); + // } + // if (changesMask[5]) + // { + // data.AccountDataElements.ReadUpdateMask(packet); + // } + //} + //if (changesMask[25]) + //{ + // for (var i = 0; i < 1; ++i) + // { + // if (changesMask[26]) + // { + // data.ResearchSites[i].ReadUpdateMask(packet); + // } + // } + //} + //if (changesMask[27]) + //{ + // for (var i = 0; i < 1; ++i) + // { + // if (changesMask[28]) + // { + // data.ResearchSiteProgress[i].ReadUpdateMask(packet); + // } + // } + //} + //if (changesMask[29]) + //{ + // for (var i = 0; i < 1; ++i) + // { + // if (changesMask[30]) + // { + // data.Research[i].ReadUpdateMask(packet); + // } + // } + //} + //if (changesMask[25]) + //{ + // for (var i = 0; i < 1; ++i) + // { + // if (changesMask[26]) + // { + // for (var j = 0; j < data.ResearchSites[i].Count; ++j) + // { + // if (data.ResearchSites[i].UpdateMask[j]) + // { + // data.ResearchSites[i][j] = packet.ReadUInt16("ResearchSites", indexes, i, j); + // } + // } + // } + // } + //} + //if (changesMask[27]) + //{ + // for (var i = 0; i < 1; ++i) + // { + // if (changesMask[28]) + // { + // for (var j = 0; j < data.ResearchSiteProgress[i].Count; ++j) + // { + // if (data.ResearchSiteProgress[i].UpdateMask[j]) + // { + // data.ResearchSiteProgress[i][j] = packet.ReadUInt32("ResearchSiteProgress", indexes, i, j); + // } + // } + // } + // } + //} + //if (changesMask[29]) + //{ + // for (var i = 0; i < 1; ++i) + // { + // if (changesMask[30]) + // { + // for (var j = 0; j < data.Research[i].Count; ++j) + // { + // if (data.Research[i].UpdateMask[j]) + // { + // data.Research[i][j] = ReadUpdateResearch(packet, indexes, "Research", i, j); + // } + // } + // } + // } + //} + //packet.ResetBitReader(); + //if (changesMask[0]) + //{ + // if (changesMask[6]) + // { + // data.DailyQuestsCompleted.ReadUpdateMask(packet); + // } + // if (changesMask[7]) + // { + // data.Field_1000.ReadUpdateMask(packet); + // } + // if (changesMask[8]) + // { + // data.AvailableQuestLineXQuestIDs.ReadUpdateMask(packet); + // } + // if (changesMask[9]) + // { + // data.Heirlooms.ReadUpdateMask(packet); + // } + // if (changesMask[10]) + // { + // data.HeirloomFlags.ReadUpdateMask(packet); + // } + // if (changesMask[11]) + // { + // data.Toys.ReadUpdateMask(packet); + // } + // if (changesMask[12]) + // { + // data.ToyFlags.ReadUpdateMask(packet); + // } + // if (changesMask[13]) + // { + // data.Transmog.ReadUpdateMask(packet); + // } + // if (changesMask[14]) + // { + // data.ConditionalTransmog.ReadUpdateMask(packet); + // } + // if (changesMask[15]) + // { + // data.SelfResSpells.ReadUpdateMask(packet); + // } + // if (changesMask[16]) + // { + // data.WarbandScenes.ReadUpdateMask(packet); + // } + // if (changesMask[17]) + // { + // data.CharacterRestrictions.ReadUpdateMask(packet); + // } + // if (changesMask[18]) + // { + // data.SpellPctModByLabel.ReadUpdateMask(packet); + // } + // if (changesMask[19]) + // { + // data.SpellFlatModByLabel.ReadUpdateMask(packet); + // } + // if (changesMask[20]) + // { + // data.TaskQuests.ReadUpdateMask(packet); + // } + // if (changesMask[21]) + // { + // data.TraitConfigs.ReadUpdateMask(packet); + // } + // if (changesMask[22]) + // { + // data.CategoryCooldownMods.ReadUpdateMask(packet); + // } + // if (changesMask[23]) + // { + // data.WeeklySpellUses.ReadUpdateMask(packet); + // } + //} + //packet.ResetBitReader(); + //if (changesMask[0]) + //{ + // if (changesMask[3]) + // { + // for (var i = 0; i < data.KnownTitles.Count; ++i) + // { + // if (data.KnownTitles.UpdateMask[i]) + // { + // data.KnownTitles[i] = packet.ReadUInt64("KnownTitles", indexes, i); + // } + // } + // } + // if (changesMask[4]) + // { + // for (var i = 0; i < data.CharacterDataElements.Count; ++i) + // { + // if (data.CharacterDataElements.UpdateMask[i]) + // { + // data.CharacterDataElements[i] = ReadUpdatePlayerDataElement(packet, indexes, "CharacterDataElements", i); + // } + // } + // } + // if (changesMask[5]) + // { + // for (var i = 0; i < data.AccountDataElements.Count; ++i) + // { + // if (data.AccountDataElements.UpdateMask[i]) + // { + // data.AccountDataElements[i] = ReadUpdatePlayerDataElement(packet, indexes, "AccountDataElements", i); + // } + // } + // } + // if (changesMask[6]) + // { + // for (var i = 0; i < data.DailyQuestsCompleted.Count; ++i) + // { + // if (data.DailyQuestsCompleted.UpdateMask[i]) + // { + // data.DailyQuestsCompleted[i] = packet.ReadInt32("DailyQuestsCompleted", indexes, i); + // } + // } + // } + // if (changesMask[7]) + // { + // for (var i = 0; i < data.Field_1000.Count; ++i) + // { + // if (data.Field_1000.UpdateMask[i]) + // { + // data.Field_1000[i] = packet.ReadInt32("Field_1000", indexes, i); + // } + // } + // } + // if (changesMask[8]) + // { + // for (var i = 0; i < data.AvailableQuestLineXQuestIDs.Count; ++i) + // { + // if (data.AvailableQuestLineXQuestIDs.UpdateMask[i]) + // { + // data.AvailableQuestLineXQuestIDs[i] = packet.ReadInt32("AvailableQuestLineXQuestIDs", indexes, i); + // } + // } + // } + // if (changesMask[9]) + // { + // for (var i = 0; i < data.Heirlooms.Count; ++i) + // { + // if (data.Heirlooms.UpdateMask[i]) + // { + // data.Heirlooms[i] = packet.ReadInt32("Heirlooms", indexes, i); + // } + // } + // } + // if (changesMask[10]) + // { + // for (var i = 0; i < data.HeirloomFlags.Count; ++i) + // { + // if (data.HeirloomFlags.UpdateMask[i]) + // { + // data.HeirloomFlags[i] = packet.ReadUInt32("HeirloomFlags", indexes, i); + // } + // } + // } + // if (changesMask[11]) + // { + // for (var i = 0; i < data.Toys.Count; ++i) + // { + // if (data.Toys.UpdateMask[i]) + // { + // data.Toys[i] = packet.ReadInt32("Toys", indexes, i); + // } + // } + // } + // if (changesMask[12]) + // { + // for (var i = 0; i < data.ToyFlags.Count; ++i) + // { + // if (data.ToyFlags.UpdateMask[i]) + // { + // data.ToyFlags[i] = packet.ReadUInt32("ToyFlags", indexes, i); + // } + // } + // } + // if (changesMask[13]) + // { + // for (var i = 0; i < data.Transmog.Count; ++i) + // { + // if (data.Transmog.UpdateMask[i]) + // { + // data.Transmog[i] = packet.ReadUInt32("Transmog", indexes, i); + // } + // } + // } + // if (changesMask[14]) + // { + // for (var i = 0; i < data.ConditionalTransmog.Count; ++i) + // { + // if (data.ConditionalTransmog.UpdateMask[i]) + // { + // data.ConditionalTransmog[i] = packet.ReadInt32("ConditionalTransmog", indexes, i); + // } + // } + // } + // if (changesMask[15]) + // { + // for (var i = 0; i < data.SelfResSpells.Count; ++i) + // { + // if (data.SelfResSpells.UpdateMask[i]) + // { + // data.SelfResSpells[i] = packet.ReadInt32("SelfResSpells", indexes, i); + // } + // } + // } + // if (changesMask[16]) + // { + // for (var i = 0; i < data.WarbandScenes.Count; ++i) + // { + // if (data.WarbandScenes.UpdateMask[i]) + // { + // data.WarbandScenes[i] = packet.ReadUInt32("WarbandScenes", indexes, i); + // } + // } + // } + // if (changesMask[18]) + // { + // for (var i = 0; i < data.SpellPctModByLabel.Count; ++i) + // { + // if (data.SpellPctModByLabel.UpdateMask[i]) + // { + // data.SpellPctModByLabel[i] = ReadUpdateSpellPctModByLabel(packet, indexes, "SpellPctModByLabel", i); + // } + // } + // } + // if (changesMask[19]) + // { + // for (var i = 0; i < data.SpellFlatModByLabel.Count; ++i) + // { + // if (data.SpellFlatModByLabel.UpdateMask[i]) + // { + // data.SpellFlatModByLabel[i] = ReadUpdateSpellFlatModByLabel(packet, indexes, "SpellFlatModByLabel", i); + // } + // } + // } + // if (changesMask[20]) + // { + // for (var i = 0; i < data.TaskQuests.Count; ++i) + // { + // if (data.TaskQuests.UpdateMask[i]) + // { + // data.TaskQuests[i] = ReadUpdateQuestLog(packet, indexes, "TaskQuests", i); + // } + // } + // } + // if (changesMask[22]) + // { + // for (var i = 0; i < data.CategoryCooldownMods.Count; ++i) + // { + // if (data.CategoryCooldownMods.UpdateMask[i]) + // { + // data.CategoryCooldownMods[i] = ReadUpdateCategoryCooldownMod(packet, indexes, "CategoryCooldownMods", i); + // } + // } + // } + // if (changesMask[23]) + // { + // for (var i = 0; i < data.WeeklySpellUses.Count; ++i) + // { + // if (data.WeeklySpellUses.UpdateMask[i]) + // { + // data.WeeklySpellUses[i] = ReadUpdateWeeklySpellUse(packet, indexes, "WeeklySpellUses", i); + // } + // } + // } + //} + //packet.ResetBitReader(); + //if (changesMask[0]) + //{ + // if (changesMask[24]) + // { + // data.AccountBankTabSettings.ReadUpdateMask(packet, 3); + // } + //} + //packet.ResetBitReader(); + //if (changesMask[0]) + //{ + // if (changesMask[17]) + // { + // for (var i = 0; i < data.CharacterRestrictions.Count; ++i) + // { + // if (data.CharacterRestrictions.UpdateMask[i]) + // { + // data.CharacterRestrictions[i] = ReadUpdateCharacterRestriction(packet, indexes, "CharacterRestrictions", i); + // } + // } + // } + // if (changesMask[21]) + // { + // for (var i = 0; i < data.TraitConfigs.Count; ++i) + // { + // if (data.TraitConfigs.UpdateMask[i]) + // { + // data.TraitConfigs[i] = ReadUpdateTraitConfig(packet, indexes, "TraitConfigs", i); + // } + // } + // } + // if (changesMask[24]) + // { + // for (var i = 0; i < data.AccountBankTabSettings.Count; ++i) + // { + // if (data.AccountBankTabSettings.UpdateMask[i]) + // { + // data.AccountBankTabSettings[i] = ReadUpdateBankTabSettings(packet, indexes, "AccountBankTabSettings", i); + // } + // } + // } + // if (changesMask[31]) + // { + // data.FarsightObject = packet.ReadPackedGuid128("FarsightObject", indexes); + // } + // if (changesMask[32]) + // { + // data.SummonedBattlePetGUID = packet.ReadPackedGuid128("SummonedBattlePetGUID", indexes); + // } + // if (changesMask[33]) + // { + // data.Coinage = packet.ReadUInt64("Coinage", indexes); + // } + // if (changesMask[34]) + // { + // data.AccountBankCoinage = packet.ReadUInt64("AccountBankCoinage", indexes); + // } + // if (changesMask[35]) + // { + // data.XP = packet.ReadInt32("XP", indexes); + // } + // if (changesMask[36]) + // { + // data.NextLevelXP = packet.ReadInt32("NextLevelXP", indexes); + // } + // if (changesMask[37]) + // { + // data.TrialXP = packet.ReadInt32("TrialXP", indexes); + // } + //} + //if (changesMask[38]) + //{ + // if (changesMask[39]) + // { + // data.Skill = ReadUpdateSkillInfo(packet, indexes, "Skill"); + // } + // if (changesMask[40]) + // { + // data.CharacterPoints = packet.ReadInt32("CharacterPoints", indexes); + // } + // if (changesMask[41]) + // { + // data.MaxTalentTiers = packet.ReadInt32("MaxTalentTiers", indexes); + // } + // if (changesMask[42]) + // { + // data.TrackCreatureMask = packet.ReadUInt32("TrackCreatureMask", indexes); + // } + // if (changesMask[43]) + // { + // data.MainhandExpertise = packet.ReadSingle("MainhandExpertise", indexes); + // } + // if (changesMask[44]) + // { + // data.OffhandExpertise = packet.ReadSingle("OffhandExpertise", indexes); + // } + // if (changesMask[45]) + // { + // data.RangedExpertise = packet.ReadSingle("RangedExpertise", indexes); + // } + // if (changesMask[46]) + // { + // data.CombatRatingExpertise = packet.ReadSingle("CombatRatingExpertise", indexes); + // } + // if (changesMask[47]) + // { + // data.BlockPercentage = packet.ReadSingle("BlockPercentage", indexes); + // } + // if (changesMask[48]) + // { + // data.DodgePercentage = packet.ReadSingle("DodgePercentage", indexes); + // } + // if (changesMask[49]) + // { + // data.DodgePercentageFromAttribute = packet.ReadSingle("DodgePercentageFromAttribute", indexes); + // } + // if (changesMask[50]) + // { + // data.ParryPercentage = packet.ReadSingle("ParryPercentage", indexes); + // } + // if (changesMask[51]) + // { + // data.ParryPercentageFromAttribute = packet.ReadSingle("ParryPercentageFromAttribute", indexes); + // } + // if (changesMask[52]) + // { + // data.CritPercentage = packet.ReadSingle("CritPercentage", indexes); + // } + // if (changesMask[53]) + // { + // data.RangedCritPercentage = packet.ReadSingle("RangedCritPercentage", indexes); + // } + // if (changesMask[54]) + // { + // data.OffhandCritPercentage = packet.ReadSingle("OffhandCritPercentage", indexes); + // } + // if (changesMask[55]) + // { + // data.ShieldBlock = packet.ReadInt32("ShieldBlock", indexes); + // } + // if (changesMask[56]) + // { + // data.ShieldBlockCritPercentage = packet.ReadSingle("ShieldBlockCritPercentage", indexes); + // } + // if (changesMask[57]) + // { + // data.Mastery = packet.ReadSingle("Mastery", indexes); + // } + // if (changesMask[58]) + // { + // data.Speed = packet.ReadSingle("Speed", indexes); + // } + // if (changesMask[59]) + // { + // data.Avoidance = packet.ReadSingle("Avoidance", indexes); + // } + // if (changesMask[60]) + // { + // data.Sturdiness = packet.ReadSingle("Sturdiness", indexes); + // } + // if (changesMask[61]) + // { + // data.Versatility = packet.ReadInt32("Versatility", indexes); + // } + // if (changesMask[62]) + // { + // data.VersatilityBonus = packet.ReadSingle("VersatilityBonus", indexes); + // } + // if (changesMask[63]) + // { + // data.PvpPowerDamage = packet.ReadSingle("PvpPowerDamage", indexes); + // } + // if (changesMask[64]) + // { + // data.PvpPowerHealing = packet.ReadSingle("PvpPowerHealing", indexes); + // } + // if (changesMask[65]) + // { + // data.BitVectors = ReadUpdateBitVectors(packet, indexes, "BitVectors"); + // } + // if (changesMask[66]) + // { + // data.ModHealingDonePos = packet.ReadInt32("ModHealingDonePos", indexes); + // } + // if (changesMask[67]) + // { + // data.ModHealingPercent = packet.ReadSingle("ModHealingPercent", indexes); + // } + // if (changesMask[68]) + // { + // data.ModHealingDonePercent = packet.ReadSingle("ModHealingDonePercent", indexes); + // } + // if (changesMask[69]) + // { + // data.ModPeriodicHealingDonePercent = packet.ReadSingle("ModPeriodicHealingDonePercent", indexes); + // } + //} + //if (changesMask[70]) + //{ + // if (changesMask[71]) + // { + // data.ModSpellPowerPercent = packet.ReadSingle("ModSpellPowerPercent", indexes); + // } + // if (changesMask[72]) + // { + // data.ModResiliencePercent = packet.ReadSingle("ModResiliencePercent", indexes); + // } + // if (changesMask[73]) + // { + // data.OverrideSpellPowerByAPPercent = packet.ReadSingle("OverrideSpellPowerByAPPercent", indexes); + // } + // if (changesMask[74]) + // { + // data.OverrideAPBySpellPowerPercent = packet.ReadSingle("OverrideAPBySpellPowerPercent", indexes); + // } + // if (changesMask[75]) + // { + // data.ModTargetResistance = packet.ReadInt32("ModTargetResistance", indexes); + // } + // if (changesMask[76]) + // { + // data.ModTargetPhysicalResistance = packet.ReadInt32("ModTargetPhysicalResistance", indexes); + // } + // if (changesMask[77]) + // { + // data.LocalFlags = packet.ReadUInt32("LocalFlags", indexes); + // } + // if (changesMask[78]) + // { + // data.GrantableLevels = packet.ReadByte("GrantableLevels", indexes); + // } + // if (changesMask[79]) + // { + // data.MultiActionBars = packet.ReadByte("MultiActionBars", indexes); + // } + // if (changesMask[80]) + // { + // data.LifetimeMaxRank = packet.ReadByte("LifetimeMaxRank", indexes); + // } + // if (changesMask[81]) + // { + // data.NumRespecs = packet.ReadByte("NumRespecs", indexes); + // } + // if (changesMask[82]) + // { + // data.AmmoID = packet.ReadInt32("AmmoID", indexes); + // } + // if (changesMask[83]) + // { + // data.PvpMedals = packet.ReadUInt32("PvpMedals", indexes); + // } + // if (changesMask[84]) + // { + // data.TodayHonorableKills = packet.ReadUInt16("TodayHonorableKills", indexes); + // } + // if (changesMask[85]) + // { + // data.TodayDishonorableKills = packet.ReadUInt16("TodayDishonorableKills", indexes); + // } + // if (changesMask[86]) + // { + // data.YesterdayHonorableKills = packet.ReadUInt16("YesterdayHonorableKills", indexes); + // } + // if (changesMask[87]) + // { + // data.YesterdayDishonorableKills = packet.ReadUInt16("YesterdayDishonorableKills", indexes); + // } + // if (changesMask[88]) + // { + // data.LastWeekHonorableKills = packet.ReadUInt16("LastWeekHonorableKills", indexes); + // } + // if (changesMask[89]) + // { + // data.LastWeekDishonorableKills = packet.ReadUInt16("LastWeekDishonorableKills", indexes); + // } + // if (changesMask[90]) + // { + // data.ThisWeekHonorableKills = packet.ReadUInt16("ThisWeekHonorableKills", indexes); + // } + // if (changesMask[91]) + // { + // data.ThisWeekDishonorableKills = packet.ReadUInt16("ThisWeekDishonorableKills", indexes); + // } + // if (changesMask[92]) + // { + // data.ThisWeekContribution = packet.ReadUInt32("ThisWeekContribution", indexes); + // } + // if (changesMask[93]) + // { + // data.LifetimeHonorableKills = packet.ReadUInt32("LifetimeHonorableKills", indexes); + // } + // if (changesMask[94]) + // { + // data.LifetimeDishonorableKills = packet.ReadUInt32("LifetimeDishonorableKills", indexes); + // } + // if (changesMask[95]) + // { + // data.Field_F24 = packet.ReadUInt32("Field_F24", indexes); + // } + // if (changesMask[96]) + // { + // data.YesterdayContribution = packet.ReadUInt32("YesterdayContribution", indexes); + // } + // if (changesMask[97]) + // { + // data.LastWeekContribution = packet.ReadUInt32("LastWeekContribution", indexes); + // } + // if (changesMask[98]) + // { + // data.LastWeekRank = packet.ReadUInt32("LastWeekRank", indexes); + // } + // if (changesMask[99]) + // { + // data.WatchedFactionIndex = packet.ReadInt32("WatchedFactionIndex", indexes); + // } + // if (changesMask[100]) + // { + // data.MaxLevel = packet.ReadInt32("MaxLevel", indexes); + // } + // if (changesMask[101]) + // { + // data.ScalingPlayerLevelDelta = packet.ReadInt32("ScalingPlayerLevelDelta", indexes); + // } + //} + //if (changesMask[102]) + //{ + // if (changesMask[103]) + // { + // data.MaxCreatureScalingLevel = packet.ReadInt32("MaxCreatureScalingLevel", indexes); + // } + // if (changesMask[104]) + // { + // data.PetSpellPower = packet.ReadInt32("PetSpellPower", indexes); + // } + // if (changesMask[105]) + // { + // data.UiHitModifier = packet.ReadSingle("UiHitModifier", indexes); + // } + // if (changesMask[106]) + // { + // data.UiSpellHitModifier = packet.ReadSingle("UiSpellHitModifier", indexes); + // } + // if (changesMask[107]) + // { + // data.HomeRealmTimeOffset = packet.ReadInt32("HomeRealmTimeOffset", indexes); + // } + // if (changesMask[108]) + // { + // data.ModPetHaste = packet.ReadSingle("ModPetHaste", indexes); + // } + // if (changesMask[109]) + // { + // data.LocalRegenFlags = packet.ReadByte("LocalRegenFlags", indexes); + // } + // if (changesMask[110]) + // { + // data.AuraVision = packet.ReadByte("AuraVision", indexes); + // } + // if (changesMask[111]) + // { + // data.NumBackpackSlots = packet.ReadByte("NumBackpackSlots", indexes); + // } + // if (changesMask[112]) + // { + // data.OverrideSpellsID = packet.ReadInt32("OverrideSpellsID", indexes); + // } + // if (changesMask[113]) + // { + // data.LfgBonusFactionID = packet.ReadInt32("LfgBonusFactionID", indexes); + // } + // if (changesMask[114]) + // { + // data.LootSpecID = packet.ReadUInt16("LootSpecID", indexes); + // } + // if (changesMask[115]) + // { + // data.OverrideZonePVPType = packet.ReadUInt32("OverrideZonePVPType", indexes); + // } + // if (changesMask[116]) + // { + // data.Honor = packet.ReadInt32("Honor", indexes); + // } + // if (changesMask[117]) + // { + // data.HonorNextLevel = packet.ReadInt32("HonorNextLevel", indexes); + // } + // if (changesMask[118]) + // { + // data.Field_F74 = packet.ReadInt32("Field_F74", indexes); + // } + // if (changesMask[119]) + // { + // data.Field_1261 = packet.ReadByte("Field_1261", indexes); + // } + // if (changesMask[120]) + // { + // data.PvpTierMaxFromWins = packet.ReadInt32("PvpTierMaxFromWins", indexes); + // } + // if (changesMask[121]) + // { + // data.PvpLastWeeksTierMaxFromWins = packet.ReadInt32("PvpLastWeeksTierMaxFromWins", indexes); + // } + // if (changesMask[122]) + // { + // data.PvpRankProgress = packet.ReadByte("PvpRankProgress", indexes); + // } + // if (changesMask[123]) + // { + // data.PerksProgramCurrency = packet.ReadInt32("PerksProgramCurrency", indexes); + // } + // if (changesMask[126]) + // { + // data.TimerunningSeasonID = packet.ReadInt32("TimerunningSeasonID", indexes); + // } + // if (changesMask[127]) + // { + // data.TransportServerTime = packet.ReadInt32("TransportServerTime", indexes); + // } + // if (changesMask[129]) + // { + // data.ActiveCombatTraitConfigID = packet.ReadUInt32("ActiveCombatTraitConfigID", indexes); + // } + // if (changesMask[130]) + // { + // data.GlyphsEnabled = packet.ReadUInt16("GlyphsEnabled", indexes); + // } + // if (changesMask[131]) + // { + // data.LfgRoles = packet.ReadByte("LfgRoles", indexes); + // } + // if (changesMask[133]) + // { + // data.NumStableSlots = packet.ReadByte("NumStableSlots", indexes); + // } + //} + //if (changesMask[134]) + //{ + // if (changesMask[135]) + // { + // data.Field_17B8 = packet.ReadInt32("Field_17B8", indexes); + // } + //} + //if (changesMask[102]) + //{ + // packet.ResetBitReader(); + // hasPetStable = packet.ReadBit("HasPetStable", indexes); + // if (changesMask[124]) + // { + // data.ResearchHistory = ReadUpdateResearchHistory(packet, indexes, "ResearchHistory"); + // } + // if (changesMask[125]) + // { + // Substructures.PerksProgramHandler.ReadPerksVendorItem550(packet, indexes, "FrozenPerksVendorItem"); + // } + // if (changesMask[128]) + // { + // MythicPlusHandler.ReadDungeonScoreData(packet, indexes, "DungeonScore"); + // } + // if (changesMask[132]) + // { + // if (hasPetStable) + // { + // data.PetStable = ReadUpdateStableInfo(packet, indexes, "PetStable"); + // } + // } + //} + //if (changesMask[136]) + //{ + // for (var i = 0; i < 146; ++i) + // { + // if (changesMask[137 + i]) + // { + // data.InvSlots[i] = packet.ReadPackedGuid128("InvSlots", indexes, i); + // } + // } + //} + //if (changesMask[283]) + //{ + // for (var i = 0; i < 2; ++i) + // { + // if (changesMask[284 + i]) + // { + // data.TrackResourceMask[i] = packet.ReadUInt32("TrackResourceMask", indexes, i); + // } + // } + //} + //if (changesMask[286]) + //{ + // for (var i = 0; i < 7; ++i) + // { + // if (changesMask[287 + i]) + // { + // data.SpellCritPercentage[i] = packet.ReadSingle("SpellCritPercentage", indexes, i); + // } + // if (changesMask[294 + i]) + // { + // data.ModDamageDonePos[i] = packet.ReadInt32("ModDamageDonePos", indexes, i); + // } + // if (changesMask[301 + i]) + // { + // data.ModDamageDoneNeg[i] = packet.ReadInt32("ModDamageDoneNeg", indexes, i); + // } + // if (changesMask[308 + i]) + // { + // data.ModDamageDonePercent[i] = packet.ReadSingle("ModDamageDonePercent", indexes, i); + // } + // } + //} + //if (changesMask[315]) + //{ + // for (var i = 0; i < 2; ++i) + // { + // if (changesMask[316 + i]) + // { + // data.RestInfo[i] = ReadUpdateRestInfo(packet, indexes, "RestInfo", i); + // } + // } + //} + //if (changesMask[318]) + //{ + // for (var i = 0; i < 3; ++i) + // { + // if (changesMask[319 + i]) + // { + // data.WeaponDmgMultipliers[i] = packet.ReadSingle("WeaponDmgMultipliers", indexes, i); + // } + // if (changesMask[322 + i]) + // { + // data.WeaponAtkSpeedMultipliers[i] = packet.ReadSingle("WeaponAtkSpeedMultipliers", indexes, i); + // } + // } + //} + //if (changesMask[325]) + //{ + // for (var i = 0; i < 12; ++i) + // { + // if (changesMask[326 + i]) + // { + // data.BuybackPrice[i] = packet.ReadUInt32("BuybackPrice", indexes, i); + // } + // if (changesMask[338 + i]) + // { + // data.BuybackTimestamp[i] = packet.ReadInt64("BuybackTimestamp", indexes, i); + // } + // } + //} + //if (changesMask[350]) + //{ + // for (var i = 0; i < 32; ++i) + // { + // if (changesMask[351 + i]) + // { + // data.CombatRatings[i] = packet.ReadInt32("CombatRatings", indexes, i); + // } + // } + //} + //if (changesMask[393]) + //{ + // for (var i = 0; i < 4; ++i) + // { + // if (changesMask[394 + i]) + // { + // data.NoReagentCostMask[i] = packet.ReadUInt32("NoReagentCostMask", indexes, i); + // } + // } + //} + //if (changesMask[398]) + //{ + // for (var i = 0; i < 2; ++i) + // { + // if (changesMask[399 + i]) + // { + // data.ProfessionSkillLine[i] = packet.ReadInt32("ProfessionSkillLine", indexes, i); + // } + // } + //} + //if (changesMask[401]) + //{ + // for (var i = 0; i < 4; ++i) + // { + // if (changesMask[402 + i]) + // { + // data.BagSlotFlags[i] = packet.ReadUInt32("BagSlotFlags", indexes, i); + // } + // } + //} + //if (changesMask[406]) + //{ + // for (var i = 0; i < 7; ++i) + // { + // if (changesMask[407 + i]) + // { + // data.BankBagSlotFlags[i] = packet.ReadUInt32("BankBagSlotFlags", indexes, i); + // } + // } + //} + //if (changesMask[414]) + //{ + // for (var i = 0; i < 6; ++i) + // { + // if (changesMask[415 + i]) + // { + // data.GlyphSlots[i] = packet.ReadUInt32("GlyphSlots", indexes, i); + // } + // if (changesMask[421 + i]) + // { + // data.Glyphs[i] = packet.ReadUInt32("Glyphs", indexes, i); + // } + // } + //} + //if (changesMask[427]) + //{ + // for (var i = 0; i < 13; ++i) + // { + // if (changesMask[428 + i]) + // { + // data.Field_4348[i] = packet.ReadUInt64("Field_4348", indexes, i); + // } + // } + //} + //if (changesMask[383]) + //{ + // for (var i = 0; i < 9; ++i) + // { + // if (changesMask[384 + i]) + // { + // data.PvpInfo[i] = ReadUpdatePVPInfo(packet, indexes, "PvpInfo", i); + // } + // } + //} + return data; + } + + public override IGameObjectData ReadCreateGameObjectData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new GameObjectData(); + packet.ResetBitReader(); + data.DisplayID = packet.ReadInt32("DisplayID", indexes); + data.SpellVisualID = packet.ReadUInt32("SpellVisualID", indexes); + data.StateSpellVisualID = packet.ReadUInt32("StateSpellVisualID", indexes); + data.SpawnTrackingStateAnimID = packet.ReadUInt32("SpawnTrackingStateAnimID", indexes); + data.SpawnTrackingStateAnimKitID = packet.ReadUInt32("SpawnTrackingStateAnimKitID", indexes); + data.StateWorldEffectIDs = new System.Nullable[packet.ReadUInt32()]; + for (var i = 0; i < data.StateWorldEffectIDs.Length; ++i) + { + data.StateWorldEffectIDs[i] = packet.ReadUInt32("StateWorldEffectIDs", indexes, i); + } + data.CreatedBy = packet.ReadPackedGuid128("CreatedBy", indexes); + data.GuildGUID = packet.ReadPackedGuid128("GuildGUID", indexes); + data.Flags = packet.ReadUInt32("Flags", indexes); + data.ParentRotation = packet.ReadQuaternion("ParentRotation", indexes); + data.FactionTemplate = packet.ReadInt32("FactionTemplate", indexes); + data.Level = packet.ReadInt32("Level", indexes); + data.State = packet.ReadSByte("State", indexes); + data.TypeID = packet.ReadSByte("TypeID", indexes); + data.PercentHealth = packet.ReadByte("PercentHealth", indexes); + data.ArtKit = packet.ReadUInt32("ArtKit", indexes); + data.EnableDoodadSets.Resize(packet.ReadUInt32()); + data.CustomParam = packet.ReadUInt32("CustomParam", indexes); + data.WorldEffects.Resize(packet.ReadUInt32()); + for (var i = 0; i < data.EnableDoodadSets.Count; ++i) + { + data.EnableDoodadSets[i] = packet.ReadInt32("EnableDoodadSets", indexes, i); + } + for (var i = 0; i < data.WorldEffects.Count; ++i) + { + data.WorldEffects[i] = packet.ReadInt32("WorldEffects", indexes, i); + } + bool hasAssistActionData = packet.ReadBit("HasAssistActionData", indexes); + packet.ResetBitReader(); + if (hasAssistActionData) + { + data.AssistActionData = ReadCreateGameObjectAssistActionData(packet, indexes, "AssistActionData"); + } + return data; + } + + public static IGameObjectAssistActionData ReadCreateGameObjectAssistActionData(Packet packet, params object[] indexes) + { + var data = new GameObjectAssistActionData(); + packet.ResetBitReader(); + data.PlayerName = new string('*', (int)packet.ReadBits(6)); + data.MonsterName = new string('*', (int)packet.ReadBits(11)); + data.VirtualRealmAddress = packet.ReadUInt32("VirtualRealmAddress", indexes); + data.Sex = packet.ReadByte("Sex", indexes); + data.Time = packet.ReadInt64("Time", indexes); + data.DelveTier = packet.ReadInt32("DelveTier", indexes); + data.PlayerName = packet.ReadWoWString("PlayerName", data.PlayerName.Length, indexes); + data.MonsterName = packet.ReadDynamicString("MonsterName", data.MonsterName.Length, indexes); + return data; + } + + public static IGameObjectAssistActionData ReadUpdateGameObjectAssistActionData(Packet packet, params object[] indexes) + { + var data = new GameObjectAssistActionData(); + packet.ResetBitReader(); + data.PlayerName = new string('*', (int)packet.ReadBits(6)); + data.MonsterName = new string('*', (int)packet.ReadBits(11)); + data.VirtualRealmAddress = packet.ReadUInt32("VirtualRealmAddress", indexes); + data.Sex = packet.ReadByte("Sex", indexes); + data.Time = packet.ReadInt64("Time", indexes); + data.DelveTier = packet.ReadInt32("DelveTier", indexes); + data.PlayerName = packet.ReadWoWString("PlayerName", data.PlayerName.Length, indexes); + if (data.MonsterName.Length > 1) + { + data.MonsterName = packet.ReadWoWString("MonsterName", data.MonsterName.Length - 1, indexes); + packet.ReadByte(); + } + else + data.MonsterName = string.Empty; + return data; + } + + public override IGameObjectData ReadUpdateGameObjectData(Packet packet, params object[] indexes) + { + var data = new GameObjectData(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(21); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.StateWorldEffectIDs = Enumerable.Range(0, (int)packet.ReadBits(32)).Select(x => new uint()).Cast>().ToArray(); + for (var i = 0; i < data.StateWorldEffectIDs.Length; ++i) + { + data.StateWorldEffectIDs[i] = packet.ReadUInt32("StateWorldEffectIDs", indexes, i); + } + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[2]) + { + data.EnableDoodadSets.ReadUpdateMask(packet); + } + if (changesMask[3]) + { + data.WorldEffects.ReadUpdateMask(packet); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[2]) + { + for (var i = 0; i < data.EnableDoodadSets.Count; ++i) + { + if (data.EnableDoodadSets.UpdateMask[i]) + { + data.EnableDoodadSets[i] = packet.ReadInt32("EnableDoodadSets", indexes, i); + } + } + } + if (changesMask[3]) + { + for (var i = 0; i < data.WorldEffects.Count; ++i) + { + if (data.WorldEffects.UpdateMask[i]) + { + data.WorldEffects[i] = packet.ReadInt32("WorldEffects", indexes, i); + } + } + } + if (changesMask[4]) + { + data.DisplayID = packet.ReadInt32("DisplayID", indexes); + } + if (changesMask[5]) + { + data.SpellVisualID = packet.ReadUInt32("SpellVisualID", indexes); + } + if (changesMask[6]) + { + data.StateSpellVisualID = packet.ReadUInt32("StateSpellVisualID", indexes); + } + if (changesMask[7]) + { + data.SpawnTrackingStateAnimID = packet.ReadUInt32("SpawnTrackingStateAnimID", indexes); + } + if (changesMask[8]) + { + data.SpawnTrackingStateAnimKitID = packet.ReadUInt32("SpawnTrackingStateAnimKitID", indexes); + } + if (changesMask[9]) + { + data.CreatedBy = packet.ReadPackedGuid128("CreatedBy", indexes); + } + if (changesMask[10]) + { + data.GuildGUID = packet.ReadPackedGuid128("GuildGUID", indexes); + } + if (changesMask[11]) + { + data.Flags = packet.ReadUInt32("Flags", indexes); + } + if (changesMask[12]) + { + data.ParentRotation = packet.ReadQuaternion("ParentRotation", indexes); + } + if (changesMask[13]) + { + data.FactionTemplate = packet.ReadInt32("FactionTemplate", indexes); + } + if (changesMask[14]) + { + data.Level = packet.ReadInt32("Level", indexes); + } + if (changesMask[15]) + { + data.State = packet.ReadSByte("State", indexes); + } + if (changesMask[16]) + { + data.TypeID = packet.ReadSByte("TypeID", indexes); + } + if (changesMask[17]) + { + data.PercentHealth = packet.ReadByte("PercentHealth", indexes); + } + if (changesMask[18]) + { + data.ArtKit = packet.ReadUInt32("ArtKit", indexes); + } + if (changesMask[19]) + { + data.CustomParam = packet.ReadUInt32("CustomParam", indexes); + } + bool hasAssistActionData = packet.ReadBit("HasAssistActionData", indexes); + packet.ResetBitReader(); + if (changesMask[20]) + { + if (hasAssistActionData) + { + data.AssistActionData = ReadUpdateGameObjectAssistActionData(packet, indexes, "AssistActionData"); + } + } + } + return data; + } + + public override IDynamicObjectData ReadCreateDynamicObjectData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new DynamicObjectData(); + packet.ResetBitReader(); + data.Caster = packet.ReadPackedGuid128("Caster", indexes); + data.Type = packet.ReadByte("Type", indexes); + data.SpellXSpellVisualID = packet.ReadInt32("SpellXSpellVisualID", indexes); + data.SpellID = packet.ReadInt32("SpellID", indexes); + data.Radius = packet.ReadSingle("Radius", indexes); + data.CastTime = packet.ReadUInt32("CastTime", indexes); + return data; + } + + public override IDynamicObjectData ReadUpdateDynamicObjectData(Packet packet, params object[] indexes) + { + var data = new DynamicObjectData(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(7); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.Caster = packet.ReadPackedGuid128("Caster", indexes); + } + if (changesMask[2]) + { + data.Type = packet.ReadByte("Type", indexes); + } + if (changesMask[3]) + { + data.SpellXSpellVisualID = packet.ReadInt32("SpellXSpellVisualID", indexes); + } + if (changesMask[4]) + { + data.SpellID = packet.ReadInt32("SpellID", indexes); + } + if (changesMask[5]) + { + data.Radius = packet.ReadSingle("Radius", indexes); + } + if (changesMask[6]) + { + data.CastTime = packet.ReadUInt32("CastTime", indexes); + } + } + return data; + } + + public override ICorpseData ReadCreateCorpseData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new CorpseData(); + packet.ResetBitReader(); + data.DynamicFlags = packet.ReadUInt32("DynamicFlags", indexes); + data.Owner = packet.ReadPackedGuid128("Owner", indexes); + data.PartyGUID = packet.ReadPackedGuid128("PartyGUID", indexes); + data.GuildGUID = packet.ReadPackedGuid128("GuildGUID", indexes); + data.DisplayID = packet.ReadUInt32("DisplayID", indexes); + for (var i = 0; i < 19; ++i) + { + data.Items[i] = packet.ReadUInt32("Items", indexes, i); + } + data.RaceID = packet.ReadByte("RaceID", indexes); + data.Sex = packet.ReadByte("Sex", indexes); + data.Class = packet.ReadByte("Class", indexes); + data.Customizations.Resize(packet.ReadUInt32()); + data.Flags = packet.ReadUInt32("Flags", indexes); + data.FactionTemplate = packet.ReadInt32("FactionTemplate", indexes); + for (var i = 0; i < data.Customizations.Count; ++i) + { + data.Customizations[i] = ReadCreateChrCustomizationChoice(packet, indexes, "Customizations", i); + } + return data; + } + + public override ICorpseData ReadUpdateCorpseData(Packet packet, params object[] indexes) + { + var data = new CorpseData(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + var rawMaskMask = new int[1]; + rawMaskMask[0] = (int)packet.ReadBits(1); + var maskMask = new BitArray(rawMaskMask); + if (maskMask[0]) + rawChangesMask[0] = (int)packet.ReadBits(32); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.Customizations.ReadUpdateMask(packet); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (var i = 0; i < data.Customizations.Count; ++i) + { + if (data.Customizations.UpdateMask[i]) + { + data.Customizations[i] = ReadUpdateChrCustomizationChoice(packet, indexes, "Customizations", i); + } + } + } + if (changesMask[2]) + { + data.DynamicFlags = packet.ReadUInt32("DynamicFlags", indexes); + } + if (changesMask[3]) + { + data.Owner = packet.ReadPackedGuid128("Owner", indexes); + } + if (changesMask[4]) + { + data.PartyGUID = packet.ReadPackedGuid128("PartyGUID", indexes); + } + if (changesMask[5]) + { + data.GuildGUID = packet.ReadPackedGuid128("GuildGUID", indexes); + } + if (changesMask[6]) + { + data.DisplayID = packet.ReadUInt32("DisplayID", indexes); + } + if (changesMask[7]) + { + data.RaceID = packet.ReadByte("RaceID", indexes); + } + if (changesMask[8]) + { + data.Sex = packet.ReadByte("Sex", indexes); + } + if (changesMask[9]) + { + data.Class = packet.ReadByte("Class", indexes); + } + if (changesMask[10]) + { + data.Flags = packet.ReadUInt32("Flags", indexes); + } + if (changesMask[11]) + { + data.FactionTemplate = packet.ReadInt32("FactionTemplate", indexes); + } + } + if (changesMask[12]) + { + for (var i = 0; i < 19; ++i) + { + if (changesMask[13 + i]) + { + data.Items[i] = packet.ReadUInt32("Items", indexes, i); + } + } + } + return data; + } + + public static IScaleCurve ReadCreateScaleCurve(Packet packet, params object[] indexes) + { + var data = new ScaleCurve(); + packet.ResetBitReader(); + data.StartTimeOffset = packet.ReadUInt32("StartTimeOffset", indexes); + for (var i = 0; i < 2; ++i) + { + data.Points[i] = packet.ReadVector2("Points", indexes, i); + } + data.ParameterCurve = packet.ReadUInt32("ParameterCurve", indexes); + data.OverrideActive = packet.ReadBit("OverrideActive", indexes); + return data; + } + + public static IScaleCurve ReadUpdateScaleCurve(Packet packet, params object[] indexes) + { + var data = new ScaleCurve(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(7); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.OverrideActive = packet.ReadBit("OverrideActive", indexes); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[2]) + { + data.StartTimeOffset = packet.ReadUInt32("StartTimeOffset", indexes); + } + if (changesMask[3]) + { + data.ParameterCurve = packet.ReadUInt32("ParameterCurve", indexes); + } + } + if (changesMask[4]) + { + for (var i = 0; i < 2; ++i) + { + if (changesMask[5 + i]) + { + data.Points[i] = packet.ReadVector2("Points", indexes, i); + } + } + } + return data; + } + + public static IVisualAnim ReadCreateVisualAnim(Packet packet, params object[] indexes) + { + var data = new VisualAnim(); + packet.ResetBitReader(); + data.AnimationDataID = packet.ReadUInt32("AnimationDataID", indexes); + data.AnimKitID = packet.ReadUInt32("AnimKitID", indexes); + data.AnimProgress = packet.ReadUInt32("AnimProgress", indexes); + data.IsDecay = packet.ReadBit("IsDecay", indexes); + return data; + } + + public static IVisualAnim ReadUpdateVisualAnim(Packet packet, params object[] indexes) + { + var data = new VisualAnim(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(5); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.IsDecay = packet.ReadBit("IsDecay", indexes); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[2]) + { + data.AnimationDataID = packet.ReadUInt32("AnimationDataID", indexes); + } + if (changesMask[3]) + { + data.AnimKitID = packet.ReadUInt32("AnimKitID", indexes); + } + if (changesMask[4]) + { + data.AnimProgress = packet.ReadUInt32("AnimProgress", indexes); + } + } + return data; + } + + public override IAreaTriggerData ReadCreateAreaTriggerData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new AreaTriggerData(); + packet.ResetBitReader(); + data.OverrideScaleCurve = ReadCreateScaleCurve(packet, indexes, "OverrideScaleCurve"); + data.Caster = packet.ReadPackedGuid128("Caster", indexes); + data.Duration = packet.ReadUInt32("Duration", indexes); + data.TimeToTarget = packet.ReadUInt32("TimeToTarget", indexes); + data.TimeToTargetScale = packet.ReadUInt32("TimeToTargetScale", indexes); + data.TimeToTargetExtraScale = packet.ReadUInt32("TimeToTargetExtraScale", indexes); + data.TimeToTargetPos = packet.ReadUInt32("TimeToTargetPos", indexes); + data.SpellID = packet.ReadInt32("SpellID", indexes); + data.SpellForVisuals = packet.ReadInt32("SpellForVisuals", indexes); + data.SpellXSpellVisualID = packet.ReadInt32("SpellXSpellVisualID", indexes); + data.BoundsRadius2D = packet.ReadSingle("BoundsRadius2D", indexes); + data.DecalPropertiesID = packet.ReadUInt32("DecalPropertiesID", indexes); + data.CreatingEffectGUID = packet.ReadPackedGuid128("CreatingEffectGUID", indexes); + data.OrbitPathTarget = packet.ReadPackedGuid128("OrbitPathTarget", indexes); + data.ExtraScaleCurve = ReadCreateScaleCurve(packet, indexes, "ExtraScaleCurve"); + data.OverrideMoveCurveX = ReadCreateScaleCurve(packet, indexes, "OverrideMoveCurveX"); + data.OverrideMoveCurveY = ReadCreateScaleCurve(packet, indexes, "OverrideMoveCurveY"); + data.OverrideMoveCurveZ = ReadCreateScaleCurve(packet, indexes, "OverrideMoveCurveZ"); + data.VisualAnim = ReadCreateVisualAnim(packet, indexes, "VisualAnim"); + return data; + } + + public override IAreaTriggerData ReadUpdateAreaTriggerData(Packet packet, params object[] indexes) + { + var data = new AreaTriggerData(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(20); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.OverrideScaleCurve = ReadUpdateScaleCurve(packet, indexes, "OverrideScaleCurve"); + } + if (changesMask[6]) + { + data.Caster = packet.ReadPackedGuid128("Caster", indexes); + } + if (changesMask[7]) + { + data.Duration = packet.ReadUInt32("Duration", indexes); + } + if (changesMask[8]) + { + data.TimeToTarget = packet.ReadUInt32("TimeToTarget", indexes); + } + if (changesMask[9]) + { + data.TimeToTargetScale = packet.ReadUInt32("TimeToTargetScale", indexes); + } + if (changesMask[10]) + { + data.TimeToTargetExtraScale = packet.ReadUInt32("TimeToTargetExtraScale", indexes); + } + if (changesMask[11]) + { + data.TimeToTargetPos = packet.ReadUInt32("TimeToTargetPos", indexes); + } + if (changesMask[12]) + { + data.SpellID = packet.ReadInt32("SpellID", indexes); + } + if (changesMask[13]) + { + data.SpellForVisuals = packet.ReadInt32("SpellForVisuals", indexes); + } + if (changesMask[14]) + { + data.SpellXSpellVisualID = packet.ReadInt32("SpellXSpellVisualID", indexes); + } + if (changesMask[15]) + { + data.BoundsRadius2D = packet.ReadSingle("BoundsRadius2D", indexes); + } + if (changesMask[16]) + { + data.DecalPropertiesID = packet.ReadUInt32("DecalPropertiesID", indexes); + } + if (changesMask[17]) + { + data.CreatingEffectGUID = packet.ReadPackedGuid128("CreatingEffectGUID", indexes); + } + if (changesMask[18]) + { + data.OrbitPathTarget = packet.ReadPackedGuid128("OrbitPathTarget", indexes); + } + if (changesMask[2]) + { + data.ExtraScaleCurve = ReadUpdateScaleCurve(packet, indexes, "ExtraScaleCurve"); + } + if (changesMask[3]) + { + data.OverrideMoveCurveX = ReadUpdateScaleCurve(packet, indexes, "OverrideMoveCurveX"); + } + if (changesMask[4]) + { + data.OverrideMoveCurveY = ReadUpdateScaleCurve(packet, indexes, "OverrideMoveCurveY"); + } + if (changesMask[5]) + { + data.OverrideMoveCurveZ = ReadUpdateScaleCurve(packet, indexes, "OverrideMoveCurveZ"); + } + if (changesMask[19]) + { + data.VisualAnim = ReadUpdateVisualAnim(packet, indexes, "VisualAnim"); + } + } + return data; + } + + public override ISceneObjectData ReadCreateSceneObjectData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new SceneObjectData(); + packet.ResetBitReader(); + data.ScriptPackageID = packet.ReadInt32("ScriptPackageID", indexes); + data.RndSeedVal = packet.ReadUInt32("RndSeedVal", indexes); + data.CreatedBy = packet.ReadPackedGuid128("CreatedBy", indexes); + data.SceneType = packet.ReadUInt32("SceneType", indexes); + return data; + } + + public override ISceneObjectData ReadUpdateSceneObjectData(Packet packet, params object[] indexes) + { + var data = new SceneObjectData(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(5); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.ScriptPackageID = packet.ReadInt32("ScriptPackageID", indexes); + } + if (changesMask[2]) + { + data.RndSeedVal = packet.ReadUInt32("RndSeedVal", indexes); + } + if (changesMask[3]) + { + data.CreatedBy = packet.ReadPackedGuid128("CreatedBy", indexes); + } + if (changesMask[4]) + { + data.SceneType = packet.ReadUInt32("SceneType", indexes); + } + } + return data; + } + + public static IConversationLine ReadCreateConversationLine(Packet packet, params object[] indexes) + { + var data = new ConversationLine(); + packet.ResetBitReader(); + data.ConversationLineID = packet.ReadInt32("ConversationLineID", indexes); + data.BroadcastTextID = packet.ReadInt32("BroadcastTextID", indexes); + data.StartTime = packet.ReadUInt32("StartTime", indexes); + data.UiCameraID = packet.ReadInt32("UiCameraID", indexes); + data.ActorIndex = packet.ReadByte("ActorIndex", indexes); + data.Flags = packet.ReadByte("Flags", indexes); + return data; + } + + public static IConversationLine ReadUpdateConversationLine(Packet packet, params object[] indexes) + { + var data = new ConversationLine(); + packet.ResetBitReader(); + data.ConversationLineID = packet.ReadInt32("ConversationLineID", indexes); + data.BroadcastTextID = packet.ReadInt32("BroadcastTextID", indexes); + data.StartTime = packet.ReadUInt32("StartTime", indexes); + data.UiCameraID = packet.ReadInt32("UiCameraID", indexes); + data.ActorIndex = packet.ReadByte("ActorIndex", indexes); + data.Flags = packet.ReadByte("Flags", indexes); + return data; + } + + public static IConversationActor ReadCreateConversationActor(Packet packet, params object[] indexes) + { + var data = new ConversationActor(); + packet.ResetBitReader(); + data.Type = packet.ReadBits("Type", 1, indexes); + data.Id = packet.ReadInt32("Id", indexes); + if (data.Type == 1) + { + data.CreatureID = packet.ReadUInt32("CreatureID", indexes); + data.CreatureDisplayInfoID = packet.ReadUInt32("CreatureDisplayInfoID", indexes); + } + if (data.Type == 0) + { + data.ActorGUID = packet.ReadPackedGuid128("ActorGUID", indexes); + } + return data; + } + + public static IConversationActor ReadUpdateConversationActor(Packet packet, params object[] indexes) + { + var data = new ConversationActor(); + packet.ResetBitReader(); + data.Type = packet.ReadBits("Type", 1, indexes); + data.Id = packet.ReadInt32("Id", indexes); + if (data.Type == 1) + { + data.CreatureID = packet.ReadUInt32("CreatureID", indexes); + data.CreatureDisplayInfoID = packet.ReadUInt32("CreatureDisplayInfoID", indexes); + } + if (data.Type == 0) + { + data.ActorGUID = packet.ReadPackedGuid128("ActorGUID", indexes); + } + return data; + } + + public override IConversationData ReadCreateConversationData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new ConversationData(); + packet.ResetBitReader(); + data.Lines = new IConversationLine[packet.ReadUInt32()]; + data.LastLineEndTime = packet.ReadInt32("LastLineEndTime", indexes); + for (var i = 0; i < data.Lines.Length; ++i) + { + data.Lines[i] = ReadCreateConversationLine(packet, indexes, "Lines", i); + } + data.Actors.Resize(packet.ReadUInt32()); + for (var i = 0; i < data.Actors.Count; ++i) + { + data.Actors[i] = ReadCreateConversationActor(packet, indexes, "Actors", i); + } + return data; + } + + public override IConversationData ReadUpdateConversationData(Packet packet, params object[] indexes) + { + var data = new ConversationData(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(4); + var changesMask = new BitArray(rawChangesMask); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.Lines = Enumerable.Range(0, (int)packet.ReadBits(32)).Select(x => new ConversationLine()).Cast().ToArray(); + for (var i = 0; i < data.Lines.Length; ++i) + { + data.Lines[i] = ReadUpdateConversationLine(packet, indexes, "Lines", i); + } + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[2]) + { + data.Actors.ReadUpdateMask(packet); + } + } + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[2]) + { + for (var i = 0; i < data.Actors.Count; ++i) + { + if (data.Actors.UpdateMask[i]) + { + data.Actors[i] = ReadUpdateConversationActor(packet, indexes, "Actors", i); + } + } + } + if (changesMask[3]) + { + data.LastLineEndTime = packet.ReadInt32("LastLineEndTime", indexes); + } + } + return data; + } + + public override IVendorData ReadCreateVendorData(Packet packet, UpdateFieldFlag flags, params object[] indexes) + { + var data = new VendorData(); + packet.ResetBitReader(); + data.Flags = packet.ReadInt32("Flags", indexes); + return data; + } + + public override IVendorData ReadUpdateVendorData(Packet packet, params object[] indexes) + { + var data = new VendorData(); + packet.ResetBitReader(); + var rawChangesMask = new int[1]; + rawChangesMask[0] = (int)packet.ReadBits(2); + var changesMask = new BitArray(rawChangesMask); + + packet.ResetBitReader(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.Flags = packet.ReadInt32("Flags", indexes); + } + } + return data; + } + + } +} diff --git a/WowPacketParserModule.V5_5_0_61735/Parsers/UpdateHandler255.cs b/WowPacketParserModule.V5_5_0_61735/Parsers/UpdateHandler255.cs new file mode 100644 index 0000000000..549c67a741 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/Parsers/UpdateHandler255.cs @@ -0,0 +1,1104 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using WowPacketParser.Enums; +using WowPacketParser.Misc; +using WowPacketParser.PacketStructures; +using WowPacketParser.Parsing; +using WowPacketParser.Proto; +using WowPacketParser.Store; +using WowPacketParser.Store.Objects; +using WowPacketParser.Store.Objects.UpdateFields; +using WowPacketParserModule.V6_0_2_19033.Enums; +using CoreFields = WowPacketParser.Enums.Version; +using CoreParsers = WowPacketParser.Parsing.Parsers; +using MovementFlag = WowPacketParser.Enums.v4.MovementFlag; +using MovementFlag2 = WowPacketParser.Enums.v7.MovementFlag2; +using SplineFlag = WowPacketParserModule.V6_0_2_19033.Enums.SplineFlag; + +namespace WowPacketParserModule.V5_5_0_61735.Parsers +{ + public static class UpdateHandler255 + { + [Parser(Opcode.SMSG_MAP_OBJ_EVENTS, ClientBranch.TBC)] + public static void HandleMapObjEvents(Packet packet) + { + packet.ReadInt32("UniqueID"); + packet.ReadInt32("DataSize"); + + var count = packet.ReadByte("Unk1"); + for (var i = 0; i < count; i++) + { + var byte20 = packet.ReadByte("Unk2", i); + packet.ReadInt32(byte20 == 1 ? "Unk3" : "Unk4", i); + } + } + + [Parser(Opcode.SMSG_DESTROY_ARENA_UNIT, ClientBranch.TBC)] + public static void HandleDestroyArenaUnit(Packet packet) + { + packet.ReadPackedGuid128("Guid"); + } + + [HasSniffData] // in ReadCreateObjectBlock + [Parser(Opcode.SMSG_UPDATE_OBJECT, ClientBranch.TBC)] + public static void HandleUpdateObject(Packet packet) + { + var updateObject = packet.Holder.UpdateObject = new(); + uint map = updateObject.MapId = packet.ReadUInt16("MapID"); + var count = packet.ReadUInt32("NumObjUpdates"); + packet.ResetBitReader(); + packet.ReadBit("Unknown_11_0_5"); + var hasRemovedObjects = packet.ReadBit("HasRemovedObjects"); + if (hasRemovedObjects) + { + var destroyedObjCount = packet.ReadInt16("DestroyedObjCount"); + var removedObjCount = packet.ReadUInt32("RemovedObjCount"); // destroyed + out of range + var outOfRangeObjCount = removedObjCount - destroyedObjCount; + + for (var i = 0; i < destroyedObjCount; i++) + { + var partWriter = new StringBuilderProtoPart(packet.Writer); + var guid = packet.ReadPackedGuid128("ObjectGUID", "Destroyed", i); + updateObject.Destroyed.Add(new DestroyedObject() { Guid = guid, TextStartOffset = partWriter.StartOffset, TextLength = partWriter.Length, Text = partWriter.Text }); + } + + for (var i = 0; i < outOfRangeObjCount; i++) + { + var partWriter = new StringBuilderProtoPart(packet.Writer); + var guid = packet.ReadPackedGuid128("ObjectGUID", "OutOfRange", i); + updateObject.OutOfRange.Add(new DestroyedObject() { Guid = guid, TextStartOffset = partWriter.StartOffset, TextLength = partWriter.Length, Text = partWriter.Text }); + } + } + packet.ReadUInt32("Data size"); + + for (var i = 0; i < count; i++) + { + var type = (UpdateTypeCataclysm)packet.ReadByte(); + + var partWriter = new StringBuilderProtoPart(packet.Writer); + packet.AddValue("UpdateType", type.ToString(), i); + var guid = packet.ReadPackedGuid128("Object Guid", i); + switch (type) + { + case UpdateTypeCataclysm.Values: + { + var updateValues = new UpdateValues(); + var updatefieldSize = packet.ReadUInt32(); + var handler = CoreFields.UpdateFields.GetHandler(); + updateValues.Fields = new(); + using (var fieldsData = new Packet(packet.ReadBytes((int)updatefieldSize), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName)) + { + WoWObject obj; + Storage.Objects.TryGetValue(guid, out obj); + + var fragments = obj?.EntityFragments ?? [new WowCSEntityFragment(WowCSEntityFragments1100.CGObject)]; + + fieldsData.ReadBool("IsOwned", i); + if (fieldsData.ReadBool("HasFragmentUpdates", i)) + { + switch (fieldsData.ReadByte("ArchetypeSerializationType", i)) + { + case 0: + fragments = ReadEntityFragments(fieldsData, "NewEntityFragmentID", i); + if (obj != null) + obj.EntityFragments = fragments; + break; + case 1: + fragments.AddRange(ReadEntityFragments(fieldsData, "NewEntityFragmentID", i)); + foreach (var removedFragment in ReadEntityFragments(fieldsData, "RemovedEntityFragmentID", i)) + fragments.RemoveAll(f => f.UniversalValue == removedFragment.UniversalValue); + fragments.Sort(); + break; + } + } + + ReadUpdateEntityFragmentData(obj, fragments, updateValues, handler, fieldsData, i); + + if (fieldsData.Position != fieldsData.Length) + packet.WriteLine($"Updatefields not fully read! Current position: {fieldsData.Position} Length: {fieldsData.Length} Bytes remaining: {fieldsData.Length - fieldsData.Position}"); + } + updateObject.Updated.Add(new UpdateObject { Guid = guid, Values = updateValues, TextStartOffset = partWriter.StartOffset, TextLength = partWriter.Length, Text = partWriter.Text }); + break; + } + case UpdateTypeCataclysm.CreateObject1: + case UpdateTypeCataclysm.CreateObject2: + { + var createType = type.ToCreateObjectType(); + var createObject = new CreateObject() { Guid = guid, Values = new() { }, CreateType = createType }; + ReadCreateObjectBlock(packet, createObject, guid, map, createType, i); + createObject.Text = partWriter.Text; + createObject.TextStartOffset = partWriter.StartOffset; + createObject.TextLength = partWriter.Length; + updateObject.Created.Add(createObject); + break; + } + } + } + } + + private static WowCSEntityFragment TransformFragment1127(Packet packet, string name, byte fragmentId, int idx, int fragmentIdx) => + new(packet.AddValue(name, (WowCSEntityFragments1127)fragmentId, idx, fragmentIdx)); + + private static List ReadEntityFragments(Packet packet, string name, int idx) + { + Func fragmentTransformer; + fragmentTransformer = TransformFragment1127; + + var fragmentIds = new List(); + byte fragmentId; + while ((fragmentId = packet.ReadByte()) != 255) + fragmentIds.Add(fragmentTransformer(packet, name, fragmentId, idx, fragmentIds.Count)); + + return fragmentIds; + } + + private static void ReadCreateEntityFragmentData(WoWObject obj, CreateObject createObject, CoreParsers.UpdateFieldsHandlerBase handler, Packet fieldsData, UpdateFieldFlag flags, int index) + { + foreach (var fragment in obj.EntityFragments) + { + if (WowCSUtilities.IsIndirect(fragment.UniversalValue) && !fieldsData.ReadBool("IndirectFragmentActive [" + fragment.UniversalValue + "]", index)) + continue; + + switch (fragment.UniversalValue) + { + case WowCSEntityFragments.CGObject: + obj.ObjectData = handler.ReadCreateObjectData(fieldsData, flags, index); + createObject.Values.Fields.UpdateData(obj.ObjectData); + switch (obj.Type) + { + case ObjectType.Item: + handler.ReadCreateItemData(fieldsData, flags, index); + break; + case ObjectType.Container: + handler.ReadCreateItemData(fieldsData, flags, index); + handler.ReadCreateContainerData(fieldsData, flags, index); + break; + //case ObjectType.AzeriteEmpoweredItem: + // handler.ReadCreateItemData(fieldsData, flags, index); + // handler.ReadCreateAzeriteEmpoweredItemData(fieldsData, flags, index); + // break; + //case ObjectType.AzeriteItem: + // handler.ReadCreateItemData(fieldsData, flags, index); + // handler.ReadCreateAzeriteItemData(fieldsData, flags, index); + // break; + case ObjectType.Unit: + { + var data = (obj as Unit).UnitData = handler.ReadCreateUnitData(fieldsData, flags, index); + createObject.Values.Fields.UpdateData(data); + break; + } + case ObjectType.Player: + handler.ReadCreateUnitData(fieldsData, flags, index); + handler.ReadCreatePlayerData(fieldsData, flags, index); + break; + case ObjectType.ActivePlayer: + handler.ReadCreateUnitData(fieldsData, flags, index); + handler.ReadCreatePlayerData(fieldsData, flags, index); + handler.ReadCreateActivePlayerData(fieldsData, flags, index); + break; + case ObjectType.GameObject: + { + var data = (obj as GameObject).GameObjectData = handler.ReadCreateGameObjectData(fieldsData, flags, index); + createObject.Values.Fields.UpdateData(data); + break; + } + case ObjectType.DynamicObject: + handler.ReadCreateDynamicObjectData(fieldsData, flags, index); + break; + case ObjectType.Corpse: + handler.ReadCreateCorpseData(fieldsData, flags, index); + break; + //case ObjectType.AreaTrigger: + // (obj as AreaTriggerCreateProperties).AreaTriggerData = handler.ReadCreateAreaTriggerData(fieldsData, flags, index); + // break; + //case ObjectType.SceneObject: + // (obj as SceneObject).SceneObjectData = handler.ReadCreateSceneObjectData(fieldsData, flags, index); + // break; + case ObjectType.Conversation: + (obj as ConversationTemplate).ConversationData = handler.ReadCreateConversationData(fieldsData, flags, index); + break; + } + break; + case WowCSEntityFragments.FVendor_C: handler.ReadCreateVendorData(fieldsData, flags, index); break; + case WowCSEntityFragments.FMeshObjectData_C: handler.ReadCreateMeshObjectData(fieldsData, flags, index); break; + case WowCSEntityFragments.FHousingDecor_C: handler.ReadCreateHousingDecorData(fieldsData, flags, index); break; + case WowCSEntityFragments.FHousingRoom_C: handler.ReadCreateHousingRoomData(fieldsData, flags, index); break; + case WowCSEntityFragments.FHousingRoomComponentMesh_C: handler.ReadCreateHousingRoomComponentMeshData(fieldsData, flags, index); break; + case WowCSEntityFragments.FHousingPlayerHouse_C: handler.ReadCreateHousingPlayerHouseData(fieldsData, flags, index); break; + case WowCSEntityFragments.FJamHousingCornerstone_C: handler.ReadCreateHousingCornerstoneData(fieldsData, flags, index); break; + case WowCSEntityFragments.FHousingPlotAreaTrigger_C: handler.ReadCreateHousingPlotAreaTriggerData(fieldsData, flags, index); break; + case WowCSEntityFragments.FNeighborhoodMirrorData_C: handler.ReadCreateNeighborhoodMirrorData(fieldsData, flags, index); break; + case WowCSEntityFragments.FMirroredPositionData_C: handler.ReadCreateMirroredPositionData(fieldsData, flags, index); break; + case WowCSEntityFragments.PlayerHouseInfoComponent_C: handler.ReadCreatePlayerHouseInfoComponentData(fieldsData, flags, index); break; + case WowCSEntityFragments.FHousingStorage_C: handler.ReadCreateHousingStorageData(fieldsData, flags, index); break; + case WowCSEntityFragments.FHousingFixture_C: handler.ReadCreateHousingFixtureData(fieldsData, flags, index); break; + } + } + } + + private static void ReadCreateObjectBlock(Packet packet, CreateObject createObject, WowGuid guid, uint map, CreateObjectType createType, int index) + { + ObjectType objType = ObjectTypeConverter.Convert(packet.ReadByteE("Object Type", index)); + + WoWObject obj = CoreParsers.UpdateHandler.CreateObject(objType, guid, map); + + obj.CreateType = createType; + obj.Movement = ReadMovementUpdateBlock(packet, createObject, guid, obj, index); + + createObject.Values.Fields = new(); + var updatefieldSize = packet.ReadUInt32(); + using (var fieldsData = new Packet(packet.ReadBytes((int)updatefieldSize), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName)) + { + var flags = fieldsData.ReadByteE("FieldFlags", index); + obj.EntityFragments = ReadEntityFragments(fieldsData, "EntityFragmentID", index); + var handler = CoreFields.UpdateFields.GetHandler(); + + ReadCreateEntityFragmentData(obj, createObject, handler, fieldsData, flags, index); + + if (fieldsData.Position != fieldsData.Length) + packet.WriteLine($"Updatefields not fully read! Current position: {fieldsData.Position} Length: {fieldsData.Length} Bytes remaining: {fieldsData.Length - fieldsData.Position}"); + } + + if (ClientVersion.AddedInVersion(ClientVersionBuild.V2_5_5_64796) && obj is AreaTriggerCreateProperties createProperties) + { + AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate + { + Id = guid.GetEntry(), + IsCustom = 0 + }; + + createProperties.AreaTriggerId = guid.GetEntry(); + createProperties.IsAreatriggerCustom = areaTriggerTemplate.IsCustom; + createProperties.Flags = 0; + + if ((createProperties.AreaTriggerData.Flags & 0x0008) != 0) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasAbsoluteOrientation; + + if ((createProperties.AreaTriggerData.Flags & 0x0010) != 0) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasDynamicShape; + + if ((createProperties.AreaTriggerData.Flags & 0x0020) != 0) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasAttached; + + if ((createProperties.AreaTriggerData.Flags & 0x0040) != 0) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.FaceMovementDirection; + + if ((createProperties.AreaTriggerData.Flags & 0x0080) != 0) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.FollowsTerrain; + + if ((createProperties.AreaTriggerData.Flags & 0x0200) != 0) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.Unk1; + + if (createProperties.AreaTriggerData.Polygon != null) + { + var verticesList = new List(createProperties.AreaTriggerData.Polygon.Vertices.Count); + + for (var i = 0; i < createProperties.AreaTriggerData.Polygon.Vertices.Count; ++i) + { + var vertex = createProperties.AreaTriggerData.Polygon.Vertices[i]; + if (!vertex.HasValue) + continue; + + verticesList.Add(new AreaTriggerCreatePropertiesPolygonVertex + { + areatriggerGuid = guid, + Idx = (uint)i, + VerticeX = vertex.Value.X, + VerticeY = vertex.Value.Y + }); + } + + for (var i = 0; i < createProperties.AreaTriggerData.Polygon.VerticesTarget.Count; ++i) + { + var vertexTarget = createProperties.AreaTriggerData.Polygon.VerticesTarget[i]; + if (!vertexTarget.HasValue) + continue; + + verticesList[i].VerticeTargetX = vertexTarget.Value.X; + verticesList[i].VerticeTargetY = vertexTarget.Value.Y; + } + + foreach (var vertice in verticesList) + Storage.AreaTriggerCreatePropertiesPolygonVertices.Add(vertice); + } + + if (createProperties.AreaTriggerData.Spline != null) + AreaTriggerHandler.ProcessAreaTriggerSpline(createProperties, createProperties.AreaTriggerData, packet, index); + else if (createProperties.AreaTriggerData.Orbit != null) + AreaTriggerHandler.ProcessAreaTriggerOrbit(createProperties, createProperties.AreaTriggerData, packet, index); + + Storage.AreaTriggerTemplates.Add(areaTriggerTemplate); + } + + // If this is the second time we see the same object (same guid, + // same position) update its phasemask + if (Storage.Objects.ContainsKey(guid)) + { + var existObj = Storage.Objects[guid].Item1; + CoreParsers.UpdateHandler.ProcessExistingObject(ref existObj, obj, guid); // can't do "ref Storage.Objects[guid].Item1 directly + } + else + Storage.Objects.Add(guid, obj, packet.TimeSpan); + + if (guid.HasEntry() && (objType == ObjectType.Unit || objType == ObjectType.GameObject)) + packet.AddSniffData(Utilities.ObjectTypeToStore(objType), (int)guid.GetEntry(), "SPAWN"); + } + + private static void ReadUpdateEntityFragmentData(WoWObject obj, List fragments, UpdateValues updateValues, CoreParsers.UpdateFieldsHandlerBase handler, Packet fieldsData, int index) + { + var fragmentBitCount = 0; + foreach (var existingFragment in fragments) + { + if (!WowCSUtilities.IsUpdateable(existingFragment.UniversalValue)) + continue; + + ++fragmentBitCount; + if (WowCSUtilities.IsIndirect(existingFragment.UniversalValue)) + ++fragmentBitCount; + } + + var changedFragments = new BitArray(fieldsData.ReadBytes((fragmentBitCount + 7) / 8)); + + foreach (var existingFragment in fragments) + { + if (!WowCSUtilities.IsUpdateable(existingFragment.UniversalValue)) + continue; + + var fragmentBitIndex = WowCSUtilities.GetUpdateBitIndex(fragments, existingFragment.UniversalValue); + if (fragmentBitIndex < 0 || !changedFragments[fragmentBitIndex]) + continue; + + if (WowCSUtilities.IsIndirect(existingFragment.UniversalValue) && !changedFragments[fragmentBitIndex + 1]) + continue; + + switch (existingFragment.UniversalValue) + { + case WowCSEntityFragments.CGObject: + { + var updateTypeFlag = fieldsData.ReadUInt32(); + if ((updateTypeFlag & 0x0001) != 0) + { + var data = handler.ReadUpdateObjectData(fieldsData, index); + if (obj is { ObjectData: IMutableObjectData mut }) + mut.UpdateData(data); + else if (obj != null) + obj.ObjectData = data; + + updateValues.Fields.UpdateData(data); + } + if ((updateTypeFlag & 0x0002) != 0) + handler.ReadUpdateItemData(fieldsData, index); + if ((updateTypeFlag & 0x0004) != 0) + handler.ReadUpdateContainerData(fieldsData, index); + //if ((updateTypeFlag & 0x0008) != 0) + // handler.ReadUpdateAzeriteEmpoweredItemData(fieldsData, index); + //if ((updateTypeFlag & 0x0010) != 0) + // handler.ReadUpdateAzeriteItemData(fieldsData, index); + if ((updateTypeFlag & 0x0020) != 0) + { + var unit = obj as Unit; + var data = handler.ReadUpdateUnitData(fieldsData, index); + if (unit is { UnitData: IMutableUnitData mut }) + mut.UpdateData(data); + else if (unit != null) + unit.UnitData = data; + + updateValues.Fields.UpdateData(data); + } + if ((updateTypeFlag & 0x0040) != 0) + handler.ReadUpdatePlayerData(fieldsData, index); + //if ((updateTypeFlag & 0x0080) != 0) + // handler.ReadUpdateActivePlayerData(fieldsData, index); + if ((updateTypeFlag & 0x0100) != 0) + { + var go = obj as GameObject; + var data = handler.ReadUpdateGameObjectData(fieldsData, index); + if (go is { GameObjectData: IMutableGameObjectData mut }) + mut.UpdateData(data); + else if (go != null) + go.GameObjectData = data; + + updateValues.Fields.UpdateData(data); + } + if ((updateTypeFlag & 0x0200) != 0) + handler.ReadUpdateDynamicObjectData(fieldsData, index); + if ((updateTypeFlag & 0x0400) != 0) + handler.ReadUpdateCorpseData(fieldsData, index); + //if ((updateTypeFlag & 0x0800) != 0) + //{ + // var at = obj as AreaTriggerCreateProperties; + // var data = handler.ReadUpdateAreaTriggerData(fieldsData, index); + + // if (data.Spline != null) + // AreaTriggerHandler.ProcessAreaTriggerSpline(at, data, fieldsData, index); + // else if (data.Orbit != null) + // AreaTriggerHandler.ProcessAreaTriggerOrbit(at, data, fieldsData, index); + //} + //if ((updateTypeFlag & 0x1000) != 0) + // handler.ReadUpdateSceneObjectData(fieldsData, index); + //if ((updateTypeFlag & 0x2000) != 0) + //{ + // var conversation = obj as ConversationTemplate; + // var data = handler.ReadUpdateConversationData(fieldsData, index); + // if (conversation is { ConversationData: IMutableConversationData mut }) + // mut.UpdateData(data); + // else if (conversation != null) + // conversation.ConversationData = data; + //} + break; + } + case WowCSEntityFragments.FVendor_C: handler.ReadUpdateVendorData(fieldsData, index); break; + case WowCSEntityFragments.FMeshObjectData_C: handler.ReadUpdateMeshObjectData(fieldsData, index); break; + case WowCSEntityFragments.FHousingDecor_C: handler.ReadUpdateHousingDecorData(fieldsData, index); break; + case WowCSEntityFragments.FHousingRoom_C: handler.ReadUpdateHousingRoomData(fieldsData, index); break; + case WowCSEntityFragments.FHousingRoomComponentMesh_C: handler.ReadUpdateHousingRoomComponentMeshData(fieldsData, index); break; + case WowCSEntityFragments.FHousingPlayerHouse_C: handler.ReadUpdateHousingPlayerHouseData(fieldsData, index); break; + case WowCSEntityFragments.FJamHousingCornerstone_C: handler.ReadUpdateHousingCornerstoneData(fieldsData, index); break; + case WowCSEntityFragments.FHousingPlotAreaTrigger_C: handler.ReadUpdateHousingPlotAreaTriggerData(fieldsData, index); break; + case WowCSEntityFragments.FNeighborhoodMirrorData_C: handler.ReadUpdateNeighborhoodMirrorData(fieldsData, index); break; + case WowCSEntityFragments.FMirroredPositionData_C: handler.ReadUpdateMirroredPositionData(fieldsData, index); break; + case WowCSEntityFragments.PlayerHouseInfoComponent_C: handler.ReadUpdatePlayerHouseInfoComponentData(fieldsData, index); break; + case WowCSEntityFragments.FHousingStorage_C: handler.ReadUpdateHousingStorageData(fieldsData, index); break; + case WowCSEntityFragments.FHousingFixture_C: handler.ReadUpdateHousingFixtureData(fieldsData, index); break; + } + } + } + + public static MovementUpdateTransport ReadTransportData(MovementInfo moveInfo, WowGuid guid, Packet packet, object index) + { + moveInfo.Transport = new MovementInfo.TransportInfo(); + MovementUpdateTransport transport = new(); + packet.ResetBitReader(); + transport.TransportGuid = moveInfo.Transport.Guid = packet.ReadPackedGuid128("TransportGUID", index); + transport.Position = moveInfo.Transport.Offset = packet.ReadVector4("TransportPosition", index); + var seat = packet.ReadByte("VehicleSeatIndex", index); + transport.Seat = seat; + transport.MoveTime = packet.ReadUInt32("MoveTime", index); + + var hasPrevMoveTime = packet.ReadBit("HasPrevMoveTime", index); + var hasVehicleRecID = packet.ReadBit("HasVehicleRecID", index); + + if (hasPrevMoveTime) + transport.PrevMoveTime = packet.ReadUInt32("PrevMoveTime", index); + + if (hasVehicleRecID) + transport.VehicleId = packet.ReadInt32("VehicleRecID", index); + + if (moveInfo.Transport.Guid.HasEntry() && moveInfo.Transport.Guid.GetHighType() == HighGuidType.Vehicle && + guid.HasEntry() && guid.GetHighType() == HighGuidType.Creature) + { + VehicleTemplateAccessory vehicleAccessory = new VehicleTemplateAccessory + { + Entry = moveInfo.Transport.Guid.GetEntry(), + AccessoryEntry = guid.GetEntry(), + SeatId = seat + }; + Storage.VehicleTemplateAccessories.Add(vehicleAccessory, packet.TimeSpan); + } + + return transport; + } + + private static MovementInfo ReadMovementUpdateBlock(Packet packet, CreateObject createObject, WowGuid guid, WoWObject obj, object index) + { + var moveInfo = new MovementInfo(); + + packet.ResetBitReader(); + + packet.ReadBit("HasPositionFragment", index); + packet.ReadBit("NoBirthAnim", index); + packet.ReadBit("EnablePortals", index); + packet.ReadBit("PlayHoverAnim", index); + packet.ReadBit("ThisIsYou", index); + + var hasMovementUpdate = packet.ReadBit("HasMovementUpdate", index); + var hasMovementTransport = packet.ReadBit("HasMovementTransport", index); + var hasStationaryPosition = packet.ReadBit("Stationary", index); + var hasCombatVictim = packet.ReadBit("HasCombatVictim", index); + + var hasServerTime = packet.ReadBit("HasServerTime", index); + var hasVehicleCreate = packet.ReadBit("HasVehicleCreate", index); + var hasAnimKitCreate = packet.ReadBit("HasAnimKitCreate", index); + var hasRotation = packet.ReadBit("HasRotation", index); + var hasAreaTrigger = packet.ReadBit("HasAreaTrigger", index); + var hasGameObject = packet.ReadBit("HasGameObject", index); + var hasSmoothPhasing = packet.ReadBit("HasSmoothPhasing", index); + + var sceneObjCreate = packet.ReadBit("SceneObjCreate", index); + var playerCreateData = packet.ReadBit("HasPlayerCreateData", index); + var hasConversation = packet.ReadBit("HasConversation", index); + + if (hasMovementUpdate) + { + var movementUpdate = createObject.Movement = new(); + packet.ResetBitReader(); + movementUpdate.Mover = packet.ReadPackedGuid128("MoverGUID", index); + + moveInfo.Flags = (uint)packet.ReadUInt32E("MovementFlags", index); + moveInfo.Flags2 = (uint)packet.ReadUInt32E("MovementFlags2", index); + moveInfo.Flags3 = (uint)packet.ReadUInt32E("MovementFlags3", index); + + movementUpdate.MoveTime = packet.ReadUInt32("MoveTime", index); + movementUpdate.Position = moveInfo.Position = packet.ReadVector3("Position", index); + movementUpdate.Orientation = moveInfo.Orientation = packet.ReadSingle("Orientation", index); + + movementUpdate.Pitch = packet.ReadSingle("Pitch", index); + movementUpdate.StepUpStartElevation = packet.ReadSingle("StepUpStartElevation", index); + + var removeForcesIDsCount = packet.ReadInt32(); + movementUpdate.MoveIndex = packet.ReadInt32("MoveIndex", index); + + for (var i = 0; i < removeForcesIDsCount; i++) + packet.ReadPackedGuid128("RemoveForcesIDs", index, i); + + var hasStandingOnGameObjectGUID = packet.ReadBit("HasStandingOnGameObjectGUID", index); + var hasTransport = packet.ReadBit("Has Transport Data", index); + var hasFall = packet.ReadBit("Has Fall Data", index); + packet.ReadBit("HasSpline", index); + packet.ReadBit("HeightChangeFailed", index); + packet.ReadBit("RemoteTimeValid", index); + var hasInertia = packet.ReadBit("HasInertia", index); + var hasAdvFlying = packet.ReadBit("HasAdvFlying", index); + var hasDriveStatus = packet.ReadBit("HasDriveStatus", index); + + if (hasTransport) + movementUpdate.Transport = ReadTransportData(moveInfo, guid, packet, index); + + if (hasStandingOnGameObjectGUID) + packet.ReadPackedGuid128("StandingOnGameObjectGUID", index); + + if (hasInertia) + { + packet.ReadInt32("ID", "Inertia"); + packet.ReadVector3("Force", index, "Inertia"); + packet.ReadUInt32("Lifetime", index, "Inertia"); + } + + if (hasAdvFlying) + { + packet.ReadSingle("ForwardVelocity", index, "AdvFlying"); + packet.ReadSingle("UpVelocity", index, "AdvFlying"); + } + + if (hasFall) + { + packet.ResetBitReader(); + movementUpdate.FallTime = packet.ReadUInt32("Fall Time", index); + movementUpdate.JumpVelocity = packet.ReadSingle("JumpVelocity", index); + + var hasFallDirection = packet.ReadBit("Has Fall Direction", index); + if (hasFallDirection) + { + packet.ReadVector2("Fall", index); + packet.ReadSingle("Horizontal Speed", index); + } + } + + if (hasDriveStatus) + { + packet.ResetBitReader(); + packet.ReadSingle("Speed", index, "DriveStatus"); + packet.ReadSingle("MovementAngle", index, "DriveStatus"); + packet.ReadBit("Accelerating", index, "DriveStatus"); + packet.ReadBit("Drifting", index, "DriveStatus"); + } + + movementUpdate.WalkSpeed = moveInfo.WalkSpeed = packet.ReadSingle("WalkSpeed", index) / 2.5f; + movementUpdate.RunSpeed = moveInfo.RunSpeed = packet.ReadSingle("RunSpeed", index) / 7.0f; + packet.ReadSingle("RunBackSpeed", index); + packet.ReadSingle("SwimSpeed", index); + packet.ReadSingle("SwimBackSpeed", index); + packet.ReadSingle("FlightSpeed", index); + packet.ReadSingle("FlightBackSpeed", index); + packet.ReadSingle("TurnRate", index); + packet.ReadSingle("PitchRate", index); + + var movementForceCount = packet.ReadUInt32("MovementForceCount", index); + packet.ReadSingle("MovementForcesModMagnitude", index); + + packet.ReadSingle("AdvFlyingAirFriction", index); + packet.ReadSingle("AdvFlyingMaxVel", index); + packet.ReadSingle("AdvFlyingLiftCoefficient", index); + packet.ReadSingle("AdvFlyingDoubleJumpVelMod", index); + packet.ReadSingle("AdvFlyingGlideStartMinHeight", index); + packet.ReadSingle("AdvFlyingAddImpulseMaxSpeed", index); + packet.ReadSingle("AdvFlyingMinBankingRate", index); + packet.ReadSingle("AdvFlyingMaxBankingRate", index); + packet.ReadSingle("AdvFlyingMinPitchingRateDown", index); + packet.ReadSingle("AdvFlyingMaxPitchingRateDown", index); + packet.ReadSingle("AdvFlyingMinPitchingRateUp", index); + packet.ReadSingle("AdvFlyingMaxPitchingRateUp", index); + packet.ReadSingle("AdvFlyingMinTurnVelocityThreshold", index); + packet.ReadSingle("AdvFlyingMaxTurnVelocityThreshold", index); + packet.ReadSingle("AdvFlyingSurfaceFriction", index); + packet.ReadSingle("AdvFlyingOverMaxDeceleration", index); + packet.ReadSingle("AdvFlyingLaunchSpeedCoefficient", index); + + packet.ResetBitReader(); + moveInfo.HasSplineData = packet.ReadBit("HasMovementSpline", index); + + for (var i = 0; i < movementForceCount; ++i) + MovementHandler1158.ReadMovementForce(packet, "MovementForces", i); + + if (moveInfo.HasSplineData) + { + var splineData = movementUpdate.SplineData = new(); + packet.ResetBitReader(); + splineData.Id = packet.ReadInt32("ID", index); + splineData.Destination = packet.ReadVector3("Destination", index); + + var hasMovementSplineMove = packet.ReadBit("MovementSplineMove", index); + if (hasMovementSplineMove) + { + var moveData = splineData.MoveData = new(); + packet.ResetBitReader(); + + moveData.Flags = packet.ReadUInt32E("SplineFlags", index).ToUniversal(); + moveData.Elapsed = packet.ReadInt32("Elapsed", index); + moveData.Duration = packet.ReadUInt32("Duration", index); + moveData.DurationModifier = packet.ReadSingle("DurationModifier", index); + moveData.NextDurationModifier = packet.ReadSingle("NextDurationModifier", index); + + var face = packet.ReadBits("Face", 2, index); + var hasSpecialTime = packet.ReadBit("HasSpecialTime", index); + + var pointsCount = packet.ReadBits("PointsCount", 16, index); + + var hasSplineFilterKey = packet.ReadBit("HasSplineFilterKey", index); + var hasSpellEffectExtraData = packet.ReadBit("HasSpellEffectExtraData", index); + var hasJumpExtraData = packet.ReadBit("HasJumpExtraData", index); + var hasTurnData = packet.ReadBit("HasTurnData", index); + var hasAnimationTierTransition = packet.ReadBit("HasAnimationTierTransition", index); + + if (hasSplineFilterKey) + { + packet.ResetBitReader(); + var filterKeysCount = packet.ReadUInt32("FilterKeysCount", index); + for (var i = 0; i < filterKeysCount; ++i) + { + packet.ReadSingle("In", index, i); + packet.ReadSingle("Out", index, i); + } + + packet.ReadBits("FilterFlags", 2, index); + } + + switch (face) + { + case 1: + moveData.LookPosition = packet.ReadVector3("FaceSpot", index); + break; + case 2: + moveData.LookTarget = new() { Target = packet.ReadPackedGuid128("FaceGUID", index) }; + break; + case 3: + moveData.LookOrientation = packet.ReadSingle("FaceDirection", index); + break; + default: + break; + } + + if (hasSpecialTime) + packet.ReadUInt32("SpecialTime", index); + + for (var i = 0; i < pointsCount; ++i) + moveData.Points.Add(packet.ReadVector3("Points", index, i)); + + if (hasSpellEffectExtraData) + MovementHandler.ReadMonsterSplineSpellEffectExtraData(packet, index); + + if (hasJumpExtraData) + moveData.Jump = MovementHandler.ReadMonsterSplineJumpExtraData(packet, index); + + if (hasTurnData) + MovementHandler.ReadMonsterSplineTurnData(packet, index, "MonsterSplineTurnData"); + + if (hasAnimationTierTransition) + { + packet.ReadInt32("TierTransitionID", index); + packet.ReadByte("AnimTier", index); + packet.ReadInt32("StartTime", index); + packet.ReadInt32("EndTime", index); + packet.ReadByte("AnimTier", index); + } + } + } + } + + var pauseTimesCount = packet.ReadUInt32("PauseTimesCount", index); + + if (hasStationaryPosition) + { + moveInfo.Position = packet.ReadVector3(); + moveInfo.Orientation = packet.ReadSingle(); + + packet.AddValue("Stationary Position", moveInfo.Position, index); + packet.AddValue("Stationary Orientation", moveInfo.Orientation, index); + createObject.Stationary = new() { Position = moveInfo.Position, Orientation = moveInfo.Orientation }; + } + + if (hasCombatVictim) + packet.ReadPackedGuid128("CombatVictim Guid", index); + + if (hasServerTime) + packet.ReadUInt32("ServerTime", index); + + if (hasVehicleCreate) + { + var vehicle = createObject.Vehicle = new(); + moveInfo.VehicleId = (uint)packet.ReadInt32("RecID", index); + vehicle.VehicleId = (int)moveInfo.VehicleId; + vehicle.InitialRawFacing = packet.ReadSingle("InitialRawFacing", index); + } + + if (hasAnimKitCreate) + { + var aiId = packet.ReadUInt16("AiID", index); + var movementId = packet.ReadUInt16("MovementID", index); + var meleeId = packet.ReadUInt16("MeleeID", index); + if (obj is Unit unit) + { + unit.AIAnimKit = aiId; + unit.MovementAnimKit = movementId; + unit.MeleeAnimKit = meleeId; + } + else if (obj is GameObject gob) + { + gob.AIAnimKitID = aiId; + } + } + + if (hasRotation) + createObject.Rotation = moveInfo.Rotation = packet.ReadPackedQuaternion("GameObject Rotation", index); + + for (var i = 0; i < pauseTimesCount; ++i) + packet.ReadUInt32("PauseTimes", index, i); + + if (hasMovementTransport) + createObject.Transport = ReadTransportData(moveInfo, guid, packet, index); + + if (hasAreaTrigger && obj is AreaTriggerCreateProperties) + { + AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate + { + Id = guid.GetEntry(), + IsCustom = 0 + }; + + AreaTriggerCreateProperties createProperties = (AreaTriggerCreateProperties)obj; + createProperties.AreaTriggerId = guid.GetEntry(); + createProperties.IsAreatriggerCustom = areaTriggerTemplate.IsCustom; + + packet.ResetBitReader(); + + // CliAreaTrigger + packet.ReadUInt32("ElapsedMs", index); + + packet.ReadVector3("RollPitchYaw", index); + + AreaTriggerType type = AreaTriggerType.Sphere; + switch (packet.ReadSByte()) + { + case 0: + type = AreaTriggerType.Sphere; + areaTriggerTemplate.Data[0] = packet.ReadSingle("Radius", index); + areaTriggerTemplate.Data[1] = packet.ReadSingle("RadiusTarget", index); + break; + case 1: + { + type = AreaTriggerType.Box; + + Vector3 extents = packet.ReadVector3("Extents", index); + areaTriggerTemplate.Data[0] = extents.X; + areaTriggerTemplate.Data[1] = extents.Y; + areaTriggerTemplate.Data[2] = extents.Z; + + Vector3 extentsTarget = packet.ReadVector3("ExtentsTarget", index); + areaTriggerTemplate.Data[3] = extentsTarget.X; + areaTriggerTemplate.Data[4] = extentsTarget.Y; + areaTriggerTemplate.Data[5] = extentsTarget.Z; + break; + } + case 2: + case 3: + case 5: + case 6: + { + type = AreaTriggerType.Polygon; + + var verticesCount = packet.ReadUInt32("VerticesCount", index); + var verticesTargetCount = packet.ReadUInt32("VerticesTargetCount", index); + + List verticesList = new List(); + + areaTriggerTemplate.Data[0] = packet.ReadSingle("Height", index); + areaTriggerTemplate.Data[1] = packet.ReadSingle("HeightTarget", index); + + for (uint i = 0; i < verticesCount; ++i) + { + AreaTriggerCreatePropertiesPolygonVertex spellAreatriggerVertices = new AreaTriggerCreatePropertiesPolygonVertex + { + areatriggerGuid = guid, + Idx = i + }; + + Vector2 vertices = packet.ReadVector2("Vertices", index, i); + + spellAreatriggerVertices.VerticeX = vertices.X; + spellAreatriggerVertices.VerticeY = vertices.Y; + + verticesList.Add(spellAreatriggerVertices); + } + + for (var i = 0; i < verticesTargetCount; ++i) + { + Vector2 verticesTarget = packet.ReadVector2("VerticesTarget", index, i); + + verticesList[i].VerticeTargetX = verticesTarget.X; + verticesList[i].VerticeTargetY = verticesTarget.Y; + } + + foreach (AreaTriggerCreatePropertiesPolygonVertex vertice in verticesList) + Storage.AreaTriggerCreatePropertiesPolygonVertices.Add(vertice); + + break; + } + case 4: + type = AreaTriggerType.Cylinder; + areaTriggerTemplate.Data[0] = packet.ReadSingle("Radius", index); + areaTriggerTemplate.Data[1] = packet.ReadSingle("RadiusTarget", index); + areaTriggerTemplate.Data[2] = packet.ReadSingle("Height", index); + areaTriggerTemplate.Data[3] = packet.ReadSingle("HeightTarget", index); + areaTriggerTemplate.Data[4] = packet.ReadSingle("LocationZOffset", index); + areaTriggerTemplate.Data[5] = packet.ReadSingle("LocationZOffsetTarget", index); + break; + case 7: + type = AreaTriggerType.Disk; + areaTriggerTemplate.Data[0] = packet.ReadSingle("InnerRadius", index); + areaTriggerTemplate.Data[1] = packet.ReadSingle("InnerRadiusTarget", index); + areaTriggerTemplate.Data[2] = packet.ReadSingle("OuterRadius", index); + areaTriggerTemplate.Data[3] = packet.ReadSingle("OuterRadiusTarget", index); + areaTriggerTemplate.Data[4] = packet.ReadSingle("Height", index); + areaTriggerTemplate.Data[5] = packet.ReadSingle("HeightTarget", index); + areaTriggerTemplate.Data[6] = packet.ReadSingle("LocationZOffset", index); + areaTriggerTemplate.Data[7] = packet.ReadSingle("LocationZOffsetTarget", index); + break; + case 8: + { + type = AreaTriggerType.BoundedPlane; + + Vector2 extents = packet.ReadVector2("Extents", index); + areaTriggerTemplate.Data[0] = extents.X; + areaTriggerTemplate.Data[1] = extents.Y; + + Vector2 extentsTarget = packet.ReadVector2("ExtentsTarget", index); + areaTriggerTemplate.Data[2] = extentsTarget.X; + areaTriggerTemplate.Data[3] = extentsTarget.Y; + break; + } + } + + areaTriggerTemplate.Type = (byte)packet.AddValue("Type", type, index); + + areaTriggerTemplate.Flags = 0; + createProperties.Flags = 0; + + if (packet.ReadBit("HasAbsoluteOrientation", index)) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasAbsoluteOrientation; + + if (packet.ReadBit("HasDynamicShape", index)) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasDynamicShape; + + if (packet.ReadBit("HasAttached", index)) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasAttached; + + if (packet.ReadBit("HasFaceMovementDir", index)) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.FaceMovementDirection; + + if (packet.ReadBit("HasFollowsTerrain", index)) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.FollowsTerrain; + + if (packet.ReadBit("Unk bit WoD62x", index)) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.Unk1; + + packet.ReadBit("Unk1025", index); + + if (packet.ReadBit("HasTargetRollPitchYaw", index)) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasTargetRollPitchYaw; + + bool hasScaleCurveID = packet.ReadBit("HasScaleCurveID", index); + bool hasMorphCurveID = packet.ReadBit("HasMorphCurveID", index); + bool hasFacingCurveID = packet.ReadBit("HasFacingCurveID", index); + bool hasMoveCurveID = packet.ReadBit("HasMoveCurveID", index); + bool hasPositionalSoundKitID = packet.ReadBit("HasPositionalSoundKitID", index); + + if (packet.ReadBit("HasAnimID", index)) + areaTriggerTemplate.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasAnimId; + + if (packet.ReadBit("HasAnimKitID", index)) + areaTriggerTemplate.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasAnimKitId; + + if (packet.ReadBit("HasVisualAnimIsDecay", index)) + areaTriggerTemplate.Flags |= (uint)AreaTriggerCreatePropertiesFlags.VisualAnimIsDecay; + + bool hasAnimProgress = packet.ReadBit("HasAnimProgress", index); + bool hasAreaTriggerSpline = packet.ReadBit("HasAreaTriggerSpline", index); + + if (packet.ReadBit("HasAreaTriggerOrbit", index)) + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasOrbit; + + if (packet.ReadBit("HasAreaTriggerMovementScript", index)) // seen with spellid 343597 + createProperties.Flags |= (uint)AreaTriggerCreatePropertiesFlags.HasMovementScript; + + if ((areaTriggerTemplate.Flags & (uint)AreaTriggerCreatePropertiesFlags.VisualAnimIsDecay) != 0) + if (!packet.ReadBit("VisualAnimIsDecay", index)) + createProperties.Flags &= ~(uint)AreaTriggerCreatePropertiesFlags.VisualAnimIsDecay; + + if (hasAreaTriggerSpline) + foreach (var splinePoint in AreaTriggerHandler.ReadAreaTriggerSpline(createProperties, packet, index, "AreaTriggerSpline")) + Storage.AreaTriggerCreatePropertiesSplinePoints.Add(splinePoint); + + if ((createProperties.Flags & (uint)AreaTriggerCreatePropertiesFlags.HasTargetRollPitchYaw) != 0) + packet.ReadVector3("TargetRollPitchYaw", index); + + if (hasScaleCurveID) + createProperties.ScaleCurveId = (int)packet.ReadUInt32("ScaleCurveID", index); + + if (hasMorphCurveID) + createProperties.MorphCurveId = (int)packet.ReadUInt32("MorphCurveID", index); + + if (hasFacingCurveID) + createProperties.FacingCurveId = (int)packet.ReadUInt32("FacingCurveID", index); + + if (hasMoveCurveID) + createProperties.MoveCurveId = (int)packet.ReadUInt32("MoveCurveID", index); + + if (hasPositionalSoundKitID) + packet.ReadUInt32("PositionalSoundKitID", index); + + if ((areaTriggerTemplate.Flags & (int)AreaTriggerCreatePropertiesFlags.HasAnimId) != 0) + createProperties.AnimId = packet.ReadInt32("AnimId", index); + + if ((areaTriggerTemplate.Flags & (int)AreaTriggerCreatePropertiesFlags.HasAnimKitId) != 0) + createProperties.AnimKitId = packet.ReadInt32("AnimKitId", index); + + if (hasAnimProgress) + packet.ReadUInt32("AnimProgress", index); + + if ((createProperties.Flags & (uint)AreaTriggerCreatePropertiesFlags.HasMovementScript) != 0) + { + packet.ReadInt32("SpellScriptID"); + packet.ReadVector3("Center"); + } + + if ((createProperties.Flags & (uint)AreaTriggerCreatePropertiesFlags.HasOrbit) != 0) + Storage.AreaTriggerCreatePropertiesOrbits.Add(AreaTriggerHandler.ReadAreaTriggerOrbit(createProperties, packet, index, "AreaTriggerOrbit")); + + // TargetedDatabase.Shadowlands stores AreaTriggerCreatePropertiesFlags in Template + if (Settings.TargetedDatabase < TargetedDatabase.Dragonflight) + areaTriggerTemplate.Flags = createProperties.Flags; + + createProperties.Shape = areaTriggerTemplate.Type; + Array.Copy(areaTriggerTemplate.Data, createProperties.ShapeData, Math.Min(areaTriggerTemplate.Data.Length, createProperties.ShapeData.Length)); + + Storage.AreaTriggerTemplates.Add(areaTriggerTemplate); + } + + if (hasGameObject) + { + packet.ResetBitReader(); + var worldEffectId = packet.ReadUInt32("WorldEffectID", index); + if (worldEffectId != 0 && obj is GameObject gob) + gob.WorldEffectID = worldEffectId; + + var hasInt1 = packet.ReadBit("bit8", index); + var hasShipPath = packet.ReadBit("HasShipPath", index); + var hasTransportStatePercent = packet.ReadBit("HasTransportStatePercent", index); + if (hasShipPath) + { + packet.ResetBitReader(); + packet.ReadUInt32("Period", index, "ShipPath"); + packet.ReadUInt32("Progress", index, "ShipPath"); + packet.ReadBit("StopRequested", index, "ShipPath"); + packet.ReadBit("Stopped", index, "ShipPath"); + packet.ReadBit("Field_16", index, "ShipPath"); + } + + if (hasInt1) + packet.ReadUInt32("Int1", index); + + if (hasTransportStatePercent) + packet.ReadSingle("TransportStatePercent", index); + } + + if (hasSmoothPhasing) + { + packet.ResetBitReader(); + packet.ReadBit("ReplaceActive", index); + packet.ReadBit("StopAnimKits", index); + + var replaceObject = packet.ReadBit(); + if (replaceObject) + packet.ReadPackedGuid128("ReplaceObject", index); + } + + if (sceneObjCreate) + { + packet.ResetBitReader(); + + var hasSceneLocalScriptData = packet.ReadBit("HasSceneLocalScriptData", index); + var petBattleFullUpdate = packet.ReadBit("HasPetBattleFullUpdate", index); + + if (hasSceneLocalScriptData) + { + packet.ResetBitReader(); + var dataLength = packet.ReadBits(7); + packet.ReadWoWString("Data", dataLength, index); + } + + if (petBattleFullUpdate) + BattlePetHandler.ReadPetBattleFullUpdate(packet, index); + } + + if (playerCreateData) + { + packet.ResetBitReader(); + var hasSceneInstanceIDs = packet.ReadBit("ScenePendingInstances", index); + var hasRuneState = packet.ReadBit("Runes", index); + var hasActionButtons = packet.ReadBit("HasActionButtons", index); + + if (hasSceneInstanceIDs) + { + var sceneInstanceIDs = packet.ReadUInt32("SceneInstanceIDsCount"); + for (var i = 0; i < sceneInstanceIDs; ++i) + packet.ReadInt32("SceneInstanceIDs", index, i); + } + + if (hasRuneState) + { + packet.ReadByte("RechargingRuneMask", index); + packet.ReadByte("UsableRuneMask", index); + var runeCount = packet.ReadUInt32(); + for (var i = 0; i < runeCount; ++i) + packet.ReadByte("RuneCooldown", index, i); + } + + if (hasActionButtons) + { + for (int i = 0; i < 180; i++) + packet.ReadInt64("Action", index, i); + } + } + + if (hasConversation) + { + packet.ResetBitReader(); + if (packet.ReadBit("HasTextureKitID", index)) + (obj as ConversationTemplate).TextureKitId = packet.ReadUInt32("TextureKitID", index); + } + + return moveInfo; + } + } +} diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ActivePlayerData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ActivePlayerData.cs new file mode 100644 index 0000000000..2359322002 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ActivePlayerData.cs @@ -0,0 +1,162 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ActivePlayerData : IActivePlayerData + { + public WowGuid[] InvSlots { get; } = new WowGuid[146]; + public WowGuid FarsightObject { get; set; } + public WowGuid SummonedBattlePetGUID { get; set; } + public System.Nullable Coinage { get; set; } + public System.Nullable AccountBankCoinage { get; set; } + public System.Nullable XP { get; set; } + public System.Nullable NextLevelXP { get; set; } + public System.Nullable TrialXP { get; set; } + public ISkillInfo Skill { get; set; } + public System.Nullable CharacterPoints { get; set; } + public System.Nullable MaxTalentTiers { get; set; } + public System.Nullable TrackCreatureMask { get; set; } + public System.Nullable[] TrackResourceMask { get; } = new System.Nullable[2]; + public System.Nullable MainhandExpertise { get; set; } + public System.Nullable OffhandExpertise { get; set; } + public System.Nullable RangedExpertise { get; set; } + public System.Nullable CombatRatingExpertise { get; set; } + public System.Nullable BlockPercentage { get; set; } + public System.Nullable DodgePercentage { get; set; } + public System.Nullable DodgePercentageFromAttribute { get; set; } + public System.Nullable ParryPercentage { get; set; } + public System.Nullable ParryPercentageFromAttribute { get; set; } + public System.Nullable CritPercentage { get; set; } + public System.Nullable RangedCritPercentage { get; set; } + public System.Nullable OffhandCritPercentage { get; set; } + public System.Nullable[] SpellCritPercentage { get; } = new System.Nullable[7]; + public System.Nullable[] ModDamageDonePos { get; } = new System.Nullable[7]; + public System.Nullable[] ModDamageDoneNeg { get; } = new System.Nullable[7]; + public System.Nullable[] ModDamageDonePercent { get; } = new System.Nullable[7]; + public System.Nullable ShieldBlock { get; set; } + public System.Nullable ShieldBlockCritPercentage { get; set; } + public System.Nullable Mastery { get; set; } + public System.Nullable Speed { get; set; } + public System.Nullable Avoidance { get; set; } + public System.Nullable Sturdiness { get; set; } + public System.Nullable Versatility { get; set; } + public System.Nullable VersatilityBonus { get; set; } + public System.Nullable PvpPowerDamage { get; set; } + public System.Nullable PvpPowerHealing { get; set; } + public IBitVectors BitVectors { get; set; } + public IRestInfo[] RestInfo { get; } = new IRestInfo[2]; + public System.Nullable ModHealingDonePos { get; set; } + public System.Nullable ModHealingPercent { get; set; } + public System.Nullable ModHealingDonePercent { get; set; } + public System.Nullable ModPeriodicHealingDonePercent { get; set; } + public System.Nullable[] WeaponDmgMultipliers { get; } = new System.Nullable[3]; + public System.Nullable[] WeaponAtkSpeedMultipliers { get; } = new System.Nullable[3]; + public System.Nullable ModSpellPowerPercent { get; set; } + public System.Nullable ModResiliencePercent { get; set; } + public System.Nullable OverrideSpellPowerByAPPercent { get; set; } + public System.Nullable OverrideAPBySpellPowerPercent { get; set; } + public System.Nullable ModTargetResistance { get; set; } + public System.Nullable ModTargetPhysicalResistance { get; set; } + public System.Nullable LocalFlags { get; set; } + public System.Nullable GrantableLevels { get; set; } + public System.Nullable MultiActionBars { get; set; } + public System.Nullable LifetimeMaxRank { get; set; } + public System.Nullable NumRespecs { get; set; } + public System.Nullable AmmoID { get; set; } + public System.Nullable PvpMedals { get; set; } + public System.Nullable[] BuybackPrice { get; } = new System.Nullable[12]; + public System.Nullable[] BuybackTimestamp { get; } = new System.Nullable[12]; + public System.Nullable TodayHonorableKills { get; set; } + public System.Nullable TodayDishonorableKills { get; set; } + public System.Nullable YesterdayHonorableKills { get; set; } + public System.Nullable YesterdayDishonorableKills { get; set; } + public System.Nullable LastWeekHonorableKills { get; set; } + public System.Nullable LastWeekDishonorableKills { get; set; } + public System.Nullable ThisWeekHonorableKills { get; set; } + public System.Nullable ThisWeekDishonorableKills { get; set; } + public System.Nullable ThisWeekContribution { get; set; } + public System.Nullable LifetimeHonorableKills { get; set; } + public System.Nullable LifetimeDishonorableKills { get; set; } + public System.Nullable Field_F24 { get; set; } + public System.Nullable YesterdayContribution { get; set; } + public System.Nullable LastWeekContribution { get; set; } + public System.Nullable LastWeekRank { get; set; } + public System.Nullable WatchedFactionIndex { get; set; } + public System.Nullable[] CombatRatings { get; } = new System.Nullable[32]; + public System.Nullable MaxLevel { get; set; } + public System.Nullable ScalingPlayerLevelDelta { get; set; } + public System.Nullable MaxCreatureScalingLevel { get; set; } + public System.Nullable[] NoReagentCostMask { get; } = new System.Nullable[4]; + public System.Nullable PetSpellPower { get; set; } + public System.Nullable[] ProfessionSkillLine { get; } = new System.Nullable[2]; + public System.Nullable UiHitModifier { get; set; } + public System.Nullable UiSpellHitModifier { get; set; } + public System.Nullable HomeRealmTimeOffset { get; set; } + public System.Nullable ModPetHaste { get; set; } + public System.Nullable LocalRegenFlags { get; set; } + public System.Nullable AuraVision { get; set; } + public System.Nullable NumBackpackSlots { get; set; } + public System.Nullable OverrideSpellsID { get; set; } + public System.Nullable LfgBonusFactionID { get; set; } + public System.Nullable LootSpecID { get; set; } + public System.Nullable OverrideZonePVPType { get; set; } + public System.Nullable[] BagSlotFlags { get; } = new System.Nullable[4]; + public System.Nullable[] BankBagSlotFlags { get; } = new System.Nullable[7]; + public System.Nullable Honor { get; set; } + public System.Nullable HonorNextLevel { get; set; } + public System.Nullable Field_F74 { get; set; } + public System.Nullable Field_1261 { get; set; } + public System.Nullable PvpTierMaxFromWins { get; set; } + public System.Nullable PvpLastWeeksTierMaxFromWins { get; set; } + public System.Nullable PvpRankProgress { get; set; } + public System.Nullable PerksProgramCurrency { get; set; } + public IResearchHistory ResearchHistory { get; set; } + public System.Nullable TimerunningSeasonID { get; set; } + public System.Nullable TransportServerTime { get; set; } + public System.Nullable ActiveCombatTraitConfigID { get; set; } + public System.Nullable[] GlyphSlots { get; } = new System.Nullable[9]; + public System.Nullable[] Glyphs { get; } = new System.Nullable[9]; + public System.Nullable GlyphsEnabled { get; set; } + public System.Nullable LfgRoles { get; set; } + public IStableInfo PetStable { get; set; } + public System.Nullable NumStableSlots { get; set; } + public System.Nullable[] Field_4348 { get; } = new System.Nullable[13]; + public System.Nullable Field_17B8 { get; set; } + public DynamicUpdateField>[] ResearchSites { get; } = new DynamicUpdateField>[1] { new DynamicUpdateField>() }; + public DynamicUpdateField>[] ResearchSiteProgress { get; } = new DynamicUpdateField>[1] { new DynamicUpdateField>() }; + public DynamicUpdateField[] Research { get; } = new DynamicUpdateField[1] { new DynamicUpdateField() }; + public DynamicUpdateField> KnownTitles { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> DailyQuestsCompleted { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> Field_1000 { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> AvailableQuestLineXQuestIDs { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> Heirlooms { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> HeirloomFlags { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> Toys { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> ToyFlags { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> Transmog { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> ConditionalTransmog { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> SelfResSpells { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> WarbandScenes { get; } = new DynamicUpdateField>(); + public DynamicUpdateField SpellPctModByLabel { get; } = new DynamicUpdateField(); + public DynamicUpdateField SpellFlatModByLabel { get; } = new DynamicUpdateField(); + public DynamicUpdateField TaskQuests { get; } = new DynamicUpdateField(); + public DynamicUpdateField CategoryCooldownMods { get; } = new DynamicUpdateField(); + public DynamicUpdateField WeeklySpellUses { get; } = new DynamicUpdateField(); + public IPVPInfo[] PvpInfo { get; } = new IPVPInfo[9]; + public System.Nullable SortBagsRightToLeft { get; set; } + public System.Nullable InsertItemsLeftToRight { get; set; } + public DynamicUpdateField CharacterDataElements { get; } = new DynamicUpdateField(); + public DynamicUpdateField AccountDataElements { get; } = new DynamicUpdateField(); + public DynamicUpdateField CharacterRestrictions { get; } = new DynamicUpdateField(); + public DynamicUpdateField TraitConfigs { get; } = new DynamicUpdateField(); + public DynamicUpdateField AccountBankTabSettings { get; } = new DynamicUpdateField(); + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/AreaTriggerData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/AreaTriggerData.cs new file mode 100644 index 0000000000..118a97db3b --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/AreaTriggerData.cs @@ -0,0 +1,35 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class AreaTriggerData : IAreaTriggerData + { + public WowGuid Caster { get; set; } + public System.Nullable Duration { get; set; } + public System.Nullable TimeToTarget { get; set; } + public System.Nullable TimeToTargetScale { get; set; } + public System.Nullable TimeToTargetExtraScale { get; set; } + public System.Nullable TimeToTargetPos { get; set; } + public System.Nullable SpellID { get; set; } + public System.Nullable SpellForVisuals { get; set; } + public System.Nullable SpellXSpellVisualID { get; set; } + public System.Nullable BoundsRadius2D { get; set; } + public System.Nullable DecalPropertiesID { get; set; } + public WowGuid CreatingEffectGUID { get; set; } + public WowGuid OrbitPathTarget { get; set; } + public IScaleCurve OverrideScaleCurve { get; set; } + public IScaleCurve ExtraScaleCurve { get; set; } + public IScaleCurve OverrideMoveCurveX { get; set; } + public IScaleCurve OverrideMoveCurveY { get; set; } + public IScaleCurve OverrideMoveCurveZ { get; set; } + public IVisualAnim VisualAnim { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ArenaCooldown.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ArenaCooldown.cs new file mode 100644 index 0000000000..40020e34f3 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ArenaCooldown.cs @@ -0,0 +1,24 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ArenaCooldown : IArenaCooldown + { + public System.Nullable SpellID { get; set; } + public System.Nullable ItemID { get; set; } + public System.Nullable Charges { get; set; } + public System.Nullable Flags { get; set; } + public System.Nullable StartTime { get; set; } + public System.Nullable EndTime { get; set; } + public System.Nullable NextChargeTime { get; set; } + public System.Nullable MaxCharges { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ArtifactPower.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ArtifactPower.cs new file mode 100644 index 0000000000..129150328a --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ArtifactPower.cs @@ -0,0 +1,19 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ArtifactPower : IArtifactPower + { + public short ArtifactPowerID { get; set; } + public byte PurchasedRank { get; set; } + public byte CurrentRankWithBonus { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/BankTabSettings.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/BankTabSettings.cs new file mode 100644 index 0000000000..258c67af90 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/BankTabSettings.cs @@ -0,0 +1,20 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class BankTabSettings : IBankTabSettings + { + public System.Nullable DepositFlags { get; set; } + public string Name { get; set; } + public string Icon { get; set; } + public string Description { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/BitVector.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/BitVector.cs new file mode 100644 index 0000000000..abfad571b2 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/BitVector.cs @@ -0,0 +1,17 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class BitVector : IBitVector + { + public DynamicUpdateField> Values { get; } = new DynamicUpdateField>(); + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/BitVectors.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/BitVectors.cs new file mode 100644 index 0000000000..2b9a7945d5 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/BitVectors.cs @@ -0,0 +1,17 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class BitVectors : IBitVectors + { + public IBitVector[] Values { get; } = new IBitVector[13]; + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CategoryCooldownMod.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CategoryCooldownMod.cs new file mode 100644 index 0000000000..6c08feddf0 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CategoryCooldownMod.cs @@ -0,0 +1,18 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class CategoryCooldownMod : ICategoryCooldownMod + { + public int SpellCategoryID { get; set; } + public int ModCooldown { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CharacterRestriction.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CharacterRestriction.cs new file mode 100644 index 0000000000..c99ea47029 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CharacterRestriction.cs @@ -0,0 +1,20 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class CharacterRestriction : ICharacterRestriction + { + public int Field_0 { get; set; } + public int Field_4 { get; set; } + public int Field_8 { get; set; } + public uint Type { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ChrCustomizationChoice.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ChrCustomizationChoice.cs new file mode 100644 index 0000000000..c3b7f02e3c --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ChrCustomizationChoice.cs @@ -0,0 +1,18 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ChrCustomizationChoice : IChrCustomizationChoice + { + public uint ChrCustomizationOptionID { get; set; } + public uint ChrCustomizationChoiceID { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CompletedProject.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CompletedProject.cs new file mode 100644 index 0000000000..de62ecf71c --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CompletedProject.cs @@ -0,0 +1,19 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class CompletedProject : ICompletedProject + { + public System.Nullable ProjectID { get; set; } + public System.Nullable FirstCompleted { get; set; } + public System.Nullable CompletionCount { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ContainerData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ContainerData.cs new file mode 100644 index 0000000000..6ea21cc446 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ContainerData.cs @@ -0,0 +1,18 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ContainerData : IContainerData + { + public WowGuid[] Slots { get; } = new WowGuid[36]; + public System.Nullable NumSlots { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ConversationActor.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ConversationActor.cs new file mode 100644 index 0000000000..2ae1765c91 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ConversationActor.cs @@ -0,0 +1,24 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ConversationActor : IConversationActor + { + public int Id { get; set; } + public uint CreatureID { get; set; } + public uint CreatureDisplayInfoID { get; set; } + public WowGuid ActorGUID { get; set; } + public uint Type { get; set; } + + // dummies required by interface + public uint NoActorObject { get; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ConversationData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ConversationData.cs new file mode 100644 index 0000000000..beee01326d --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ConversationData.cs @@ -0,0 +1,19 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ConversationData : IMutableConversationData + { + public System.Nullable LastLineEndTime { get; set; } + public IConversationLine[] Lines { get; set; } + public DynamicUpdateField Actors { get; } = new DynamicUpdateField(); + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ConversationLine.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ConversationLine.cs new file mode 100644 index 0000000000..9cc29bc1d3 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ConversationLine.cs @@ -0,0 +1,25 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ConversationLine : IConversationLine + { + public int ConversationLineID { get; set; } + public int BroadcastTextID { get; set; } + public uint StartTime { get; set; } + public int UiCameraID { get; set; } + public byte ActorIndex { get; set; } + public byte Flags { get; set; } + + // dummies required by interface + public byte ChatType { get; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CorpseData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CorpseData.cs new file mode 100644 index 0000000000..0d9db3fcf1 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CorpseData.cs @@ -0,0 +1,28 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class CorpseData : ICorpseData + { + public System.Nullable DynamicFlags { get; set; } + public WowGuid Owner { get; set; } + public WowGuid PartyGUID { get; set; } + public WowGuid GuildGUID { get; set; } + public System.Nullable DisplayID { get; set; } + public System.Nullable[] Items { get; } = new System.Nullable[19]; + public System.Nullable RaceID { get; set; } + public System.Nullable Sex { get; set; } + public System.Nullable Class { get; set; } + public System.Nullable Flags { get; set; } + public System.Nullable FactionTemplate { get; set; } + public DynamicUpdateField Customizations { get; } = new DynamicUpdateField(); + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CustomTabardInfo.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CustomTabardInfo.cs new file mode 100644 index 0000000000..99af77ab65 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/CustomTabardInfo.cs @@ -0,0 +1,21 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class CustomTabardInfo : ICustomTabardInfo + { + public System.Nullable EmblemStyle { get; set; } + public System.Nullable EmblemColor { get; set; } + public System.Nullable BorderStyle { get; set; } + public System.Nullable BorderColor { get; set; } + public System.Nullable BackgroundColor { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/DeclinedNames.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/DeclinedNames.cs new file mode 100644 index 0000000000..a9897e5986 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/DeclinedNames.cs @@ -0,0 +1,17 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class DeclinedNames : IDeclinedNames + { + public string[] Name { get; } = new string[5]; + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/DynamicObjectData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/DynamicObjectData.cs new file mode 100644 index 0000000000..6ae3580601 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/DynamicObjectData.cs @@ -0,0 +1,22 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class DynamicObjectData : IDynamicObjectData + { + public WowGuid Caster { get; set; } + public System.Nullable Type { get; set; } + public System.Nullable SpellXSpellVisualID { get; set; } + public System.Nullable SpellID { get; set; } + public System.Nullable Radius { get; set; } + public System.Nullable CastTime { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/GameObjectAssistActionData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/GameObjectAssistActionData.cs new file mode 100644 index 0000000000..6583488bf6 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/GameObjectAssistActionData.cs @@ -0,0 +1,16 @@ +using System.CodeDom.Compiler; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class GameObjectAssistActionData : IGameObjectAssistActionData + { + public string PlayerName { get; set; } + public string MonsterName { get; set; } + public uint VirtualRealmAddress { get; set; } + public byte Sex { get; set; } + public long Time { get; set; } + public int DelveTier { get; set; } + } +} diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/GameObjectData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/GameObjectData.cs new file mode 100644 index 0000000000..662c428e3c --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/GameObjectData.cs @@ -0,0 +1,37 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class GameObjectData : IMutableGameObjectData + { + public System.Nullable DisplayID { get; set; } + public System.Nullable SpellVisualID { get; set; } + public System.Nullable StateSpellVisualID { get; set; } + public System.Nullable SpawnTrackingStateAnimID { get; set; } + public System.Nullable SpawnTrackingStateAnimKitID { get; set; } + public System.Nullable StateWorldEffectsQuestObjectiveID { get; set; } = null; + public System.Nullable[] StateWorldEffectIDs { get; set; } + public WowGuid CreatedBy { get; set; } + public WowGuid GuildGUID { get; set; } + public System.Nullable Flags { get; set; } + public Quaternion? ParentRotation { get; set; } + public System.Nullable FactionTemplate { get; set; } + public System.Nullable Level { get; set; } + public System.Nullable State { get; set; } + public System.Nullable TypeID { get; set; } + public System.Nullable PercentHealth { get; set; } + public System.Nullable ArtKit { get; set; } + public System.Nullable CustomParam { get; set; } + public DynamicUpdateField> EnableDoodadSets { get; } = new DynamicUpdateField>(); + public DynamicUpdateField> WorldEffects { get; } = new DynamicUpdateField>(); + public IGameObjectAssistActionData AssistActionData { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemData.cs new file mode 100644 index 0000000000..a3d33cbf38 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemData.cs @@ -0,0 +1,39 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ItemData : IItemData + { + public WowGuid Owner { get; set; } + public WowGuid ContainedIn { get; set; } + public WowGuid Creator { get; set; } + public WowGuid GiftCreator { get; set; } + public System.Nullable StackCount { get; set; } + public System.Nullable Expiration { get; set; } + public System.Nullable[] SpellCharges { get; } = new System.Nullable[5]; + public System.Nullable DynamicFlags { get; set; } + public IItemEnchantment[] Enchantment { get; } = new IItemEnchantment[13]; + public System.Nullable PropertySeed { get; set; } + public System.Nullable RandomPropertiesID { get; set; } + public System.Nullable Durability { get; set; } + public System.Nullable MaxDurability { get; set; } + public System.Nullable CreatePlayedTime { get; set; } + public System.Nullable Context { get; set; } + public System.Nullable CreateTime { get; set; } + public System.Nullable ArtifactXP { get; set; } + public System.Nullable ItemAppearanceModID { get; set; } + public System.Nullable ZoneFlags { get; set; } + public System.Nullable DEBUGItemLevel { get; set; } + public DynamicUpdateField ArtifactPowers { get; } = new DynamicUpdateField(); + public DynamicUpdateField Gems { get; } = new DynamicUpdateField(); + public IItemModList Modifiers { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemEnchantment.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemEnchantment.cs new file mode 100644 index 0000000000..32625b550c --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemEnchantment.cs @@ -0,0 +1,20 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ItemEnchantment : IItemEnchantment + { + public System.Nullable ID { get; set; } + public System.Nullable Duration { get; set; } + public System.Nullable Charges { get; set; } + public System.Nullable Inactive { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemMod.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemMod.cs new file mode 100644 index 0000000000..d60b6e6fa3 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemMod.cs @@ -0,0 +1,18 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ItemMod : IItemMod + { + public byte Type { get; set; } + public int Value { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemModList.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemModList.cs new file mode 100644 index 0000000000..86afc0cbc2 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ItemModList.cs @@ -0,0 +1,17 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ItemModList : IItemModList + { + public DynamicUpdateField Values { get; } = new DynamicUpdateField(); + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/LeaverInfo.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/LeaverInfo.cs new file mode 100644 index 0000000000..eb4cb2b927 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/LeaverInfo.cs @@ -0,0 +1,26 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class LeaverInfo : ILeaverInfo + { + public WowGuid BnetAccountGUID { get; set; } + public float LeaveScore { get; set; } + public uint SeasonID { get; set; } + public uint TotalLeaves { get; set; } + public uint TotalSuccesses { get; set; } + public int ConsecutiveSuccesses { get; set; } + public long LastPenaltyTime { get; set; } + public long LeaverExpirationTime { get; set; } + public int Unknown_1120 { get; set; } + public uint LeaverStatus { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ObjectData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ObjectData.cs new file mode 100644 index 0000000000..ead29f97a7 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ObjectData.cs @@ -0,0 +1,19 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ObjectData : IMutableObjectData + { + public System.Nullable EntryID { get; set; } + public System.Nullable DynamicFlags { get; set; } + public System.Nullable Scale { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PVPInfo.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PVPInfo.cs new file mode 100644 index 0000000000..94f6f87194 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PVPInfo.cs @@ -0,0 +1,34 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class PVPInfo : IPVPInfo + { + public System.Nullable Bracket { get; set; } + public System.Nullable PvpRatingID { get; set; } + public System.Nullable WeeklyPlayed { get; set; } + public System.Nullable WeeklyWon { get; set; } + public System.Nullable SeasonPlayed { get; set; } + public System.Nullable SeasonWon { get; set; } + public System.Nullable Rating { get; set; } + public System.Nullable WeeklyBestRating { get; set; } + public System.Nullable SeasonBestRating { get; set; } + public System.Nullable PvpTierID { get; set; } + public System.Nullable WeeklyBestWinPvpTierID { get; set; } + public System.Nullable Field_28 { get; set; } + public System.Nullable Field_2C { get; set; } + public System.Nullable WeeklyRoundsPlayed { get; set; } + public System.Nullable WeeklyRoundsWon { get; set; } + public System.Nullable SeasonRoundsPlayed { get; set; } + public System.Nullable SeasonRoundsWon { get; set; } + public System.Nullable Disqualified { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PassiveSpellHistory.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PassiveSpellHistory.cs new file mode 100644 index 0000000000..7f712ee717 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PassiveSpellHistory.cs @@ -0,0 +1,18 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class PassiveSpellHistory : IPassiveSpellHistory + { + public int SpellID { get; set; } + public int AuraSpellID { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PetCreatureName.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PetCreatureName.cs new file mode 100644 index 0000000000..2b7bdd1ffd --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PetCreatureName.cs @@ -0,0 +1,18 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class PetCreatureName : IPetCreatureName + { + public System.Nullable CreatureID { get; set; } + public string Name { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PlayerData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PlayerData.cs new file mode 100644 index 0000000000..73ec75457e --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PlayerData.cs @@ -0,0 +1,61 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class PlayerData : IPlayerData + { + public WowGuid DuelArbiter { get; set; } + public WowGuid WowAccount { get; set; } + public WowGuid BnetAccount { get; set; } + public System.Nullable GuildClubMemberID { get; set; } + public WowGuid LootTargetGUID { get; set; } + public System.Nullable PlayerFlags { get; set; } + public System.Nullable PlayerFlagsEx { get; set; } + public System.Nullable GuildRankID { get; set; } + public System.Nullable GuildDeleteDate { get; set; } + public System.Nullable GuildLevel { get; set; } + public System.Nullable[] PartyType { get; } = new System.Nullable[2]; + public System.Nullable NumBankSlots { get; set; } + public System.Nullable NativeSex { get; set; } + public System.Nullable Inebriation { get; set; } + public System.Nullable PvpTitle { get; set; } + public System.Nullable ArenaFaction { get; set; } + public System.Nullable PvpRank { get; set; } + public System.Nullable Field_88 { get; set; } + public System.Nullable DuelTeam { get; set; } + public System.Nullable GuildTimeStamp { get; set; } + public IQuestLog[] QuestLog { get; } = new IQuestLog[25]; + public IVisibleItem[] VisibleItems { get; } = new IVisibleItem[19]; + public System.Nullable PlayerTitle { get; set; } + public System.Nullable FakeInebriation { get; set; } + public System.Nullable VirtualPlayerRealm { get; set; } + public System.Nullable CurrentSpecID { get; set; } + public System.Nullable TaxiMountAnimKitID { get; set; } + public System.Nullable[] AvgItemLevel { get; } = new System.Nullable[6]; + public System.Nullable CurrentBattlePetBreedQuality { get; set; } + public System.Nullable HonorLevel { get; set; } + public System.Nullable LogoutTime { get; set; } + public IZonePlayerForcedReaction[] ForcedReactions { get; } = new IZonePlayerForcedReaction[32]; + public System.Nullable Field_13C { get; set; } + public System.Nullable Field_140 { get; set; } + public System.Nullable CurrentBattlePetSpeciesID { get; set; } + public System.Nullable[] Field_3120 { get; } = new System.Nullable[19]; + public IDeclinedNames DeclinedNames { get; set; } + public ICustomTabardInfo PersonalTabard { get; set; } + public DynamicUpdateField Customizations { get; } = new DynamicUpdateField(); + public DynamicUpdateField ArenaCooldowns { get; } = new DynamicUpdateField(); + public DynamicUpdateField> VisualItemReplacements { get; } = new DynamicUpdateField>(); + public string Name { get; set; } + public ILeaverInfo LeaverInfo { get; set; } + public System.Nullable HasLevelLink { get; set; } + public DynamicUpdateField PetNames { get; } = new DynamicUpdateField(); + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PlayerDataElement.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PlayerDataElement.cs new file mode 100644 index 0000000000..4355f45447 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/PlayerDataElement.cs @@ -0,0 +1,19 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class PlayerDataElement : IPlayerDataElement + { + public float FloatValue { get; set; } + public long Int64Value { get; set; } + public uint Type { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/QuestLog.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/QuestLog.cs new file mode 100644 index 0000000000..b9cdc57054 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/QuestLog.cs @@ -0,0 +1,20 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class QuestLog : IQuestLog + { + public System.Nullable EndTime { get; set; } + public System.Nullable QuestID { get; set; } + public System.Nullable StateFlags { get; set; } + public System.Nullable[] ObjectiveProgress { get; } = new System.Nullable[24]; + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/Research.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/Research.cs new file mode 100644 index 0000000000..8807023ba5 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/Research.cs @@ -0,0 +1,17 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class Research : IResearch + { + public short ResearchProjectID { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ResearchHistory.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ResearchHistory.cs new file mode 100644 index 0000000000..0d80dba4dc --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ResearchHistory.cs @@ -0,0 +1,17 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ResearchHistory : IResearchHistory + { + public DynamicUpdateField CompletedProjects { get; } = new DynamicUpdateField(); + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/RestInfo.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/RestInfo.cs new file mode 100644 index 0000000000..539c9d840d --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/RestInfo.cs @@ -0,0 +1,18 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class RestInfo : IRestInfo + { + public System.Nullable Threshold { get; set; } + public System.Nullable StateID { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ScaleCurve.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ScaleCurve.cs new file mode 100644 index 0000000000..9eaacbe64a --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ScaleCurve.cs @@ -0,0 +1,20 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ScaleCurve : IScaleCurve + { + public System.Nullable StartTimeOffset { get; set; } + public Vector2[] Points { get; } = new Vector2[2]; + public System.Nullable ParameterCurve { get; set; } + public System.Nullable OverrideActive { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SceneObjectData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SceneObjectData.cs new file mode 100644 index 0000000000..e3d34e4fc1 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SceneObjectData.cs @@ -0,0 +1,20 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class SceneObjectData : ISceneObjectData + { + public System.Nullable ScriptPackageID { get; set; } + public System.Nullable RndSeedVal { get; set; } + public WowGuid CreatedBy { get; set; } + public System.Nullable SceneType { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SkillInfo.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SkillInfo.cs new file mode 100644 index 0000000000..b9636b3f45 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SkillInfo.cs @@ -0,0 +1,23 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class SkillInfo : ISkillInfo + { + public System.Nullable[] SkillLineID { get; } = new System.Nullable[256]; + public System.Nullable[] SkillStep { get; } = new System.Nullable[256]; + public System.Nullable[] SkillRank { get; } = new System.Nullable[256]; + public System.Nullable[] SkillStartingRank { get; } = new System.Nullable[256]; + public System.Nullable[] SkillMaxRank { get; } = new System.Nullable[256]; + public System.Nullable[] SkillTempBonus { get; } = new System.Nullable[256]; + public System.Nullable[] SkillPermBonus { get; } = new System.Nullable[256]; + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SocketedGem.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SocketedGem.cs new file mode 100644 index 0000000000..3a3fbfc756 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SocketedGem.cs @@ -0,0 +1,19 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class SocketedGem : ISocketedGem + { + public System.Nullable ItemID { get; set; } + public System.Nullable[] BonusListIDs { get; } = new System.Nullable[16]; + public System.Nullable Context { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SpellFlatModByLabel.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SpellFlatModByLabel.cs new file mode 100644 index 0000000000..8689dd7c8c --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SpellFlatModByLabel.cs @@ -0,0 +1,19 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class SpellFlatModByLabel : ISpellFlatModByLabel + { + public int ModIndex { get; set; } + public int ModifierValue { get; set; } + public int LabelID { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SpellPctModByLabel.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SpellPctModByLabel.cs new file mode 100644 index 0000000000..7ba3bb5b3c --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/SpellPctModByLabel.cs @@ -0,0 +1,19 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class SpellPctModByLabel : ISpellPctModByLabel + { + public int ModIndex { get; set; } + public float ModifierValue { get; set; } + public int LabelID { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/StableInfo.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/StableInfo.cs new file mode 100644 index 0000000000..23133bb85e --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/StableInfo.cs @@ -0,0 +1,18 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class StableInfo : IStableInfo + { + public WowGuid StableMaster { get; set; } + public DynamicUpdateField Pets { get; } = new DynamicUpdateField(); + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/StablePetInfo.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/StablePetInfo.cs new file mode 100644 index 0000000000..c13b7ad1ba --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/StablePetInfo.cs @@ -0,0 +1,25 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class StablePetInfo : IStablePetInfo + { + public System.Nullable PetSlot { get; set; } + public System.Nullable PetNumber { get; set; } + public System.Nullable CreatureID { get; set; } + public System.Nullable DisplayID { get; set; } + public System.Nullable ExperienceLevel { get; set; } + public System.Nullable PetFlags { get; set; } + public System.Nullable Field_96 { get; set; } + public System.Nullable Specialization { get; set; } + public string Name { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/TraitConfig.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/TraitConfig.cs new file mode 100644 index 0000000000..ee1eb52c90 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/TraitConfig.cs @@ -0,0 +1,26 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class TraitConfig : ITraitConfig + { + public System.Nullable ID { get; set; } + public System.Nullable Type { get; set; } + public System.Nullable SkillLineID { get; set; } + public System.Nullable ChrSpecializationID { get; set; } + public System.Nullable CombatConfigFlags { get; set; } + public System.Nullable LocalIdentifier { get; set; } + public System.Nullable TraitSystemID { get; set; } + public DynamicUpdateField Entries { get; } = new DynamicUpdateField(); + public string Name { get; set; } + public DynamicUpdateField SubTrees { get; } = new DynamicUpdateField(); + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/TraitEntry.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/TraitEntry.cs new file mode 100644 index 0000000000..2954626041 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/TraitEntry.cs @@ -0,0 +1,20 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class TraitEntry : ITraitEntry + { + public int TraitNodeID { get; set; } + public int TraitNodeEntryID { get; set; } + public int Rank { get; set; } + public int GrantedRanks { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/TraitSubTreeCache.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/TraitSubTreeCache.cs new file mode 100644 index 0000000000..5f33980dd8 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/TraitSubTreeCache.cs @@ -0,0 +1,19 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class TraitSubTreeCache : ITraitSubTreeCache + { + public int TraitSubTreeID { get; set; } + public ITraitEntry[] Entries { get; set; } + public uint Active { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/UnitAssistActionData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/UnitAssistActionData.cs new file mode 100644 index 0000000000..52ad40cd74 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/UnitAssistActionData.cs @@ -0,0 +1,19 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class UnitAssistActionData : IUnitAssistActionData + { + public System.Nullable Type { get; set; } + public string PlayerName { get; set; } + public System.Nullable VirtualRealmAddress { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/UnitChannel.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/UnitChannel.cs new file mode 100644 index 0000000000..67edb1e83e --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/UnitChannel.cs @@ -0,0 +1,20 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class UnitChannel : IUnitChannel + { + public int SpellID { get; set; } + public int SpellXSpellVisualID { get; set; } + public uint StartTimeMs { get; set; } + public uint Duration { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/UnitData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/UnitData.cs new file mode 100644 index 0000000000..0f772ac7d4 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/UnitData.cs @@ -0,0 +1,154 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class UnitData : IMutableUnitData + { + public System.Nullable Health { get; set; } + public System.Nullable MaxHealth { get; set; } + public System.Nullable DisplayID { get; set; } + public System.Nullable NpcFlags { get; set; } + public System.Nullable NpcFlags2 { get; set; } + public System.Nullable StateSpellVisualID { get; set; } + public System.Nullable StateAnimID { get; set; } + public System.Nullable StateAnimKitID { get; set; } + public System.Nullable StateWorldEffectsQuestObjectiveID { get; set; } = null; + public System.Nullable[] StateWorldEffectIDs { get; set; } + public WowGuid Charm { get; set; } + public WowGuid Summon { get; set; } + public WowGuid Critter { get; set; } + public WowGuid CharmedBy { get; set; } + public WowGuid SummonedBy { get; set; } + public WowGuid CreatedBy { get; set; } + public WowGuid DemonCreator { get; set; } + public WowGuid LookAtControllerTarget { get; set; } + public WowGuid Target { get; set; } + public WowGuid BattlePetCompanionGUID { get; set; } + public System.Nullable BattlePetDBID { get; set; } + public IUnitChannel ChannelData { get; set; } + public System.Nullable SummonedByHomeRealm { get; set; } + public System.Nullable Race { get; set; } + public System.Nullable ClassId { get; set; } + public System.Nullable PlayerClassId { get; set; } + public System.Nullable Sex { get; set; } + public System.Nullable DisplayPower { get; set; } + public System.Nullable OverrideDisplayPowerID { get; set; } + public System.Nullable[] PowerRegenFlatModifier { get; } = new System.Nullable[10]; + public System.Nullable[] PowerRegenInterruptedFlatModifier { get; } = new System.Nullable[10]; + public System.Nullable[] Power { get; } = new System.Nullable[10]; + public System.Nullable[] MaxPower { get; } = new System.Nullable[10]; + public System.Nullable[] ModPowerRegen { get; } = new System.Nullable[10]; + public System.Nullable Level { get; set; } + public System.Nullable EffectiveLevel { get; set; } + public System.Nullable ContentTuningID { get; set; } + public System.Nullable ScalingLevelMin { get; set; } + public System.Nullable ScalingLevelMax { get; set; } + public System.Nullable ScalingLevelDelta { get; set; } + public System.Nullable ScalingFactionGroup { get; set; } + public System.Nullable FactionTemplate { get; set; } + public IVisibleItem[] VirtualItems { get; } = new IVisibleItem[3]; + public System.Nullable Flags { get; set; } + public System.Nullable Flags2 { get; set; } + public System.Nullable Flags3 { get; set; } + public System.Nullable Flags4 { get; set; } + public System.Nullable AuraState { get; set; } + public System.Nullable[] AttackRoundBaseTime { get; } = new System.Nullable[3]; + public System.Nullable RangedAttackRoundBaseTime { get; set; } + public System.Nullable BoundingRadius { get; set; } + public System.Nullable CombatReach { get; set; } + public System.Nullable DisplayScale { get; set; } + public System.Nullable NativeDisplayID { get; set; } + public System.Nullable NativeXDisplayScale { get; set; } + public System.Nullable MountDisplayID { get; set; } + public System.Nullable MinDamage { get; set; } + public System.Nullable MaxDamage { get; set; } + public System.Nullable MinOffHandDamage { get; set; } + public System.Nullable MaxOffHandDamage { get; set; } + public System.Nullable StandState { get; set; } + public System.Nullable PetTalentPoints { get; set; } + public System.Nullable VisFlags { get; set; } + public System.Nullable AnimTier { get; set; } + public System.Nullable PetNumber { get; set; } + public System.Nullable PetNameTimestamp { get; set; } + public System.Nullable PetExperience { get; set; } + public System.Nullable PetNextLevelExperience { get; set; } + public System.Nullable ModCastingSpeed { get; set; } + public System.Nullable ModSpellHaste { get; set; } + public System.Nullable ModHaste { get; set; } + public System.Nullable ModRangedHaste { get; set; } + public System.Nullable ModHasteRegen { get; set; } + public System.Nullable ModTimeRate { get; set; } + public System.Nullable CreatedBySpell { get; set; } + public System.Nullable EmoteState { get; set; } + public System.Nullable TrainingPointsUsed { get; set; } + public System.Nullable TrainingPointsTotal { get; set; } + public System.Nullable[] Stats { get; } = new System.Nullable[5]; + public System.Nullable[] StatPosBuff { get; } = new System.Nullable[5]; + public System.Nullable[] StatNegBuff { get; } = new System.Nullable[5]; + public System.Nullable[] Resistances { get; } = new System.Nullable[7]; + public System.Nullable[] ResistanceBuffModsPositive { get; } = new System.Nullable[7]; + public System.Nullable[] ResistanceBuffModsNegative { get; } = new System.Nullable[7]; + public System.Nullable[] PowerCostModifier { get; } = new System.Nullable[7]; + public System.Nullable[] PowerCostMultiplier { get; } = new System.Nullable[7]; + public System.Nullable BaseMana { get; set; } + public System.Nullable BaseHealth { get; set; } + public System.Nullable SheatheState { get; set; } + public System.Nullable PvpFlags { get; set; } + public System.Nullable PetFlags { get; set; } + public System.Nullable ShapeshiftForm { get; set; } + public System.Nullable AttackPower { get; set; } + public System.Nullable AttackPowerModPos { get; set; } + public System.Nullable AttackPowerModNeg { get; set; } + public System.Nullable AttackPowerMultiplier { get; set; } + public System.Nullable RangedAttackPower { get; set; } + public System.Nullable RangedAttackPowerModPos { get; set; } + public System.Nullable RangedAttackPowerModNeg { get; set; } + public System.Nullable RangedAttackPowerMultiplier { get; set; } + public System.Nullable SetAttackSpeedAura { get; set; } + public System.Nullable Lifesteal { get; set; } + public System.Nullable MinRangedDamage { get; set; } + public System.Nullable MaxRangedDamage { get; set; } + public System.Nullable MaxHealthModifier { get; set; } + public System.Nullable HoverHeight { get; set; } + public System.Nullable MinItemLevelCutoff { get; set; } + public System.Nullable MinItemLevel { get; set; } + public System.Nullable MaxItemLevel { get; set; } + public System.Nullable WildBattlePetLevel { get; set; } + public System.Nullable BattlePetCompanionNameTimestamp { get; set; } + public System.Nullable InteractSpellID { get; set; } + public System.Nullable ScaleDuration { get; set; } + public System.Nullable LooksLikeMountID { get; set; } + public System.Nullable LooksLikeCreatureID { get; set; } + public System.Nullable LookAtControllerID { get; set; } + public System.Nullable PerksVendorItemID { get; set; } + public WowGuid GuildGUID { get; set; } + public WowGuid SkinningOwnerGUID { get; set; } + public System.Nullable FlightCapabilityID { get; set; } + public System.Nullable GlideEventSpeedDivisor { get; set; } + public System.Nullable DriveCapabilityID { get; set; } + public System.Nullable SilencedSchoolMask { get; set; } + public System.Nullable CurrentAreaID { get; set; } + public WowGuid ComboTarget { get; set; } + public System.Nullable Field_2F0 { get; set; } + public System.Nullable Field_2F4 { get; set; } + public IUnitAssistActionData AssistActionData { get; set; } + public DynamicUpdateField PassiveSpells { get; } = new DynamicUpdateField(); + public DynamicUpdateField> WorldEffects { get; } = new DynamicUpdateField>(); + public DynamicUpdateField ChannelObjects { get; } = new DynamicUpdateField(); + public System.Nullable Field_314 { get; set; } + + uint?[] IUnitData.NpcFlags => new[] { NpcFlags, NpcFlags2 }; + + // dummies required by interface + public int? CreatureFamily { get; set; } + public int? CreatureType { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/VendorData.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/VendorData.cs new file mode 100644 index 0000000000..7c850a562c --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/VendorData.cs @@ -0,0 +1,17 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class VendorData : IVendorData + { + public System.Nullable Flags { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/VisibleItem.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/VisibleItem.cs new file mode 100644 index 0000000000..b1d319ac27 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/VisibleItem.cs @@ -0,0 +1,21 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class VisibleItem : IMutableVisibleItem + { + public System.Nullable ItemID { get; set; } + public System.Nullable SecondaryItemModifiedAppearanceID { get; set; } + public System.Nullable ConditionalItemAppearanceID { get; set; } + public System.Nullable ItemAppearanceModID { get; set; } + public System.Nullable ItemVisual { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/VisualAnim.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/VisualAnim.cs new file mode 100644 index 0000000000..b896a2b270 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/VisualAnim.cs @@ -0,0 +1,20 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class VisualAnim : IVisualAnim + { + public System.Nullable AnimationDataID { get; set; } + public System.Nullable AnimKitID { get; set; } + public System.Nullable AnimProgress { get; set; } + public System.Nullable IsDecay { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/WeeklySpellUse.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/WeeklySpellUse.cs new file mode 100644 index 0000000000..d81ab50e6c --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/WeeklySpellUse.cs @@ -0,0 +1,18 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class WeeklySpellUse : IWeeklySpellUse + { + public int SpellCategoryID { get; set; } + public byte Uses { get; set; } + } +} + diff --git a/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ZonePlayerForcedReaction.cs b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ZonePlayerForcedReaction.cs new file mode 100644 index 0000000000..a35c6edc60 --- /dev/null +++ b/WowPacketParserModule.V5_5_0_61735/UpdateFields/V2_5_5_64796/ZonePlayerForcedReaction.cs @@ -0,0 +1,18 @@ +// +// DO NOT EDIT +// + +using System.CodeDom.Compiler; +using WowPacketParser.Misc; +using WowPacketParser.Store.Objects.UpdateFields; + +namespace WowPacketParserModule.V5_5_0_61735.UpdateFields.V2_5_5_64796 +{ + [GeneratedCode("UpdateFieldCodeGenerator.Formats.WowPacketParserHandler", "1.0.0.0")] + public class ZonePlayerForcedReaction : IZonePlayerForcedReaction + { + public System.Nullable FactionID { get; set; } + public System.Nullable Reaction { get; set; } + } +} +