private static MovementInfo ReadMovementUpdateBlock(Packet packet, WowGuid guid, WoWObject obj, object index) { var moveInfo = new MovementInfo(); packet.ResetBitReader(); packet.ReadBit("NoBirthAnim", index); packet.ReadBit("EnablePortals", index); packet.ReadBit("PlayHoverAnim", 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); packet.ReadBit("ThisIsYou", index); var sceneObjCreate = packet.ReadBit("SceneObjCreate", index); var playerCreateData = packet.ReadBit("HasPlayerCreateData", index); if (hasMovementUpdate) { packet.ResetBitReader(); packet.ReadPackedGuid128("MoverGUID", index); packet.ReadUInt32("MoveTime", index); moveInfo.Position = packet.ReadVector3("Position", index); moveInfo.Orientation = packet.ReadSingle("Orientation", index); packet.ReadSingle("Pitch", index); packet.ReadSingle("StepUpStartElevation", index); var removeForcesIDsCount = packet.ReadInt32(); packet.ReadInt32("MoveIndex", index); for (var i = 0; i < removeForcesIDsCount; i++) { packet.ReadPackedGuid128("RemoveForcesIDs", index, i); } moveInfo.Flags = (MovementFlag)packet.ReadBitsE <V6_0_2_19033.Enums.MovementFlag>("Movement Flags", 30, index); moveInfo.FlagsExtra = (MovementFlagExtra)packet.ReadBitsE <Enums.MovementFlags2>("Extra Movement Flags", 18, 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); if (hasTransport) { packet.ResetBitReader(); moveInfo.TransportGuid = packet.ReadPackedGuid128("Transport Guid", index); moveInfo.TransportOffset = packet.ReadVector4("Transport Position", index); var seat = packet.ReadSByte("Transport Seat", index); packet.ReadInt32("Transport Time", index); var hasPrevMoveTime = packet.ReadBit("HasPrevMoveTime", index); var hasVehicleRecID = packet.ReadBit("HasVehicleRecID", index); if (hasPrevMoveTime) { packet.ReadUInt32("PrevMoveTime", index); } if (hasVehicleRecID) { packet.ReadUInt32("VehicleRecID", index); } if (moveInfo.TransportGuid.HasEntry() && moveInfo.TransportGuid.GetHighType() == HighGuidType.Vehicle && guid.HasEntry() && guid.GetHighType() == HighGuidType.Creature) { VehicleTemplateAccessory vehicleAccessory = new VehicleTemplateAccessory { Entry = moveInfo.TransportGuid.GetEntry(), AccessoryEntry = guid.GetEntry(), SeatId = seat }; Storage.VehicleTemplateAccessories.Add(vehicleAccessory, packet.TimeSpan); } } if (hasFall) { packet.ResetBitReader(); packet.ReadUInt32("Fall Time", index); packet.ReadSingle("JumpVelocity", index); var hasFallDirection = packet.ReadBit("Has Fall Direction", index); if (hasFallDirection) { packet.ReadVector2("Fall", index); packet.ReadSingle("Horizontal Speed", index); } } moveInfo.WalkSpeed = packet.ReadSingle("WalkSpeed", index) / 2.5f; 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.ReadInt32("MovementForceCount", index); packet.ResetBitReader(); moveInfo.HasSplineData = packet.ReadBit("HasMovementSpline", index); for (var i = 0; i < movementForceCount; ++i) { packet.ResetBitReader(); packet.ReadPackedGuid128("Id", index); packet.ReadVector3("Origin", index); packet.ReadVector3("Direction", index); packet.ReadInt32("TransportID", index); packet.ReadSingle("Magnitude", index); packet.ReadBits("Type", 2, index); } if (moveInfo.HasSplineData) { packet.ResetBitReader(); packet.ReadInt32("ID", index); packet.ReadVector3("Destination", index); var hasMovementSplineMove = packet.ReadBit("MovementSplineMove", index); if (hasMovementSplineMove) { packet.ResetBitReader(); packet.ReadUInt32E <SplineFlag>("SplineFlags", index); packet.ReadUInt32("Elapsed", index); packet.ReadUInt32("Duration", index); packet.ReadSingle("DurationModifier", index); packet.ReadSingle("NextDurationModifier", index); var face = packet.ReadBits("Face", 2, index); var hasJumpGravity = packet.ReadBit("HasJumpGravity", index); var hasSpecialTime = packet.ReadBit("HasSpecialTime", index); var pointsCount = packet.ReadBits("PointsCount", 16, index); packet.ReadBitsE <SplineMode>("Mode", 2, index); var hasSplineFilterKey = packet.ReadBit("HasSplineFilterKey", index); var hasSpellEffectExtraData = packet.ReadBit("HasSpellEffectExtraData", 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); } if (face == 3) { packet.ReadSingle("FaceDirection", index); } if (face == 2) { packet.ReadPackedGuid128("FaceGUID", index); } if (face == 1) { packet.ReadVector3("FaceSpot", index); } if (hasJumpGravity) { packet.ReadSingle("JumpGravity", index); } if (hasSpecialTime) { packet.ReadInt32("SpecialTime", index); } for (var i = 0; i < pointsCount; ++i) { packet.ReadVector3("Points", index, i); } if (hasSpellEffectExtraData) { packet.ReadPackedGuid128("TargetGUID", index); packet.ReadUInt32("SpellVisualID", index); packet.ReadUInt32("ProgressCurveID", index); packet.ReadUInt32("ParabolicCurveID", 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); } if (hasCombatVictim) { packet.ReadPackedGuid128("CombatVictim Guid", index); } if (hasServerTime) { packet.ReadUInt32("ServerTime", index); } if (hasVehicleCreate) { moveInfo.VehicleId = packet.ReadUInt32("RecID", index); packet.ReadSingle("InitialRawFacing", index); } if (hasAnimKitCreate) { packet.ReadUInt16("AiID", index); packet.ReadUInt16("MovementID", index); packet.ReadUInt16("MeleeID", index); } if (hasRotation) { moveInfo.Rotation = packet.ReadPackedQuaternion("GameObject Rotation", index); } for (var i = 0; i < pauseTimesCount; ++i) { packet.ReadInt32("PauseTimes", index, i); } if (hasMovementTransport) { packet.ResetBitReader(); moveInfo.TransportGuid = packet.ReadPackedGuid128("TransportGUID", index); moveInfo.TransportOffset = packet.ReadVector4("TransportPosition", index); var seat = packet.ReadByte("VehicleSeatIndex", index); packet.ReadUInt32("MoveTime", index); var hasPrevMoveTime = packet.ReadBit("HasPrevMoveTime", index); var hasVehicleRecID = packet.ReadBit("HasVehicleRecID", index); if (hasPrevMoveTime) { packet.ReadUInt32("PrevMoveTime", index); } if (hasVehicleRecID) { packet.ReadInt32("VehicleRecID", index); } if (moveInfo.TransportGuid.HasEntry() && moveInfo.TransportGuid.GetHighType() == HighGuidType.Vehicle && guid.HasEntry() && guid.GetHighType() == HighGuidType.Creature) { VehicleTemplateAccessory vehicleAccessory = new VehicleTemplateAccessory { Entry = moveInfo.TransportGuid.GetEntry(), AccessoryEntry = guid.GetEntry(), SeatId = seat }; Storage.VehicleTemplateAccessories.Add(vehicleAccessory, packet.TimeSpan); } } if (hasAreaTrigger && obj is SpellAreaTrigger) { AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate { Id = guid.GetEntry() }; SpellAreaTrigger spellAreaTrigger = (SpellAreaTrigger)obj; spellAreaTrigger.AreaTriggerId = guid.GetEntry(); packet.ResetBitReader(); // CliAreaTrigger packet.ReadInt32("ElapsedMs", index); packet.ReadVector3("RollPitchYaw1", index); areaTriggerTemplate.Flags = 0; if (packet.ReadBit("HasAbsoluteOrientation", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAbsoluteOrientation; } if (packet.ReadBit("HasDynamicShape", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasDynamicShape; } if (packet.ReadBit("HasAttached", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAttached; } if (packet.ReadBit("HasFaceMovementDir", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.FaceMovementDirection; } if (packet.ReadBit("HasFollowsTerrain", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.FollowsTerrain; } if (packet.ReadBit("Unk bit WoD62x", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk1; } if (packet.ReadBit("HasTargetRollPitchYaw", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.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); if (packet.ReadBit("unkbit4C", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk2; } if (packet.ReadBit("unkbit50", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk3; } if (packet.ReadBit("unkbit58", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk4; } if (packet.ReadBit("HasAreaTriggerSphere", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Sphere; } if (packet.ReadBit("HasAreaTriggerBox", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Box; } if (packet.ReadBit("HasAreaTriggerPolygon", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Polygon; } if (packet.ReadBit("HasAreaTriggerCylinder", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Cylinder; } bool hasAreaTriggerSpline = packet.ReadBit("HasAreaTriggerSpline", index); if (packet.ReadBit("HasAreaTriggerUnkType", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk5; } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.Unk3) != 0) { packet.ReadBit(); } if (hasAreaTriggerSpline) { AreaTriggerHandler.ReadAreaTriggerSpline(packet, index); } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.HasTargetRollPitchYaw) != 0) { packet.ReadVector3("TargetRollPitchYaw", index); } if (hasScaleCurveID) { spellAreaTrigger.ScaleCurveId = packet.ReadInt32("ScaleCurveID", index); } if (hasMorphCurveID) { spellAreaTrigger.MorphCurveId = packet.ReadInt32("MorphCurveID", index); } if (hasFacingCurveID) { spellAreaTrigger.FacingCurveId = packet.ReadInt32("FacingCurveID", index); } if (hasMoveCurveID) { spellAreaTrigger.MoveCurveId = packet.ReadInt32("MoveCurveID", index); } if ((areaTriggerTemplate.Flags & (int)AreaTriggerFlags.Unk2) != 0) { packet.ReadInt32(); } if ((areaTriggerTemplate.Flags & (int)AreaTriggerFlags.Unk4) != 0) { packet.ReadUInt32(); } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Sphere) { areaTriggerTemplate.Data[0] = packet.ReadSingle("Radius", index); areaTriggerTemplate.Data[1] = packet.ReadSingle("RadiusTarget", index); } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Box) { Vector3 Extents = packet.ReadVector3("Extents", index); Vector3 ExtentsTarget = packet.ReadVector3("ExtentsTarget", index); areaTriggerTemplate.Data[0] = Extents.X; areaTriggerTemplate.Data[1] = Extents.Y; areaTriggerTemplate.Data[2] = Extents.Z; areaTriggerTemplate.Data[3] = ExtentsTarget.X; areaTriggerTemplate.Data[4] = ExtentsTarget.Y; areaTriggerTemplate.Data[5] = ExtentsTarget.Z; } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Polygon) { var verticesCount = packet.ReadInt32("VerticesCount", index); var verticesTargetCount = packet.ReadInt32("VerticesTargetCount", index); List <AreaTriggerTemplateVertices> verticesList = new List <AreaTriggerTemplateVertices>(); areaTriggerTemplate.Data[0] = packet.ReadSingle("Height", index); areaTriggerTemplate.Data[1] = packet.ReadSingle("HeightTarget", index); for (uint i = 0; i < verticesCount; ++i) { AreaTriggerTemplateVertices areaTriggerTemplateVertices = new AreaTriggerTemplateVertices { AreaTriggerId = guid.GetEntry(), Idx = i }; Vector2 vertices = packet.ReadVector2("Vertices", index, i); areaTriggerTemplateVertices.VerticeX = vertices.X; areaTriggerTemplateVertices.VerticeY = vertices.Y; verticesList.Add(areaTriggerTemplateVertices); } 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 (AreaTriggerTemplateVertices vertice in verticesList) { Storage.AreaTriggerTemplatesVertices.Add(vertice); } } if (areaTriggerTemplate.Type == (byte)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); } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.Unk5) != 0) { packet.ResetBitReader(); var unk1 = packet.ReadBit("AreaTriggerUnk1"); var hasCenter = packet.ReadBit("HasCenter", index); packet.ReadBit("Unk bit 703 1", index); packet.ReadBit("Unk bit 703 2", index); packet.ReadUInt32(); packet.ReadInt32(); packet.ReadUInt32(); packet.ReadSingle("Radius", index); packet.ReadSingle("BlendFromRadius", index); packet.ReadSingle("InitialAngel", index); packet.ReadSingle("ZOffset", index); if (unk1) { packet.ReadPackedGuid128("AreaTriggerUnkGUID", index); } if (hasCenter) { packet.ReadVector3("Center", index); } } Storage.AreaTriggerTemplates.Add(areaTriggerTemplate); } if (hasGameObject) { packet.ResetBitReader(); packet.ReadInt32("WorldEffectID", index); var bit8 = packet.ReadBit("bit8", index); if (bit8) { packet.ReadInt32("Int1", index); } } if (hasSmoothPhasing) { packet.ResetBitReader(); packet.ReadBit("ReplaceActive", 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) { V6_0_2_19033.Parsers.BattlePetHandler.ReadPetBattleFullUpdate(packet, index); } } if (playerCreateData) { packet.ResetBitReader(); var hasSceneInstanceIDs = packet.ReadBit("ScenePendingInstances", index); var hasRuneState = packet.ReadBit("Runes", index); if (hasSceneInstanceIDs) { var sceneInstanceIDs = packet.ReadInt32("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); } } } return(moveInfo); }
private static MovementInfo ReadMovementUpdateBlock(Packet packet, WowGuid guid, WoWObject obj, object index) { var moveInfo = new MovementInfo(); packet.ResetBitReader(); packet.ReadBit("NoBirthAnim", index); packet.ReadBit("EnablePortals", index); packet.ReadBit("PlayHoverAnim", 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); packet.ReadBit("ThisIsYou", index); var sceneObjCreate = packet.ReadBit("SceneObjCreate", index); var playerCreateData = packet.ReadBit("HasPlayerCreateData", index); var hasConversation = packet.ReadBit("HasConversation", index); if (hasMovementUpdate) { packet.ResetBitReader(); packet.ReadPackedGuid128("MoverGUID", index); packet.ReadUInt32("MoveTime", index); moveInfo.Position = packet.ReadVector3("Position", index); moveInfo.Orientation = packet.ReadSingle("Orientation", index); packet.ReadSingle("Pitch", index); packet.ReadSingle("StepUpStartElevation", index); var removeForcesIDsCount = packet.ReadInt32(); packet.ReadInt32("MoveIndex", index); for (var i = 0; i < removeForcesIDsCount; i++) { packet.ReadPackedGuid128("RemoveForcesIDs", index, i); } moveInfo.Flags = (MovementFlag)packet.ReadBitsE <V6_0_2_19033.Enums.MovementFlag>("Movement Flags", 30, index); moveInfo.FlagsExtra = (MovementFlagExtra)packet.ReadBitsE <Enums.MovementFlags2>("Extra Movement Flags", 18, 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); if (hasTransport) { ReadTransportData(moveInfo, guid, packet, index); } if (hasFall) { packet.ResetBitReader(); packet.ReadUInt32("Fall Time", index); packet.ReadSingle("JumpVelocity", index); var hasFallDirection = packet.ReadBit("Has Fall Direction", index); if (hasFallDirection) { packet.ReadVector2("Fall", index); packet.ReadSingle("Horizontal Speed", index); } } moveInfo.WalkSpeed = packet.ReadSingle("WalkSpeed", index) / 2.5f; 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); if (ClientVersion.AddedInVersion(ClientVersionBuild.V8_1_0_28724)) { packet.ReadSingle("MovementForcesModMagnitude", index); } packet.ResetBitReader(); moveInfo.HasSplineData = packet.ReadBit("HasMovementSpline", index); for (var i = 0; i < movementForceCount; ++i) { packet.ResetBitReader(); packet.ReadPackedGuid128("Id", index); packet.ReadVector3("Origin", index); packet.ReadVector3("Direction", index); packet.ReadUInt32("TransportID", index); packet.ReadSingle("Magnitude", index); packet.ReadBits("Type", 2, index); } if (moveInfo.HasSplineData) { packet.ResetBitReader(); packet.ReadInt32("ID", index); packet.ReadVector3("Destination", index); var hasMovementSplineMove = packet.ReadBit("MovementSplineMove", index); if (hasMovementSplineMove) { packet.ResetBitReader(); packet.ReadUInt32E <SplineFlag>("SplineFlags", index); packet.ReadInt32("Elapsed", index); packet.ReadUInt32("Duration", index); packet.ReadSingle("DurationModifier", index); packet.ReadSingle("NextDurationModifier", index); var face = packet.ReadBits("Face", 2, index); var hasSpecialTime = packet.ReadBit("HasSpecialTime", index); var pointsCount = packet.ReadBits("PointsCount", 16, index); if (ClientVersion.RemovedInVersion(ClientType.Shadowlands)) { packet.ReadBitsE <SplineMode>("Mode", 2, index); } var hasSplineFilterKey = packet.ReadBit("HasSplineFilterKey", index); var hasSpellEffectExtraData = packet.ReadBit("HasSpellEffectExtraData", index); var hasJumpExtraData = packet.ReadBit("HasJumpExtraData", index); var hasAnimationTierTransition = false; var hasUnknown901 = false; if (ClientVersion.AddedInVersion(ClientType.Shadowlands)) { hasAnimationTierTransition = packet.ReadBit("HasAnimationTierTransition", index); hasUnknown901 = packet.ReadBit("Unknown901", 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: packet.ReadVector3("FaceSpot", index); break; case 2: packet.ReadPackedGuid128("FaceGUID", index); break; case 3: packet.ReadSingle("FaceDirection", index); break; default: break; } if (hasSpecialTime) { packet.ReadUInt32("SpecialTime", index); } for (var i = 0; i < pointsCount; ++i) { packet.ReadVector3("Points", index, i); } if (hasSpellEffectExtraData) { MovementHandler.ReadMonsterSplineSpellEffectExtraData(packet, index); } if (hasJumpExtraData) { MovementHandler.ReadMonsterSplineJumpExtraData(packet, index); } if (hasAnimationTierTransition) { packet.ReadInt32("TierTransitionID", index); packet.ReadInt32("StartTime", index); packet.ReadInt32("EndTime", index); packet.ReadByte("AnimTier", index); } if (hasUnknown901) { for (var i = 0; i < 16; ++i) { packet.ReadInt32("Unknown1", index, "Unknown901", i); packet.ReadInt32("Unknown2", index, "Unknown901", i); packet.ReadInt32("Unknown3", index, "Unknown901", i); packet.ReadInt32("Unknown4", index, "Unknown901", i); } } } } } 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); } if (hasCombatVictim) { packet.ReadPackedGuid128("CombatVictim Guid", index); } if (hasServerTime) { packet.ReadUInt32("ServerTime", index); } if (hasVehicleCreate) { moveInfo.VehicleId = (uint)packet.ReadInt32("RecID", index); 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) { moveInfo.Rotation = packet.ReadPackedQuaternion("GameObject Rotation", index); } for (var i = 0; i < pauseTimesCount; ++i) { packet.ReadUInt32("PauseTimes", index, i); } if (hasMovementTransport) { ReadTransportData(moveInfo, guid, packet, index); } if (hasAreaTrigger && obj is SpellAreaTrigger) { AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate { Id = guid.GetEntry() }; SpellAreaTrigger spellAreaTrigger = (SpellAreaTrigger)obj; spellAreaTrigger.AreaTriggerId = guid.GetEntry(); packet.ResetBitReader(); // CliAreaTrigger packet.ReadUInt32("ElapsedMs", index); packet.ReadVector3("RollPitchYaw1", index); areaTriggerTemplate.Flags = 0; if (packet.ReadBit("HasAbsoluteOrientation", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAbsoluteOrientation; } if (packet.ReadBit("HasDynamicShape", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasDynamicShape; } if (packet.ReadBit("HasAttached", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAttached; } if (packet.ReadBit("HasFaceMovementDir", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.FaceMovementDirection; } if (packet.ReadBit("HasFollowsTerrain", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.FollowsTerrain; } if (packet.ReadBit("Unk bit WoD62x", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk1; } if (packet.ReadBit("HasTargetRollPitchYaw", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.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); if (packet.ReadBit("HasAnimID", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAnimId; } if (packet.ReadBit("HasAnimKitID", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAnimKitId; } if (packet.ReadBit("unkbit50", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk3; } bool hasUnk801 = packet.ReadBit("unkbit801", index); if (packet.ReadBit("HasAreaTriggerSphere", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Sphere; } if (packet.ReadBit("HasAreaTriggerBox", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Box; } if (packet.ReadBit("HasAreaTriggerPolygon", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Polygon; } if (packet.ReadBit("HasAreaTriggerCylinder", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Cylinder; } bool hasAreaTriggerSpline = packet.ReadBit("HasAreaTriggerSpline", index); if (packet.ReadBit("HasAreaTriggerCircularMovement", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasCircularMovement; } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.Unk3) != 0) { packet.ReadBit(); } if (hasAreaTriggerSpline) { AreaTriggerHandler.ReadAreaTriggerSpline(packet, index); } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.HasTargetRollPitchYaw) != 0) { packet.ReadVector3("TargetRollPitchYaw", index); } if (hasScaleCurveID) { spellAreaTrigger.ScaleCurveId = (int)packet.ReadUInt32("ScaleCurveID", index); } if (hasMorphCurveID) { spellAreaTrigger.MorphCurveId = (int)packet.ReadUInt32("MorphCurveID", index); } if (hasFacingCurveID) { spellAreaTrigger.FacingCurveId = (int)packet.ReadUInt32("FacingCurveID", index); } if (hasMoveCurveID) { spellAreaTrigger.MoveCurveId = (int)packet.ReadUInt32("MoveCurveID", index); } if ((areaTriggerTemplate.Flags & (int)AreaTriggerFlags.HasAnimId) != 0) { spellAreaTrigger.AnimId = packet.ReadInt32("AnimId", index); } if ((areaTriggerTemplate.Flags & (int)AreaTriggerFlags.HasAnimKitId) != 0) { spellAreaTrigger.AnimKitId = packet.ReadInt32("AnimKitId", index); } if (hasUnk801) { packet.ReadUInt32("Unk801", index); } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Sphere) { areaTriggerTemplate.Data[0] = packet.ReadSingle("Radius", index); areaTriggerTemplate.Data[1] = packet.ReadSingle("RadiusTarget", index); } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Box) { Vector3 Extents = packet.ReadVector3("Extents", index); Vector3 ExtentsTarget = packet.ReadVector3("ExtentsTarget", index); areaTriggerTemplate.Data[0] = Extents.X; areaTriggerTemplate.Data[1] = Extents.Y; areaTriggerTemplate.Data[2] = Extents.Z; areaTriggerTemplate.Data[3] = ExtentsTarget.X; areaTriggerTemplate.Data[4] = ExtentsTarget.Y; areaTriggerTemplate.Data[5] = ExtentsTarget.Z; } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Polygon) { var verticesCount = packet.ReadUInt32("VerticesCount", index); var verticesTargetCount = packet.ReadUInt32("VerticesTargetCount", index); List <AreaTriggerTemplateVertices> verticesList = new List <AreaTriggerTemplateVertices>(); areaTriggerTemplate.Data[0] = packet.ReadSingle("Height", index); areaTriggerTemplate.Data[1] = packet.ReadSingle("HeightTarget", index); for (uint i = 0; i < verticesCount; ++i) { AreaTriggerTemplateVertices areaTriggerTemplateVertices = new AreaTriggerTemplateVertices { AreaTriggerId = guid.GetEntry(), Idx = i }; Vector2 vertices = packet.ReadVector2("Vertices", index, i); areaTriggerTemplateVertices.VerticeX = vertices.X; areaTriggerTemplateVertices.VerticeY = vertices.Y; verticesList.Add(areaTriggerTemplateVertices); } 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 (AreaTriggerTemplateVertices vertice in verticesList) { Storage.AreaTriggerTemplatesVertices.Add(vertice); } } if (areaTriggerTemplate.Type == (byte)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); } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.HasCircularMovement) != 0) { packet.ResetBitReader(); var hasPathTarget = packet.ReadBit("HasPathTarget"); var hasCenter = packet.ReadBit("HasCenter", index); packet.ReadBit("CounterClockwise", index); packet.ReadBit("CanLoop", index); packet.ReadUInt32("TimeToTarget", index); packet.ReadInt32("ElapsedTimeForMovement", index); packet.ReadUInt32("StartDelay", index); packet.ReadSingle("Radius", index); packet.ReadSingle("BlendFromRadius", index); packet.ReadSingle("InitialAngel", index); packet.ReadSingle("ZOffset", index); if (hasPathTarget) { packet.ReadPackedGuid128("PathTarget", index); } if (hasCenter) { packet.ReadVector3("Center", index); } } 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 bit8 = packet.ReadBit("bit8", index); if (bit8) { packet.ReadUInt32("Int1", index); } } if (hasSmoothPhasing) { packet.ResetBitReader(); packet.ReadBit("ReplaceActive", index); if (ClientVersion.AddedInVersion(ClientType.Shadowlands)) { 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) { V6_0_2_19033.Parsers.BattlePetHandler.ReadPetBattleFullUpdate(packet, index); } } if (playerCreateData) { packet.ResetBitReader(); var hasSceneInstanceIDs = packet.ReadBit("ScenePendingInstances", index); var hasRuneState = packet.ReadBit("Runes", 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 (hasConversation) { packet.ResetBitReader(); if (packet.ReadBit("HasTextureKitID", index)) { (obj as ConversationTemplate).TextureKitId = packet.ReadUInt32("TextureKitID", index); } } return(moveInfo); }
public void LoadAreaTriggerTemplates() { uint oldMSTime = Time.GetMSTime(); MultiMap <uint, Vector2> verticesByAreaTrigger = new MultiMap <uint, Vector2>(); MultiMap <uint, Vector2> verticesTargetByAreaTrigger = new MultiMap <uint, Vector2>(); MultiMap <uint, Vector3> splinesBySpellMisc = new MultiMap <uint, Vector3>(); MultiMap <uint, AreaTriggerAction> actionsByAreaTrigger = new MultiMap <uint, AreaTriggerAction>(); // 0 1 2 3 SQLResult templateActions = DB.World.Query("SELECT AreaTriggerId, ActionType, ActionParam, TargetType FROM `areatrigger_template_actions`"); if (!templateActions.IsEmpty()) { do { uint areaTriggerId = templateActions.Read <uint>(0); AreaTriggerAction action; action.Param = templateActions.Read <uint>(2); action.ActionType = (AreaTriggerActionTypes)templateActions.Read <uint>(1); action.TargetType = (AreaTriggerActionUserTypes)templateActions.Read <uint>(3); if (action.ActionType >= AreaTriggerActionTypes.Max) { Log.outError(LogFilter.Sql, "Table `areatrigger_template_actions` has invalid ActionType ({0}) for AreaTriggerId {1} and Param {2}", action.ActionType, areaTriggerId, action.Param); continue; } if (action.TargetType >= AreaTriggerActionUserTypes.Max) { Log.outError(LogFilter.Sql, "Table `areatrigger_template_actions` has invalid TargetType ({0}) for AreaTriggerId {1} and Param {2}", action.TargetType, areaTriggerId, action.Param); continue; } actionsByAreaTrigger.Add(areaTriggerId, action); }while (templateActions.NextRow()); } else { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates actions. DB table `areatrigger_template_actions` is empty."); } // 0 1 2 3 4 5 SQLResult vertices = DB.World.Query("SELECT AreaTriggerId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `areatrigger_template_polygon_vertices` ORDER BY `AreaTriggerId`, `Idx`"); if (!vertices.IsEmpty()) { do { uint areaTriggerId = vertices.Read <uint>(0); verticesByAreaTrigger.Add(areaTriggerId, new Vector2(vertices.Read <float>(2), vertices.Read <float>(3))); if (!vertices.IsNull(4) && !vertices.IsNull(5)) { verticesTargetByAreaTrigger.Add(areaTriggerId, new Vector2(vertices.Read <float>(4), vertices.Read <float>(5))); } else if (vertices.IsNull(4) != vertices.IsNull(5)) { Log.outError(LogFilter.Sql, "Table `areatrigger_template_polygon_vertices` has listed invalid target vertices (AreaTrigger: {0}, Index: {1}).", areaTriggerId, vertices.Read <uint>(1)); } }while (vertices.NextRow()); } else { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates polygon vertices. DB table `areatrigger_template_polygon_vertices` is empty."); } // 0 1 2 3 SQLResult splines = DB.World.Query("SELECT SpellMiscId, X, Y, Z FROM `spell_areatrigger_splines` ORDER BY `SpellMiscId`, `Idx`"); if (!splines.IsEmpty()) { do { uint spellMiscId = splines.Read <uint>(0); Vector3 spline = new Vector3(splines.Read <float>(1), splines.Read <float>(2), splines.Read <float>(3)); splinesBySpellMisc.Add(spellMiscId, spline); }while (splines.NextRow()); } else { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates splines. DB table `spell_areatrigger_splines` is empty."); } // 0 1 2 3 4 5 6 7 8 9 SQLResult templates = DB.World.Query("SELECT Id, Type, Flags, Data0, Data1, Data2, Data3, Data4, Data5, ScriptName FROM `areatrigger_template`"); if (!templates.IsEmpty()) { do { AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate(); areaTriggerTemplate.Id = templates.Read <uint>(0); AreaTriggerTypes type = (AreaTriggerTypes)templates.Read <byte>(1); if (type >= AreaTriggerTypes.Max) { Log.outError(LogFilter.Sql, "Table `areatrigger_template` has listed areatrigger (Id: {0}) with invalid type {1}.", areaTriggerTemplate.Id, type); continue; } areaTriggerTemplate.TriggerType = type; areaTriggerTemplate.Flags = (AreaTriggerFlags)templates.Read <uint>(2); unsafe { fixed(float *b = areaTriggerTemplate.DefaultDatas.Data) { for (byte i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i) { b[i] = templates.Read <float>(3 + i); } } } areaTriggerTemplate.ScriptId = Global.ObjectMgr.GetScriptId(templates.Read <string>(9)); areaTriggerTemplate.PolygonVertices = verticesByAreaTrigger[areaTriggerTemplate.Id]; areaTriggerTemplate.PolygonVerticesTarget = verticesTargetByAreaTrigger[areaTriggerTemplate.Id]; areaTriggerTemplate.Actions = actionsByAreaTrigger[areaTriggerTemplate.Id]; areaTriggerTemplate.InitMaxSearchRadius(); _areaTriggerTemplateStore[areaTriggerTemplate.Id] = areaTriggerTemplate; }while (templates.NextRow()); } // 0 1 2 3 4 5 6 7 8 SQLResult areatriggerSpellMiscs = DB.World.Query("SELECT SpellMiscId, AreaTriggerId, MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, DecalPropertiesId, TimeToTarget, TimeToTargetScale FROM `spell_areatrigger`"); if (!areatriggerSpellMiscs.IsEmpty()) { do { AreaTriggerMiscTemplate miscTemplate = new AreaTriggerMiscTemplate(); miscTemplate.MiscId = areatriggerSpellMiscs.Read <uint>(0); uint areatriggerId = areatriggerSpellMiscs.Read <uint>(1); miscTemplate.Template = GetAreaTriggerTemplate(areatriggerId); if (miscTemplate.Template == null) { Log.outError(LogFilter.Sql, "Table `spell_areatrigger` reference invalid AreaTriggerId {0} for miscId {1}", areatriggerId, miscTemplate.MiscId); continue; } uint ValidateAndSetCurve(uint value) { if (value != 0 && !CliDB.CurveStorage.ContainsKey(value)) { Log.outError(LogFilter.Sql, "Table `spell_areatrigger` has listed areatrigger (MiscId: {0}, Id: {1}) with invalid Curve ({2}), set to 0!", miscTemplate.MiscId, areatriggerId, value); return(0); } return(value); } miscTemplate.MoveCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(2)); miscTemplate.ScaleCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(3)); miscTemplate.MorphCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(4)); miscTemplate.FacingCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(5)); miscTemplate.DecalPropertiesId = areatriggerSpellMiscs.Read <uint>(6); miscTemplate.TimeToTarget = areatriggerSpellMiscs.Read <uint>(7); miscTemplate.TimeToTargetScale = areatriggerSpellMiscs.Read <uint>(8); miscTemplate.SplinePoints = splinesBySpellMisc[miscTemplate.MiscId]; _areaTriggerTemplateSpellMisc[miscTemplate.MiscId] = miscTemplate; }while (areatriggerSpellMiscs.NextRow()); } else { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Spell AreaTrigger templates. DB table `spell_areatrigger` is empty."); } Log.outInfo(LogFilter.ServerLoading, "Loaded {0} spell areatrigger templates in {1} ms.", _areaTriggerTemplateStore.Count, Time.GetMSTimeDiffToNow(oldMSTime)); }
private static MovementInfo ReadMovementUpdateBlock(Packet packet, CreateObject createObject, WowGuid guid, WoWObject obj, object index) { var moveInfo = new MovementInfo(); packet.ResetBitReader(); packet.ReadBit("NoBirthAnim", index); packet.ReadBit("EnablePortals", index); packet.ReadBit("PlayHoverAnim", 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); packet.ReadBit("ThisIsYou", 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); 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); } moveInfo.Flags = (MovementFlag)packet.ReadBitsE <V6_0_2_19033.Enums.MovementFlag>("Movement Flags", 30, index); moveInfo.FlagsExtra = (MovementFlagExtra)packet.ReadBitsE <V8_0_1_27101.Enums.MovementFlags2>("Extra Movement Flags", 18, 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); if (hasTransport) { movementUpdate.Transport = V8_0_1_27101.Parsers.UpdateHandler.ReadTransportData(moveInfo, guid, packet, index); } 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); } } 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.ReadInt32("MovementForceCount", index); packet.ResetBitReader(); moveInfo.HasSplineData = packet.ReadBit("HasMovementSpline", index); for (var i = 0; i < movementForceCount; ++i) { packet.ResetBitReader(); packet.ReadPackedGuid128("Id", index); packet.ReadVector3("Origin", index); packet.ReadVector3("Direction", index); packet.ReadInt32("TransportID", index); packet.ReadSingle("Magnitude", index); packet.ReadBits("Type", 2, index); } 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 splineMove = splineData.MoveData = new(); packet.ResetBitReader(); splineMove.Flags = packet.ReadUInt32E <SplineFlag>("SplineFlags", index).ToUniversal(); splineMove.Elapsed = packet.ReadInt32("Elapsed", index); splineMove.Duration = packet.ReadUInt32("Duration", index); splineMove.DurationModifier = packet.ReadSingle("DurationModifier", index); splineMove.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); packet.ReadBitsE <SplineMode>("Mode", 2, index); var hasSplineFilterKey = packet.ReadBit("HasSplineFilterKey", index); var hasSpellEffectExtraData = packet.ReadBit("HasSpellEffectExtraData", index); var hasJumpExtraData = packet.ReadBit("HasJumpExtraData", 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: splineMove.LookPosition = packet.ReadVector3("FaceSpot", index); break; case 2: splineMove.LookTarget = new() { Target = packet.ReadPackedGuid128("FaceGUID", index) }; break; case 3: splineMove.LookOrientation = packet.ReadSingle("FaceDirection", index); break; default: break; } if (hasSpecialTime) { packet.ReadUInt32("SpecialTime", index); } for (var i = 0; i < pointsCount; ++i) { splineMove.Points.Add(packet.ReadVector3("Points", index, i)); } if (hasSpellEffectExtraData) { V8_0_1_27101.Parsers.MovementHandler.ReadMonsterSplineSpellEffectExtraData(packet, index); } if (hasJumpExtraData) { splineMove.Jump = V8_0_1_27101.Parsers.MovementHandler.ReadMonsterSplineJumpExtraData(packet, 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 = packet.ReadUInt32("RecID", index); vehicle.VehicleId = (int)moveInfo.VehicleId; vehicle.InitialRawFacing = packet.ReadSingle("InitialRawFacing", index); } if (hasAnimKitCreate) { packet.ReadUInt16("AiID", index); packet.ReadUInt16("MovementID", index); packet.ReadUInt16("MeleeID", index); } if (hasRotation) { createObject.Rotation = moveInfo.Rotation = packet.ReadPackedQuaternion("GameObject Rotation", index); } for (var i = 0; i < pauseTimesCount; ++i) { packet.ReadInt32("PauseTimes", index, i); } if (hasMovementTransport) { var transport = createObject.Transport = new(); packet.ResetBitReader(); transport.TransportGuid = moveInfo.TransportGuid = packet.ReadPackedGuid128("TransportGUID", index); transport.Position = moveInfo.TransportOffset = 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.TransportGuid.HasEntry() && moveInfo.TransportGuid.GetHighType() == HighGuidType.Vehicle && guid.HasEntry() && guid.GetHighType() == HighGuidType.Creature) { VehicleTemplateAccessory vehicleAccessory = new VehicleTemplateAccessory { Entry = moveInfo.TransportGuid.GetEntry(), AccessoryEntry = guid.GetEntry(), SeatId = seat }; Storage.VehicleTemplateAccessories.Add(vehicleAccessory, packet.TimeSpan); } } if (hasAreaTrigger && obj is AreaTriggerCreateProperties) { AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate { Id = guid.GetEntry() }; AreaTriggerCreateProperties spellAreaTrigger = (AreaTriggerCreateProperties)obj; spellAreaTrigger.AreaTriggerId = guid.GetEntry(); packet.ResetBitReader(); // CliAreaTrigger packet.ReadUInt32("ElapsedMs", index); packet.ReadVector3("RollPitchYaw", index); areaTriggerTemplate.Flags = 0; if (packet.ReadBit("HasAbsoluteOrientation", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAbsoluteOrientation; } if (packet.ReadBit("HasDynamicShape", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasDynamicShape; } if (packet.ReadBit("HasAttached", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAttached; } if (packet.ReadBit("HasFaceMovementDir", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.FaceMovementDirection; } if (packet.ReadBit("HasFollowsTerrain", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.FollowsTerrain; } if (packet.ReadBit("Unk bit WoD62x", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk1; } if (packet.ReadBit("HasTargetRollPitchYaw", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.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); if (packet.ReadBit("HasAnimID", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAnimId; } if (packet.ReadBit("HasAnimKitID", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAnimKitId; } if (packet.ReadBit("unkbit50", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk3; } bool hasAnimProgress = packet.ReadBit("HasAnimProgress", index); if (packet.ReadBit("HasAreaTriggerSphere", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Sphere; } if (packet.ReadBit("HasAreaTriggerBox", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Box; } if (packet.ReadBit("HasAreaTriggerPolygon", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Polygon; } if (packet.ReadBit("HasAreaTriggerCylinder", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Cylinder; } bool hasAreaTriggerSpline = packet.ReadBit("HasAreaTriggerSpline", index); if (packet.ReadBit("HasAreaTriggerOrbit", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasOrbit; } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.Unk3) != 0) { packet.ReadBit(); } if (hasAreaTriggerSpline) { foreach (var splinePoint in V7_0_3_22248.Parsers.AreaTriggerHandler.ReadAreaTriggerSpline((AreaTriggerCreateProperties)obj, packet, index, "AreaTriggerSpline")) { Storage.AreaTriggerCreatePropertiesSplinePoints.Add(splinePoint); } } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.HasTargetRollPitchYaw) != 0) { packet.ReadVector3("TargetRollPitchYaw", index); } if (hasScaleCurveID) { spellAreaTrigger.ScaleCurveId = (int)packet.ReadUInt32("ScaleCurveID", index); } if (hasMorphCurveID) { spellAreaTrigger.MorphCurveId = (int)packet.ReadUInt32("MorphCurveID", index); } if (hasFacingCurveID) { spellAreaTrigger.FacingCurveId = (int)packet.ReadUInt32("FacingCurveID", index); } if (hasMoveCurveID) { spellAreaTrigger.MoveCurveId = (int)packet.ReadUInt32("MoveCurveID", index); } if ((areaTriggerTemplate.Flags & (int)AreaTriggerFlags.HasAnimId) != 0) { spellAreaTrigger.AnimId = packet.ReadInt32("AnimId", index); } if ((areaTriggerTemplate.Flags & (int)AreaTriggerFlags.HasAnimKitId) != 0) { spellAreaTrigger.AnimKitId = packet.ReadInt32("AnimKitId", index); } if (hasAnimProgress) { packet.ReadUInt32("AnimProgress", index); } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Sphere) { areaTriggerTemplate.Data[0] = packet.ReadSingle("Radius", index); areaTriggerTemplate.Data[1] = packet.ReadSingle("RadiusTarget", index); } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Box) { Vector3 Extents = packet.ReadVector3("Extents", index); Vector3 ExtentsTarget = packet.ReadVector3("ExtentsTarget", index); areaTriggerTemplate.Data[0] = Extents.X; areaTriggerTemplate.Data[1] = Extents.Y; areaTriggerTemplate.Data[2] = Extents.Z; areaTriggerTemplate.Data[3] = ExtentsTarget.X; areaTriggerTemplate.Data[4] = ExtentsTarget.Y; areaTriggerTemplate.Data[5] = ExtentsTarget.Z; } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Polygon) { var verticesCount = packet.ReadUInt32("VerticesCount", index); var verticesTargetCount = packet.ReadUInt32("VerticesTargetCount", index); List <AreaTriggerCreatePropertiesPolygonVertex> verticesList = new List <AreaTriggerCreatePropertiesPolygonVertex>(); 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); } } if (areaTriggerTemplate.Type == (byte)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); } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.HasOrbit) != 0) { Storage.AreaTriggerCreatePropertiesOrbits.Add(V7_0_3_22248.Parsers.AreaTriggerHandler.ReadAreaTriggerOrbit(guid, packet, index, "AreaTriggerOrbit")); } spellAreaTrigger.Shape = areaTriggerTemplate.Type; Array.Copy(areaTriggerTemplate.Data, spellAreaTrigger.ShapeData, Math.Min(areaTriggerTemplate.Data.Length, spellAreaTrigger.ShapeData.Length)); Storage.AreaTriggerTemplates.Add(areaTriggerTemplate); } if (hasGameObject) { packet.ResetBitReader(); packet.ReadInt32("WorldEffectID", index); var bit8 = packet.ReadBit("bit8", index); if (bit8) { packet.ReadInt32("Int1", index); } } if (hasSmoothPhasing) { packet.ResetBitReader(); packet.ReadBit("ReplaceActive", 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) { V6_0_2_19033.Parsers.BattlePetHandler.ReadPetBattleFullUpdate(packet, index); } } if (playerCreateData) { packet.ResetBitReader(); var hasSceneInstanceIDs = packet.ReadBit("ScenePendingInstances", index); var hasRuneState = packet.ReadBit("Runes", index); var hasActionButtons = packet.ReadBit("Unk1132", index); if (hasSceneInstanceIDs) { var sceneInstanceIDs = packet.ReadInt32("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 < 132; i++) { packet.ReadInt32("Action", index, i); } } } if (hasConversation) { packet.ResetBitReader(); if (packet.ReadBit("HasTextureKitID", index)) { (obj as ConversationTemplate).TextureKitId = packet.ReadUInt32("TextureKitID", index); } } return(moveInfo); } }
public void LoadAreaTriggerTemplates() { uint oldMSTime = Time.GetMSTime(); MultiMap <uint, Vector2> verticesByAreaTrigger = new MultiMap <uint, Vector2>(); MultiMap <uint, Vector2> verticesTargetByAreaTrigger = new MultiMap <uint, Vector2>(); MultiMap <uint, Vector3> splinesBySpellMisc = new MultiMap <uint, Vector3>(); MultiMap <AreaTriggerId, AreaTriggerAction> actionsByAreaTrigger = new MultiMap <AreaTriggerId, AreaTriggerAction>(); // 0 1 2 3 4 SQLResult templateActions = DB.World.Query("SELECT AreaTriggerId, IsServerSide, ActionType, ActionParam, TargetType FROM `areatrigger_template_actions`"); if (!templateActions.IsEmpty()) { do { AreaTriggerId areaTriggerId = new(templateActions.Read <uint>(0), templateActions.Read <byte>(1) == 1); AreaTriggerAction action; action.Param = templateActions.Read <uint>(3); action.ActionType = (AreaTriggerActionTypes)templateActions.Read <uint>(2); action.TargetType = (AreaTriggerActionUserTypes)templateActions.Read <uint>(4); if (action.ActionType >= AreaTriggerActionTypes.Max) { Log.outError(LogFilter.Sql, $"Table `areatrigger_template_actions` has invalid ActionType ({action.ActionType}, IsServerSide: {areaTriggerId.IsServerSide}) for AreaTriggerId {areaTriggerId.Id} and Param {action.Param}"); continue; } if (action.TargetType >= AreaTriggerActionUserTypes.Max) { Log.outError(LogFilter.Sql, $"Table `areatrigger_template_actions` has invalid TargetType ({action.TargetType}, IsServerSide: {areaTriggerId.IsServerSide}) for AreaTriggerId {areaTriggerId} and Param {action.Param}"); continue; } if (action.ActionType == AreaTriggerActionTypes.Teleport) { if (Global.ObjectMgr.GetWorldSafeLoc(action.Param) == null) { Log.outError(LogFilter.Sql, $"Table `areatrigger_template_actions` has invalid (Id: {areaTriggerId}, IsServerSide: {areaTriggerId.IsServerSide}) with TargetType=Teleport and Param ({action.Param}) not a valid world safe loc entry"); continue; } } actionsByAreaTrigger.Add(areaTriggerId, action); }while (templateActions.NextRow()); } else { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates actions. DB table `areatrigger_template_actions` is empty."); } // 0 1 2 3 4 5 SQLResult vertices = DB.World.Query("SELECT AreaTriggerId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `areatrigger_template_polygon_vertices` ORDER BY `AreaTriggerId`, `Idx`"); if (!vertices.IsEmpty()) { do { uint areaTriggerId = vertices.Read <uint>(0); verticesByAreaTrigger.Add(areaTriggerId, new Vector2(vertices.Read <float>(2), vertices.Read <float>(3))); if (!vertices.IsNull(4) && !vertices.IsNull(5)) { verticesTargetByAreaTrigger.Add(areaTriggerId, new Vector2(vertices.Read <float>(4), vertices.Read <float>(5))); } else if (vertices.IsNull(4) != vertices.IsNull(5)) { Log.outError(LogFilter.Sql, "Table `areatrigger_template_polygon_vertices` has listed invalid target vertices (AreaTrigger: {0}, Index: {1}).", areaTriggerId, vertices.Read <uint>(1)); } }while (vertices.NextRow()); } else { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates polygon vertices. DB table `areatrigger_template_polygon_vertices` is empty."); } // 0 1 2 3 SQLResult splines = DB.World.Query("SELECT SpellMiscId, X, Y, Z FROM `spell_areatrigger_splines` ORDER BY `SpellMiscId`, `Idx`"); if (!splines.IsEmpty()) { do { uint spellMiscId = splines.Read <uint>(0); Vector3 spline = new Vector3(splines.Read <float>(1), splines.Read <float>(2), splines.Read <float>(3)); splinesBySpellMisc.Add(spellMiscId, spline); }while (splines.NextRow()); } else { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates splines. DB table `spell_areatrigger_splines` is empty."); } // 0 1 2 3 4 5 6 7 8 9 10 SQLResult templates = DB.World.Query("SELECT Id, IsServerSide, Type, Flags, Data0, Data1, Data2, Data3, Data4, Data5, ScriptName FROM `areatrigger_template`"); if (!templates.IsEmpty()) { do { AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate(); areaTriggerTemplate.Id = new(templates.Read <uint>(0), templates.Read <byte>(1) == 1); AreaTriggerTypes type = (AreaTriggerTypes)templates.Read <byte>(2); if (type >= AreaTriggerTypes.Max) { Log.outError(LogFilter.Sql, $"Table `areatrigger_template` has listed areatrigger (Id: {areaTriggerTemplate.Id.Id}, IsServerSide: {areaTriggerTemplate.Id.IsServerSide}) with invalid type {type}."); continue; } areaTriggerTemplate.TriggerType = type; areaTriggerTemplate.Flags = (AreaTriggerFlags)templates.Read <uint>(3); if (areaTriggerTemplate.Id.IsServerSide && areaTriggerTemplate.Flags != 0) { Log.outError(LogFilter.Sql, $"Table `areatrigger_template` has listed server-side areatrigger (Id: {areaTriggerTemplate.Id.Id}, IsServerSide: {areaTriggerTemplate.Id.IsServerSide}) with none-zero flags"); continue; } unsafe { for (byte i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i) { areaTriggerTemplate.DefaultDatas.Data[i] = templates.Read <float>(4 + i); } } areaTriggerTemplate.ScriptId = Global.ObjectMgr.GetScriptId(templates.Read <string>(10)); if (!areaTriggerTemplate.Id.IsServerSide) { areaTriggerTemplate.PolygonVertices = verticesByAreaTrigger[areaTriggerTemplate.Id.Id]; areaTriggerTemplate.PolygonVerticesTarget = verticesTargetByAreaTrigger[areaTriggerTemplate.Id.Id]; } areaTriggerTemplate.Actions = actionsByAreaTrigger[areaTriggerTemplate.Id]; areaTriggerTemplate.InitMaxSearchRadius(); _areaTriggerTemplateStore[areaTriggerTemplate.Id] = areaTriggerTemplate; }while (templates.NextRow()); } // 0 1 2 3 4 5 6 7 8 9 10 SQLResult areatriggerSpellMiscs = DB.World.Query("SELECT SpellMiscId, AreaTriggerId, MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, AnimId, AnimKitId, DecalPropertiesId, TimeToTarget, TimeToTargetScale FROM `spell_areatrigger`"); if (!areatriggerSpellMiscs.IsEmpty()) { do { AreaTriggerMiscTemplate miscTemplate = new AreaTriggerMiscTemplate(); miscTemplate.MiscId = areatriggerSpellMiscs.Read <uint>(0); uint areatriggerId = areatriggerSpellMiscs.Read <uint>(1); miscTemplate.Template = GetAreaTriggerTemplate(new AreaTriggerId(areatriggerId, false)); if (miscTemplate.Template == null) { Log.outError(LogFilter.Sql, "Table `spell_areatrigger` reference invalid AreaTriggerId {0} for miscId {1}", areatriggerId, miscTemplate.MiscId); continue; } uint ValidateAndSetCurve(uint value) { if (value != 0 && !CliDB.CurveStorage.ContainsKey(value)) { Log.outError(LogFilter.Sql, "Table `spell_areatrigger` has listed areatrigger (MiscId: {0}, Id: {1}) with invalid Curve ({2}), set to 0!", miscTemplate.MiscId, areatriggerId, value); return(0); } return(value); } miscTemplate.MoveCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(2)); miscTemplate.ScaleCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(3)); miscTemplate.MorphCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(4)); miscTemplate.FacingCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(5)); miscTemplate.AnimId = areatriggerSpellMiscs.Read <uint>(6); miscTemplate.AnimKitId = areatriggerSpellMiscs.Read <uint>(7); miscTemplate.DecalPropertiesId = areatriggerSpellMiscs.Read <uint>(8); miscTemplate.TimeToTarget = areatriggerSpellMiscs.Read <uint>(9); miscTemplate.TimeToTargetScale = areatriggerSpellMiscs.Read <uint>(10); miscTemplate.SplinePoints = splinesBySpellMisc[miscTemplate.MiscId]; _areaTriggerTemplateSpellMisc[miscTemplate.MiscId] = miscTemplate; }while (areatriggerSpellMiscs.NextRow()); } else { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Spell AreaTrigger templates. DB table `spell_areatrigger` is empty."); } // 0 1 2 3 4 5 6 7 SQLResult circularMovementInfos = DB.World.Query("SELECT SpellMiscId, StartDelay, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `spell_areatrigger_circular` ORDER BY `SpellMiscId`"); if (!circularMovementInfos.IsEmpty()) { do { uint spellMiscId = circularMovementInfos.Read <uint>(0); var atSpellMisc = _areaTriggerTemplateSpellMisc.LookupByKey(spellMiscId); if (atSpellMisc == null) { Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` reference invalid SpellMiscId {spellMiscId}"); continue; } AreaTriggerOrbitInfo orbitInfo = new AreaTriggerOrbitInfo(); orbitInfo.StartDelay = circularMovementInfos.Read <uint>(1); orbitInfo.Radius = circularMovementInfos.Read <float>(2); if (!float.IsInfinity(orbitInfo.Radius)) { Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` has listed areatrigger (MiscId: {spellMiscId}) with invalid Radius ({orbitInfo.Radius}), set to 0!"); orbitInfo.Radius = 0.0f; } orbitInfo.BlendFromRadius = circularMovementInfos.Read <float>(3); if (!float.IsInfinity(orbitInfo.BlendFromRadius)) { Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` has listed areatrigger (MiscId: {spellMiscId}) with invalid BlendFromRadius ({orbitInfo.BlendFromRadius}), set to 0!"); orbitInfo.BlendFromRadius = 0.0f; } orbitInfo.InitialAngle = circularMovementInfos.Read <float>(4); if (!float.IsInfinity(orbitInfo.InitialAngle)) { Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` has listed areatrigger (MiscId: {spellMiscId}) with invalid InitialAngle ({orbitInfo.InitialAngle}), set to 0!"); orbitInfo.InitialAngle = 0.0f; } orbitInfo.ZOffset = circularMovementInfos.Read <float>(5); if (!float.IsInfinity(orbitInfo.ZOffset)) { Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` has listed areatrigger (MiscId: {spellMiscId}) with invalid ZOffset ({orbitInfo.ZOffset}), set to 0!"); orbitInfo.ZOffset = 0.0f; } orbitInfo.CounterClockwise = circularMovementInfos.Read <bool>(6); orbitInfo.CanLoop = circularMovementInfos.Read <bool>(7); atSpellMisc.OrbitInfo = orbitInfo; }while (circularMovementInfos.NextRow()); } else { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates circular movement infos. DB table `spell_areatrigger_circular` is empty."); } Log.outInfo(LogFilter.ServerLoading, $"Loaded {_areaTriggerTemplateStore.Count} spell areatrigger templates in {Time.GetMSTimeDiffToNow(oldMSTime)} ms."); }
private static MovementInfo ReadMovementUpdateBlock(Packet packet, WowGuid guid, WoWObject obj, object index) { var moveInfo = new MovementInfo(); packet.ResetBitReader(); packet.ReadBit("NoBirthAnim", index); packet.ReadBit("EnablePortals", index); packet.ReadBit("PlayHoverAnim", 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 isSelf = packet.ReadBit("ThisIsYou", index); var sceneObjCreate = packet.ReadBit("SceneObjCreate", index); var playerCreateData = packet.ReadBit("HasPlayerCreateData", index); var hasConversation = packet.ReadBit("HasConversation", index); if (hasMovementUpdate) { packet.ResetBitReader(); packet.ReadPackedGuid128("MoverGUID", index); if (ClientVersion.AddedInVersion(ClientVersionBuild.V2_5_3_41812)) { moveInfo.Flags = (uint)packet.ReadUInt32E <MovementFlag>("Movement Flags", index); moveInfo.Flags2 = (uint)packet.ReadUInt32E <MovementFlag2>("Movement Flags 2", index); moveInfo.Flags3 = (uint)packet.ReadUInt32E <MovementFlag3>("Movement Flags 3", index); } packet.ReadUInt32("MoveTime", index); moveInfo.Position = packet.ReadVector3("Position", index); moveInfo.Orientation = packet.ReadSingle("Orientation", index); packet.ReadSingle("Pitch", index); packet.ReadSingle("StepUpStartElevation", index); var removeForcesIDsCount = packet.ReadInt32(); packet.ReadInt32("MoveIndex", index); for (var i = 0; i < removeForcesIDsCount; i++) { packet.ReadPackedGuid128("RemoveForcesIDs", index, i); } if (ClientVersion.RemovedInVersion(ClientVersionBuild.V2_5_3_41812)) { moveInfo.Flags = (uint)packet.ReadBitsE <MovementFlag>("Movement Flags", 30, index); moveInfo.Flags2 = (uint)packet.ReadBitsE <MovementFlag2>("Extra Movement Flags", 18, 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 = ClientVersion.AddedInVersion(ClientVersionBuild.V2_5_3_41812) && packet.ReadBit("Has Inertia", index); if (hasTransport) { V8_0_1_27101.Parsers.UpdateHandler.ReadTransportData(moveInfo, guid, packet, index); } if (hasInertia) { packet.ReadPackedGuid128("GUID", index, "Inertia"); packet.ReadVector3("Force", index, "Inertia"); packet.ReadUInt32("Lifetime", index, "Inertia"); } if (hasFall) { packet.ResetBitReader(); packet.ReadUInt32("Jump Fall Time", index); packet.ReadSingle("Jump Vertical Speed", index); var hasFallDirection = packet.ReadBit("Has Fall Direction", index); if (hasFallDirection) { packet.ReadSingle("Jump Sin Angle", index); packet.ReadSingle("Jump Cos Angle", index); packet.ReadSingle("Jump Horizontal Speed", index); } } moveInfo.WalkSpeed = packet.ReadSingle("WalkSpeed", index); moveInfo.RunSpeed = packet.ReadSingle("RunSpeed", index); 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.ReadInt32("MovementForceCount", index); packet.ReadSingle("MovementForcesModMagnitude", index); packet.ResetBitReader(); moveInfo.HasSplineData = packet.ReadBit("HasMovementSpline", index); for (var i = 0; i < movementForceCount; ++i) { packet.ResetBitReader(); packet.ReadPackedGuid128("Id", index); packet.ReadVector3("Origin", index); packet.ReadVector3("Direction", index); packet.ReadUInt32("TransportID", index); packet.ReadSingle("Magnitude", index); packet.ReadBits("Type", 2, index); } if (moveInfo.HasSplineData) { packet.ResetBitReader(); packet.ReadInt32("ID", index); packet.ReadVector3("Destination", index); var hasMovementSplineMove = packet.ReadBit("MovementSplineMove", index); if (hasMovementSplineMove) { packet.ResetBitReader(); packet.ReadUInt32E <SplineFlag>("SplineFlags", index); packet.ReadInt32("Elapsed", index); packet.ReadUInt32("Duration", index); packet.ReadSingle("DurationModifier", index); 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 hasAnimationTierTransition = packet.ReadBit("HasAnimationTierTransition", index); var hasUnknown901 = packet.ReadBit("Unknown901", 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); } float orientation = 100; switch (face) { case 1: var faceSpot = packet.ReadVector3("FaceSpot", index); orientation = GetAngle(moveInfo.Position.X, moveInfo.Position.Y, faceSpot.X, faceSpot.Y); break; case 2: packet.ReadPackedGuid128("FaceGUID", index); break; case 3: orientation = packet.ReadSingle("FaceDirection", index); break; default: break; } if (hasSpecialTime) { packet.ReadUInt32("SpecialTime", index); } for (var i = 0; i < pointsCount; ++i) { var spot = packet.ReadVector3("Points", index, i); } if (hasSpellEffectExtraData) { V8_0_1_27101.Parsers.MovementHandler.ReadMonsterSplineSpellEffectExtraData(packet, index); } if (hasJumpExtraData) { V8_0_1_27101.Parsers.MovementHandler.ReadMonsterSplineJumpExtraData(packet, index); } if (hasAnimationTierTransition) { packet.ReadInt32("TierTransitionID", index); packet.ReadInt32("StartTime", index); packet.ReadInt32("EndTime", index); packet.ReadByte("AnimTier", index); } if (hasUnknown901) { for (var i = 0; i < 16; ++i) { packet.ReadInt32("Unknown1", index, "Unknown901", i); packet.ReadInt32("Unknown2", index, "Unknown901", i); packet.ReadInt32("Unknown3", index, "Unknown901", i); packet.ReadInt32("Unknown4", index, "Unknown901", i); } } } } } 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); } if (hasCombatVictim) { packet.ReadPackedGuid128("CombatVictim Guid", index); } if (hasServerTime) { packet.ReadUInt32("ServerTime", index); } if (hasVehicleCreate) { moveInfo.VehicleId = packet.ReadUInt32("RecID", index); packet.ReadSingle("InitialRawFacing", index); } if (hasAnimKitCreate) { packet.ReadUInt16("AiID", index); packet.ReadUInt16("MovementID", index); packet.ReadUInt16("MeleeID", index); } if (hasRotation) { moveInfo.Rotation = packet.ReadPackedQuaternion("GameObject Rotation", index); } for (var i = 0; i < pauseTimesCount; ++i) { packet.ReadInt32("PauseTimes", index, i); } if (hasMovementTransport) { moveInfo.Transport = new MovementInfo.TransportInfo(); packet.ResetBitReader(); moveInfo.Transport.Guid = packet.ReadPackedGuid128("TransportGUID", index); moveInfo.Transport.Offset = packet.ReadVector4("TransportPosition", index); sbyte seat; if (ClientVersion.RemovedInVersion(ClientVersionBuild.V2_5_3_41812)) { seat = (sbyte)packet.ReadByte("VehicleSeatIndex", index); } else { seat = packet.ReadSByte("VehicleSeatIndex", index); } packet.ReadUInt32("MoveTime", index); var hasPrevMoveTime = packet.ReadBit("HasPrevMoveTime", index); var hasVehicleRecID = packet.ReadBit("HasVehicleRecID", index); if (hasPrevMoveTime) { packet.ReadUInt32("PrevMoveTime", index); } if (hasVehicleRecID) { 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); } } if (hasAreaTrigger && obj is AreaTriggerCreateProperties) { AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate { Id = guid.GetEntry() }; AreaTriggerCreateProperties spellAreaTrigger = (AreaTriggerCreateProperties)obj; spellAreaTrigger.AreaTriggerId = guid.GetEntry(); packet.ResetBitReader(); // CliAreaTrigger packet.ReadUInt32("ElapsedMs", index); packet.ReadVector3("RollPitchYaw", index); areaTriggerTemplate.Flags = 0; if (packet.ReadBit("HasAbsoluteOrientation", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAbsoluteOrientation; } if (packet.ReadBit("HasDynamicShape", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasDynamicShape; } if (packet.ReadBit("HasAttached", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAttached; } if (packet.ReadBit("HasFaceMovementDir", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.FaceMovementDirection; } if (packet.ReadBit("HasFollowsTerrain", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.FollowsTerrain; } if (packet.ReadBit("Unk bit WoD62x", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk1; } if (packet.ReadBit("HasTargetRollPitchYaw", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.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); if (packet.ReadBit("HasAnimID", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAnimId; } if (packet.ReadBit("HasAnimKitID", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasAnimKitId; } if (packet.ReadBit("unkbit50", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk3; } bool hasAnimProgress = packet.ReadBit("HasAnimProgress", index); if (packet.ReadBit("HasAreaTriggerSphere", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Sphere; } if (packet.ReadBit("HasAreaTriggerBox", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Box; } if (packet.ReadBit("HasAreaTriggerPolygon", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Polygon; } if (packet.ReadBit("HasAreaTriggerCylinder", index)) { areaTriggerTemplate.Type = (byte)AreaTriggerType.Cylinder; } bool hasAreaTriggerSpline = packet.ReadBit("HasAreaTriggerSpline", index); if (packet.ReadBit("HasAreaTriggerOrbit", index)) { areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.HasOrbit; } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.Unk3) != 0) { packet.ReadBit(); } if (hasAreaTriggerSpline) { V7_0_3_22248.Parsers.AreaTriggerHandler.ReadAreaTriggerSpline(spellAreaTrigger, packet, index); } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.HasTargetRollPitchYaw) != 0) { packet.ReadVector3("TargetRollPitchYaw", index); } if (hasScaleCurveID) { spellAreaTrigger.ScaleCurveId = (int)packet.ReadUInt32("ScaleCurveID", index); } if (hasMorphCurveID) { spellAreaTrigger.MorphCurveId = (int)packet.ReadUInt32("MorphCurveID", index); } if (hasFacingCurveID) { spellAreaTrigger.FacingCurveId = (int)packet.ReadUInt32("FacingCurveID", index); } if (hasMoveCurveID) { spellAreaTrigger.MoveCurveId = (int)packet.ReadUInt32("MoveCurveID", index); } if ((areaTriggerTemplate.Flags & (int)AreaTriggerFlags.HasAnimId) != 0) { spellAreaTrigger.AnimId = packet.ReadInt32("AnimId", index); } if ((areaTriggerTemplate.Flags & (int)AreaTriggerFlags.HasAnimKitId) != 0) { spellAreaTrigger.AnimKitId = packet.ReadInt32("AnimKitId", index); } if (hasAnimProgress) { packet.ReadUInt32("AnimProgress", index); } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Sphere) { areaTriggerTemplate.Data[0] = packet.ReadSingle("Radius", index); areaTriggerTemplate.Data[1] = packet.ReadSingle("RadiusTarget", index); } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Box) { Vector3 Extents = packet.ReadVector3("Extents", index); Vector3 ExtentsTarget = packet.ReadVector3("ExtentsTarget", index); areaTriggerTemplate.Data[0] = Extents.X; areaTriggerTemplate.Data[1] = Extents.Y; areaTriggerTemplate.Data[2] = Extents.Z; areaTriggerTemplate.Data[3] = ExtentsTarget.X; areaTriggerTemplate.Data[4] = ExtentsTarget.Y; areaTriggerTemplate.Data[5] = ExtentsTarget.Z; } if (areaTriggerTemplate.Type == (byte)AreaTriggerType.Polygon) { var verticesCount = packet.ReadUInt32("VerticesCount", index); var verticesTargetCount = packet.ReadUInt32("VerticesTargetCount", index); areaTriggerTemplate.Data[0] = packet.ReadSingle("Height", index); areaTriggerTemplate.Data[1] = packet.ReadSingle("HeightTarget", index); for (uint i = 0; i < verticesCount; ++i) { Vector2 vertices = packet.ReadVector2("Vertices", index, i); } for (var i = 0; i < verticesTargetCount; ++i) { Vector2 verticesTarget = packet.ReadVector2("VerticesTarget", index, i); } } if (areaTriggerTemplate.Type == (byte)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); } if ((areaTriggerTemplate.Flags & (uint)AreaTriggerFlags.HasOrbit) != 0) { V7_0_3_22248.Parsers.AreaTriggerHandler.ReadAreaTriggerOrbit(guid, packet, "Orbit"); } Storage.AreaTriggerTemplates.Add(areaTriggerTemplate); } if (hasGameObject) { packet.ResetBitReader(); packet.ReadInt32("WorldEffectID", index); var bit8 = packet.ReadBit("bit8", index); if (bit8) { packet.ReadInt32("Int1", index); } } if (hasSmoothPhasing) { packet.ResetBitReader(); packet.ReadBit("ReplaceActive", 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) { V6_0_2_19033.Parsers.BattlePetHandler.ReadPetBattleFullUpdate(packet, index); } } if (playerCreateData) { packet.ResetBitReader(); var hasSceneInstanceIDs = packet.ReadBit("ScenePendingInstances", index); var hasRuneState = packet.ReadBit("Runes", index); var hasActionButtons = packet.ReadBit("Unk1132", index); if (hasSceneInstanceIDs) { var sceneInstanceIDs = packet.ReadInt32("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 < 132; i++) { packet.ReadInt32("Action", index, i); } } } if (hasConversation) { packet.ResetBitReader(); if (packet.ReadBit("HasTextureKitID", index)) { (obj as ConversationTemplate).TextureKitId = packet.ReadUInt32("TextureKitID", index); } } return(moveInfo); }