public MovementInfo ReadMovementInfo(WoWGuid guid)
        {
            var info = new MovementInfo();

            info.MoveFlag = ReadUInt32_MoveFlag("MoveFlag");
            info.MoveFlagExtra = ReadUInt16_MoveFlagExtra("MoveFlagExtra");
            info.TimeStamp = ReadUInt32("TimeStamp");
            info.PositionInfo = ReadVector4("PositionInfo");

            if (info.MoveFlag.Value.HasFlag(MoveFlag.OnTransport))
            {
                info.TransportInfo = ReadMovementTransport("OnTransport", info.MoveFlagExtra.Value.HasFlag(MoveFlagExtra.InterpolatedPlayerMovement));
            }

            if (info.MoveFlag.Value.HasAnyFlag(MoveFlag.Swimming | MoveFlag.Flying) ||
                info.MoveFlagExtra.Value.HasFlag(MoveFlagExtra.AlwaysAllowPitching))
            {
                info.SwimPitch = ReadSingle("SwimPitch");
            }

            info.FallTime = ReadUInt32("FallTime");

            if (info.MoveFlag.Value.HasFlag(MoveFlag.Falling))
            {
                info.FallInfo = ReadMovementFall("FallInfo");
            }

            if (info.MoveFlag.Value.HasFlag(MoveFlag.SplineElevation))
            {
                info.SplineElevation = ReadFloat("SplineElevation");
            }

            return info;
        }
Exemple #2
0
        void HandleMovementOpcode(ClientOpcodes opcode, MovementInfo movementInfo)
        {
            Unit   mover    = GetPlayer().m_unitMovedByMe;
            Player plrMover = mover.ToPlayer();

            if (plrMover && plrMover.IsBeingTeleported())
            {
                return;
            }

            GetPlayer().ValidateMovementInfo(movementInfo);

            if (movementInfo.Guid != mover.GetGUID())
            {
                Log.outError(LogFilter.Network, "HandleMovementOpcodes: guid error");
                return;
            }
            if (!movementInfo.Pos.IsPositionValid())
            {
                Log.outError(LogFilter.Network, "HandleMovementOpcodes: Invalid Position");
                return;
            }

            // stop some emotes at player move
            if (plrMover && (plrMover.GetUInt32Value(UnitFields.NpcEmotestate) != 0))
            {
                plrMover.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone);
            }

            //handle special cases
            if (!movementInfo.transport.guid.IsEmpty())
            {
                if (movementInfo.transport.pos.GetPositionX() > 50 || movementInfo.transport.pos.GetPositionY() > 50 || movementInfo.transport.pos.GetPositionZ() > 50)
                {
                    return;
                }

                if (!GridDefines.IsValidMapCoord(movementInfo.Pos.posX + movementInfo.transport.pos.posX, movementInfo.Pos.posY + movementInfo.transport.pos.posY,
                                                 movementInfo.Pos.posZ + movementInfo.transport.pos.posZ, movementInfo.Pos.Orientation + movementInfo.transport.pos.Orientation))
                {
                    return;
                }

                if (plrMover)
                {
                    if (!plrMover.GetTransport())
                    {
                        Transport transport = plrMover.GetMap().GetTransport(movementInfo.transport.guid);
                        if (transport)
                        {
                            transport.AddPassenger(plrMover);
                        }
                    }
                    else if (plrMover.GetTransport().GetGUID() != movementInfo.transport.guid)
                    {
                        plrMover.GetTransport().RemovePassenger(plrMover);
                        Transport transport = plrMover.GetMap().GetTransport(movementInfo.transport.guid);
                        if (transport)
                        {
                            transport.AddPassenger(plrMover);
                        }
                        else
                        {
                            movementInfo.ResetTransport();
                        }
                    }
                }

                if (!mover.GetTransport() && !mover.GetVehicle())
                {
                    GameObject go = mover.GetMap().GetGameObject(movementInfo.transport.guid);
                    if (!go || go.GetGoType() != GameObjectTypes.Transport)
                    {
                        movementInfo.transport.Reset();
                    }
                }
            }
            else if (plrMover && plrMover.GetTransport())                // if we were on a transport, leave
            {
                plrMover.GetTransport().RemovePassenger(plrMover);
            }

            // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
            if (opcode == ClientOpcodes.MoveFallLand && plrMover && !plrMover.IsInFlight())
            {
                plrMover.HandleFall(movementInfo);
            }

            if (plrMover && movementInfo.HasMovementFlag(MovementFlag.Swimming) != plrMover.IsInWater())
            {
                // now client not include swimming flag in case jumping under water
                plrMover.SetInWater(!plrMover.IsInWater() || plrMover.GetMap().IsUnderWater(movementInfo.Pos.posX, movementInfo.Pos.posY, movementInfo.Pos.posZ));
            }

            uint mstime = Time.GetMSTime();

            if (m_clientTimeDelay == 0)
            {
                m_clientTimeDelay = mstime - movementInfo.Time;
            }

            movementInfo.Time = movementInfo.Time + m_clientTimeDelay;

            movementInfo.Guid    = mover.GetGUID();
            mover.m_movementInfo = movementInfo;

            // Some vehicles allow the passenger to turn by himself
            Vehicle vehicle = mover.GetVehicle();

            if (vehicle)
            {
                VehicleSeatRecord seat = vehicle.GetSeatForPassenger(mover);
                if (seat != null)
                {
                    if (seat.Flags[0].HasAnyFlag((uint)VehicleSeatFlags.AllowTurning))
                    {
                        if (movementInfo.Pos.GetOrientation() != mover.GetOrientation())
                        {
                            mover.SetOrientation(movementInfo.Pos.GetOrientation());
                            mover.RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags.Turning);
                        }
                    }
                }
                return;
            }

            mover.UpdatePosition(movementInfo.Pos);

            MoveUpdate moveUpdate = new MoveUpdate();

            moveUpdate.movementInfo = mover.m_movementInfo;
            mover.SendMessageToSet(moveUpdate, GetPlayer());

            if (plrMover)                                            // nothing is charmed, or player charmed
            {
                if (plrMover.IsSitState() && movementInfo.HasMovementFlag(MovementFlag.MaskMoving | MovementFlag.MaskTurning))
                {
                    plrMover.SetStandState(UnitStandStateType.Stand);
                }

                plrMover.UpdateFallInformationIfNeed(movementInfo, opcode);

                if (movementInfo.Pos.posZ < plrMover.GetMap().GetMinHeight(movementInfo.Pos.GetPositionX(), movementInfo.Pos.GetPositionY()))
                {
                    if (!(plrMover.GetBattleground() && plrMover.GetBattleground().HandlePlayerUnderMap(GetPlayer())))
                    {
                        // NOTE: this is actually called many times while falling
                        // even after the player has been teleported away
                        /// @todo discard movement packets after the player is rooted
                        if (plrMover.IsAlive())
                        {
                            plrMover.SetFlag(PlayerFields.Flags, PlayerFlags.IsOutOfBounds);
                            plrMover.EnvironmentalDamage(EnviromentalDamage.FallToVoid, (uint)GetPlayer().GetMaxHealth());
                            // player can be alive if GM/etc
                            // change the death state to CORPSE to prevent the death timer from
                            // starting in the next player update
                            if (!plrMover.IsAlive())
                            {
                                plrMover.KillPlayer();
                            }
                        }
                    }
                }
                else
                {
                    plrMover.RemoveFlag(PlayerFields.Flags, PlayerFlags.IsOutOfBounds);
                }
            }
        }
        private static MovementInfo ReadMovementUpdateBlock(Packet packet, CreateObject createObject, WowGuid guid, object index)
        {
            var moveInfo = new MovementInfo();

            packet.ResetBitReader();

            packet.ReadBit("NoBirthAnim", index);
            packet.ReadBit("EnablePortals", index);
            packet.ReadBit("PlayHoverAnim", index);
            packet.ReadBit("IsSuppressingGreetings", 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);

            packet.ReadBit("ThisIsYou", index);
            packet.ReadBit("ReplaceActive", index);

            var sceneObjCreate        = packet.ReadBit("SceneObjCreate", index);
            var scenePendingInstances = packet.ReadBit("ScenePendingInstances", index);

            var pauseTimesCount = packet.ReadUInt32("PauseTimesCount", index);

            if (hasMovementUpdate) // 392
            {
                var movementUpdate = createObject.Movement = new();
                moveInfo = ReadMovementStatusData(packet, movementUpdate, 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);

                for (var i = 0; i < movementForceCount; ++i)
                {
                    packet.ReadPackedGuid128("Id", index);
                    packet.ReadVector3("Direction", index);
                    if (ClientVersion.AddedInVersion(ClientVersionBuild.V6_1_2_19802)) // correct?
                    {
                        packet.ReadVector3("TransportPosition", index);
                    }
                    packet.ReadInt32("TransportID", index);
                    packet.ReadSingle("Magnitude", index);
                    packet.ReadByte("Type", index);
                }

                packet.ResetBitReader();

                moveInfo.HasSplineData = packet.ReadBit("HasMovementSpline", index);

                if (moveInfo.HasSplineData)
                {
                    var splineData = movementUpdate.SplineData = new();
                    splineData.Id          = packet.ReadInt32("ID", index);
                    splineData.Destination = packet.ReadVector3("Destination", index);

                    packet.ResetBitReader();

                    var hasMovementSplineMove = packet.ReadBit("MovementSplineMove", index);
                    if (hasMovementSplineMove)
                    {
                        var splineMove = splineData.MoveData = new();
                        packet.ResetBitReader();

                        var flags = packet.ReadBitsE <SplineFlag434>("SplineFlags", ClientVersion.AddedInVersion(ClientVersionBuild.V6_2_0_20173) ? 28 : 25, index);
                        splineMove.Flags = flags.ToUniversal();
                        var face = packet.ReadBits("Face", 2, index);

                        var hasJumpGravity = packet.ReadBit("HasJumpGravity", index);
                        var hasSpecialTime = packet.ReadBit("HasSpecialTime", index);

                        packet.ReadBitsE <SplineMode>("Mode", 2, index);

                        var hasSplineFilterKey = packet.ReadBit("HasSplineFilterKey", index);

                        splineMove.Elapsed  = (int)packet.ReadUInt32("Elapsed", index);
                        splineMove.Duration = packet.ReadUInt32("Duration", index);

                        splineMove.DurationModifier     = packet.ReadSingle("DurationModifier", index);
                        splineMove.NextDurationModifier = packet.ReadSingle("NextDurationModifier", index);

                        var pointsCount = packet.ReadUInt32("PointsCount", index);

                        if (face == 3) // FaceDirection
                        {
                            splineMove.LookOrientation = packet.ReadSingle("FaceDirection", index);
                        }

                        if (face == 2) // FaceGUID
                        {
                            splineMove.LookTarget = new() { Target = packet.ReadPackedGuid128("FaceGUID", index) }
                        }
                        ;

                        if (face == 1) // FaceSpot
                        {
                            splineMove.LookPosition = packet.ReadVector3("FaceSpot", index);
                        }

                        if (hasJumpGravity)
                        {
                            splineMove.Jump = new() { Gravity = packet.ReadSingle("JumpGravity", index) }
                        }
                        ;

                        if (hasSpecialTime)
                        {
                            packet.ReadInt32("SpecialTime", index);
                        }

                        if (hasSplineFilterKey)
                        {
                            var filterKeysCount = packet.ReadUInt32("FilterKeysCount", index);
                            for (var i = 0; i < filterKeysCount; ++i)
                            {
                                packet.ReadSingle("In", index, i);
                                packet.ReadSingle("Out", index, i);
                            }

                            if (ClientVersion.AddedInVersion(ClientVersionBuild.V6_2_0_20173))
                            {
                                packet.ResetBitReader();
                            }

                            packet.ReadBits("FilterFlags", 2, index);
                        }

                        for (var i = 0; i < pointsCount; ++i)
                        {
                            splineMove.Points.Add(packet.ReadVector3("Points", index, i));
                        }
                    }
                }
            }

            if (hasMovementTransport) // 456
            {
                var transport = createObject.Transport = new();
                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);

                packet.ResetBitReader();

                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 (hasStationaryPosition) // 480
            {
                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) // 504
            {
                packet.ReadPackedGuid128("CombatVictim Guid", index);
            }

            if (hasServerTime) // 516
            {
                packet.ReadUInt32("ServerTime", index);
            }

            if (hasVehicleCreate) // 528
            {
                var vehicle = createObject.Vehicle = new();
                moveInfo.VehicleId       = packet.ReadUInt32("RecID", index);
                vehicle.VehicleId        = (int)moveInfo.VehicleId;
                vehicle.InitialRawFacing = packet.ReadSingle("InitialRawFacing", index);
            }

            if (hasAnimKitCreate) // 538
            {
                packet.ReadUInt16("AiID", index);
                packet.ReadUInt16("MovementID", index);
                packet.ReadUInt16("MeleeID", index);
            }

            if (hasRotation) // 552
            {
                createObject.Rotation = moveInfo.Rotation = packet.ReadPackedQuaternion("GameObject Rotation", index);
            }

            if (hasAreaTrigger) // 772
            {
                // CliAreaTrigger
                packet.ReadInt32("ElapsedMs", index);

                packet.ReadVector3("RollPitchYaw1", index);

                packet.ResetBitReader();

                packet.ReadBit("HasAbsoluteOrientation", index);
                packet.ReadBit("HasDynamicShape", index);
                packet.ReadBit("HasAttached", index);
                packet.ReadBit("HasFaceMovementDir", index);
                packet.ReadBit("HasFollowsTerrain", index);

                if (ClientVersion.AddedInVersion(ClientVersionBuild.V6_2_0_20173))
                {
                    packet.ReadBit("Unk bit WoD62x", index);
                }

                var hasTargetRollPitchYaw  = packet.ReadBit("HasTargetRollPitchYaw", index);
                var hasScaleCurveID        = packet.ReadBit("HasScaleCurveID", index);
                var hasMorphCurveID        = packet.ReadBit("HasMorphCurveID", index);
                var hasFacingCurveID       = packet.ReadBit("HasFacingCurveID", index);
                var hasMoveCurveID         = packet.ReadBit("HasMoveCurveID", index);
                var hasAreaTriggerSphere   = packet.ReadBit("HasAreaTriggerSphere", index);
                var hasAreaTriggerBox      = packet.ReadBit("HasAreaTriggerBox", index);
                var hasAreaTriggerPolygon  = packet.ReadBit("HasAreaTriggerPolygon", index);
                var hasAreaTriggerCylinder = packet.ReadBit("HasAreaTriggerCylinder", index);
                var hasAreaTriggerSpline   = packet.ReadBit("HasAreaTriggerSpline", index);

                if (hasTargetRollPitchYaw)
                {
                    packet.ReadVector3("TargetRollPitchYaw", index);
                }

                if (hasScaleCurveID)
                {
                    packet.ReadInt32("ScaleCurveID, index");
                }

                if (hasMorphCurveID)
                {
                    packet.ReadInt32("MorphCurveID", index);
                }

                if (hasFacingCurveID)
                {
                    packet.ReadInt32("FacingCurveID", index);
                }

                if (hasMoveCurveID)
                {
                    packet.ReadInt32("MoveCurveID", index);
                }

                if (hasAreaTriggerSphere)
                {
                    packet.ReadSingle("Radius", index);
                    packet.ReadSingle("RadiusTarget", index);
                }

                if (hasAreaTriggerBox)
                {
                    packet.ReadVector3("Extents", index);
                    packet.ReadVector3("ExtentsTarget", index);
                }

                if (hasAreaTriggerPolygon)
                {
                    var verticesCount       = packet.ReadInt32("VerticesCount", index);
                    var verticesTargetCount = packet.ReadInt32("VerticesTargetCount", index);
                    packet.ReadSingle("Height", index);
                    packet.ReadSingle("HeightTarget", index);

                    for (var i = 0; i < verticesCount; ++i)
                    {
                        packet.ReadVector2("Vertices", index, i);
                    }

                    for (var i = 0; i < verticesTargetCount; ++i)
                    {
                        packet.ReadVector2("VerticesTarget", index, i);
                    }
                }

                if (hasAreaTriggerCylinder)
                {
                    packet.ReadSingle("Radius", index);
                    packet.ReadSingle("RadiusTarget", index);
                    packet.ReadSingle("Height", index);
                    packet.ReadSingle("HeightTarget", index);
                    packet.ReadSingle("Float4", index);
                    packet.ReadSingle("Float5", index);
                }

                if (hasAreaTriggerSpline)
                {
                    AreaTriggerHandler.ReadAreaTriggerSpline(packet, index);
                }
            }

            if (hasGameObject) // 788
            {
                packet.ReadInt32("WorldEffectID", index);

                packet.ResetBitReader();

                var bit8 = packet.ReadBit("bit8", index);
                if (bit8)
                {
                    packet.ReadInt32("Int1", index);
                }
            }

            if (sceneObjCreate) // 1184
            {
                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 (scenePendingInstances) // 1208
            {
                var sceneInstanceIDs = packet.ReadInt32("SceneInstanceIDsCount");

                for (var i = 0; i < sceneInstanceIDs; ++i)
                {
                    packet.ReadInt32("SceneInstanceIDs", index, i);
                }
            }

            for (var i = 0; i < pauseTimesCount; ++i)
            {
                packet.ReadInt32("PauseTimes", index, i);
            }

            return(moveInfo);
        }
        private static MovementInfo ReadMovementUpdateBlock(Packet packet, WowGuid guid, object index)
        {
            var moveInfo = new MovementInfo();

            var guid1               = new byte[8];
            var transportGuid       = new byte[8];
            var goTransportGuid     = new byte[8];
            var attackingTargetGuid = new byte[8];

            var hasAnimKit1                   = false;
            var hasAnimKit2                   = false;
            var hasAnimKit3                   = false;
            var hasFullSpline                 = false;
            var hasSplineStartTime            = false;
            var hasSplineVerticalAcceleration = false;
            var hasGOTransportTime2           = false;
            var hasGOTransportTime3           = false;
            var hasSplineElevation            = false;
            var hasMovementFlags              = false;
            var hasMoveFlagsExtra             = false;
            var hasTimestamp                  = false;
            var hasOrientation                = false;
            var hasTransportData              = false;
            var hasTransportTime3             = false;
            var hasTransportTime2             = false;
            var hasPitch         = false;
            var hasFallData      = false;
            var hasFallDirection = false;

            var bit130 = false;
            var bitA0  = false;
            var bit23C = false;
            var bit298 = false;
            var bit230 = false;
            var bit284 = false;
            var bit228 = false;
            var bit258 = false;
            var bit218 = false;
            var bit220 = false;

            var        bits160     = 0u;
            var        splineCount = 0u;
            var        bits11C     = 0u;
            var        bits90      = 0u;
            var        bits25C     = 0u;
            var        bits26C     = 0u;
            var        bits288     = 0u;
            var        bits418     = 0u;
            var        bits2AA     = 0u;
            SplineType splineType  = SplineType.Stop;

            var hasVehicleData = packet.ReadBit("Has Vehicle Data", index);
            var bit2A8         = packet.ReadBit();

            packet.ReadBit(); // fake 0
            var bit1DC = packet.ReadBit();

            packet.ReadBit(); // fake 2
            var bit2A9                = packet.ReadBit();
            var hasAttackingTarget    = packet.ReadBit("Has Attacking Target", index);
            var hasStationaryPosition = packet.ReadBit("Has Stationary Position", index);
            var bit29C                = packet.ReadBit();
            var bit428                = packet.ReadBit();
            var hasSceneObjectData    = packet.ReadBit("Has Scene Object Data", index);

            packet.ReadBit(); // fake 1
            var bit32A                = packet.ReadBit();
            var transportFrames       = packet.ReadBits("Transport Frames Count", 22, index);
            var isLiving              = packet.ReadBit("Is Living", index);
            var hasGameObjectPosition = packet.ReadBit("Has GameObject Position", index);

            packet.ReadBit(); // fake 3
            var hasGameObjectRotation = packet.ReadBit("Has GameObject Rotation", index);
            var bit2A4      = packet.ReadBit();
            var bit414      = packet.ReadBit();
            var hasAnimKits = packet.ReadBit("Has Anim Kits", index);

            if (isLiving)
            {
                guid1[5] = packet.ReadBit();
                packet.ReadBit("bit8D", index);
                hasPitch = !packet.ReadBit();
                guid1[6] = packet.ReadBit();
                packet.ReadBit("bitA4", index);
                bits160 = packet.ReadBits(19);
                for (var i = 0; i < bits160; ++i)
                {
                    packet.ReadBits("bits164", 2, index, i);
                }

                guid1[4]          = packet.ReadBit();
                hasOrientation    = !packet.ReadBit();
                hasMoveFlagsExtra = !packet.ReadBit();
                bitA0             = !packet.ReadBit();
                packet.StartBitStream(guid1, 2, 3, 7);
                bits90             = packet.ReadBits(22);
                hasMovementFlags   = !packet.ReadBit();
                hasTimestamp       = !packet.ReadBit();
                hasSplineElevation = !packet.ReadBit();
                guid1[1]           = packet.ReadBit();
                hasFallData        = packet.ReadBit();
                packet.ReadBit("bit8C", index);
                if (hasMoveFlagsExtra)
                {
                    moveInfo.FlagsExtra = packet.ReadBitsE <MovementFlagExtra>("Extra Movement Flags", 13, index);
                }

                guid1[0] = packet.ReadBit();
                moveInfo.HasSplineData = packet.ReadBit();
                if (moveInfo.HasSplineData)
                {
                    hasFullSpline = packet.ReadBit();
                    if (hasFullSpline)
                    {
                        packet.ReadBitsE <SplineFlag434>("Spline flags", 25, index);
                        hasSplineStartTime = packet.ReadBit("Has Spline Start Time", index);
                        splineCount        = packet.ReadBits("SplineWaypointsCount", 20, index);
                        bit130             = packet.ReadBit();
                        if (bit130)
                        {
                            bits11C = packet.ReadBits(21);
                            packet.ReadBits("bits12C", 2, index);
                        }

                        packet.ReadBitsE <SplineMode>("Spline Mode", 2, index);
                        hasSplineVerticalAcceleration = packet.ReadBit("has Spline Vertical Acceleration", index);
                    }
                }

                hasTransportData = packet.ReadBit();
                if (hasTransportData)
                {
                    packet.StartBitStream(transportGuid, 6, 1, 2, 5);
                    hasTransportTime3 = packet.ReadBit();
                    packet.StartBitStream(transportGuid, 4, 7, 0);
                    hasTransportTime2 = packet.ReadBit();
                    packet.StartBitStream(transportGuid, 3);
                }

                if (hasMovementFlags)
                {
                    moveInfo.Flags = packet.ReadBitsE <MovementFlag>("Movement Flags", 30, index);
                }

                if (hasFallData)
                {
                    hasFallDirection = packet.ReadBit();
                }
            }

            if (hasGameObjectPosition)
            {
                hasGOTransportTime3 = packet.ReadBit();
                hasGOTransportTime2 = packet.ReadBit();
                packet.StartBitStream(goTransportGuid, 4, 2, 7, 6, 3, 0, 1, 5);
            }

            // Sceneobject data
            var CreatorGUID = new byte[8];

            byte[][]   guid358        = null;
            byte[][][] guid358_6      = null;
            uint[]     bits358_10     = null;
            uint[][]   bits358_6_84   = null;
            uint[][]   bits358_6_94   = null;
            uint[][]   bits358_6_31   = null;
            uint[][]   bits358_6_74   = null;
            byte[][][] bit358_6_78_9  = null;
            byte[][][] bit358_6_88_10 = null;
            bool[][][] bit358_6_88_C  = null;
            bool[][][] bit358_6_88_8  = null;
            bool[][]   bit358_6_2E    = null;
            bool[][]   bit358_6_30    = null;
            bool[]     bit358_A       = null;
            bool[]     bit358_E       = null;
            bool[]     bit358_22      = null;

            var bit338 = false;
            var bit330 = false;
            var bit341 = false;
            var bit340 = false;
            var bit332 = false;
            var bit33C = false;

            uint[]   bits388     = null;
            uint[]   bits388_10  = null;
            byte[][] bit388_1_10 = null;
            bool[][] bit388_1_C  = null;
            bool[][] bit388_1_8  = null;

            if (hasSceneObjectData)
            {
                guid358        = new byte[2][];
                guid358_6      = new byte[2][][];
                bits358_10     = new uint[2];
                bits358_6_84   = new uint[2][];
                bits358_6_94   = new uint[2][];
                bits358_6_31   = new uint[2][];
                bits358_6_74   = new uint[2][];
                bit358_6_78_9  = new byte[2][][];
                bit358_6_88_10 = new byte[2][][];
                bit358_6_88_C  = new bool[2][][];
                bit358_6_88_8  = new bool[2][][];
                bit358_6_2E    = new bool[2][];
                bit358_6_30    = new bool[2][];
                bit358_A       = new bool[2];
                bit358_E       = new bool[2];
                bit358_22      = new bool[2];

                bit332 = !packet.ReadBit();
                packet.ReadBit("bit350", index);

                for (var i = 0; i < 2; ++i)
                {
                    guid358[i] = new byte[8];
                    packet.StartBitStream(guid358[i], 5, 2);
                    bit358_A[i]   = !packet.ReadBit();
                    bits358_10[i] = packet.ReadBits(2);

                    guid358_6[i]      = new byte[bits358_10[i]][];
                    bits358_6_84[i]   = new uint[bits358_10[i]];
                    bits358_6_94[i]   = new uint[bits358_10[i]];
                    bits358_6_31[i]   = new uint[bits358_10[i]];
                    bits358_6_74[i]   = new uint[bits358_10[i]];
                    bit358_6_78_9[i]  = new byte[bits358_10[i]][];
                    bit358_6_88_10[i] = new byte[bits358_10[i]][];
                    bit358_6_88_C[i]  = new bool[bits358_10[i]][];
                    bit358_6_88_8[i]  = new bool[bits358_10[i]][];
                    bit358_6_2E[i]    = new bool[bits358_10[i]];
                    bit358_6_30[i]    = new bool[bits358_10[i]];

                    for (var j = 0; j < bits358_10[i]; ++j)
                    {
                        guid358_6[i][j]    = new byte[8];
                        bits358_6_74[i][j] = packet.ReadBits(20);
                        bits358_6_31[i][j] = packet.ReadBits(7);

                        bit358_6_78_9[i][j] = new byte[bits358_6_74[i][j]];
                        for (var k = 0; k < bits358_6_74[i][j]; ++k)
                        {
                            bit358_6_78_9[i][j][k] = (byte)(10 - packet.ReadBit());
                        }

                        guid358_6[i][j][5] = packet.ReadBit();
                        bits358_6_94[i][j] = packet.ReadBits(21);
                        packet.StartBitStream(guid358_6[i][j], 1, 3, 2, 4, 7);

                        bit358_6_2E[i][j]  = !packet.ReadBit();
                        bit358_6_30[i][j]  = packet.ReadBit();
                        guid358_6[i][j][0] = packet.ReadBit();

                        bits358_6_84[i][j] = packet.ReadBits(21);

                        bit358_6_88_8[i][j]  = new bool[bits358_6_84[i][j]];
                        bit358_6_88_C[i][j]  = new bool[bits358_6_84[i][j]];
                        bit358_6_88_10[i][j] = new byte[bits358_6_84[i][j]];
                        for (var k = 0; k < bits358_6_84[i][j]; ++k)
                        {
                            bit358_6_88_10[i][j][k] = (byte)(10 - packet.ReadBit());
                            bit358_6_88_C[i][j][k]  = !packet.ReadBit();
                            bit358_6_88_8[i][j][k]  = !packet.ReadBit();
                        }

                        guid358_6[i][j][6] = packet.ReadBit();
                    }

                    bit358_E[i]  = !packet.ReadBit();
                    bit358_22[i] = !packet.ReadBit();
                    packet.StartBitStream(guid358[i], 4, 1, 7, 3, 6, 0);
                }

                packet.ReadBit(); // fake bit
                packet.StartBitStream(CreatorGUID, 7, 3, 2, 4, 0, 5, 6, 1);

                bits388     = new uint[3];
                bits388_10  = new uint[3];
                bit388_1_10 = new byte[3][];
                bit388_1_C  = new bool[3][];
                bit388_1_8  = new bool[3][];

                for (var i = 0; i < 3; ++i)
                {
                    bits388[i] = packet.ReadBits(21);

                    bit388_1_10[i] = new byte[bits388[i]];
                    bit388_1_C[i]  = new bool[bits388[i]];
                    bit388_1_8[i]  = new bool[bits388[i]];
                    for (var j = 0; j < bits388[i]; ++j)
                    {
                        bit388_1_8[i][j]  = !packet.ReadBit();
                        bit388_1_10[i][j] = (byte)(10 - packet.ReadBit());
                        bit388_1_C[i][j]  = !packet.ReadBit();
                    }

                    bits388_10[i] = packet.ReadBits(21);
                }

                packet.ReadBit("bit351", index);
                bit340 = !packet.ReadBit();
                bit330 = !packet.ReadBit();
                bit33C = !packet.ReadBit();
                bit341 = !packet.ReadBit();
                bit338 = !packet.ReadBit();
            }

            if (bit29C)
            {
                packet.ReadBit("bit20F", index);
                bit230 = packet.ReadBit();
                bit23C = packet.ReadBit();
                packet.ReadBit("bit20C", index);
                bit228 = packet.ReadBit();
                bit218 = packet.ReadBit();
                packet.ReadBit("bit20D", index);
                packet.ReadBit("bit20E", index);
                bit298 = packet.ReadBit();
                bit220 = packet.ReadBit();
                bit284 = packet.ReadBit();
                if (bit284)
                {
                    bits26C = packet.ReadBits(21);
                    bits25C = packet.ReadBits(21);
                }

                packet.ReadBit("bit210", index);
                if (bit298)
                {
                    bits288 = packet.ReadBits(20);
                }

                bit258 = packet.ReadBit();
            }

            if (hasAttackingTarget)
            {
                packet.StartBitStream(attackingTargetGuid, 4, 0, 6, 2, 1, 5, 3, 7);
            }

            if (bit428)
            {
                bits418 = packet.ReadBits(22);
            }

            if (bit32A)
            {
                bits2AA = packet.ReadBits(7);
            }

            if (hasAnimKits)
            {
                hasAnimKit1 = !packet.ReadBit();
                hasAnimKit2 = !packet.ReadBit();
                hasAnimKit3 = !packet.ReadBit();
            }

            packet.ResetBitReader();

            for (var i = 0; i < transportFrames; ++i)
            {
                packet.ReadInt32("Transport frame", index, i);
            }

            if (hasGameObjectPosition)
            {
                packet.ReadSByte("GO Transport Seat", index);
                if (hasGOTransportTime2)
                {
                    packet.ReadUInt32("GO Transport Time 2", index);
                }

                packet.ReadXORBytes(goTransportGuid, 4, 3);
                if (hasGOTransportTime3)
                {
                    packet.ReadUInt32("GO Transport Time 3", index);
                }

                packet.ReadXORBytes(goTransportGuid, 7, 6, 5, 0);
                moveInfo.TransportOffset.Z = packet.ReadSingle();
                moveInfo.TransportOffset.X = packet.ReadSingle();
                packet.ReadUInt32("GO Transport Time", index);
                moveInfo.TransportOffset.O = packet.ReadSingle();
                packet.ReadXORByte(goTransportGuid, 1);
                moveInfo.TransportOffset.Y = packet.ReadSingle();
                packet.ReadXORByte(goTransportGuid, 2);

                moveInfo.TransportGuid = new WowGuid64(BitConverter.ToUInt64(goTransportGuid, 0));
                packet.AddValue("GO Transport GUID", moveInfo.TransportGuid, index);
                packet.AddValue("GO Transport Position", moveInfo.TransportOffset, index);
            }

            if (isLiving)
            {
                if (hasTransportData)
                {
                    packet.ReadXORBytes(transportGuid, 0, 5);
                    moveInfo.TransportOffset.O = packet.ReadSingle();
                    packet.ReadXORByte(transportGuid, 1);
                    moveInfo.TransportOffset.Y = packet.ReadSingle();
                    packet.ReadXORByte(transportGuid, 2);
                    packet.ReadUInt32("Transport Time", index);
                    moveInfo.TransportOffset.Z = packet.ReadSingle();
                    packet.ReadXORByte(transportGuid, 7);
                    if (hasTransportTime2)
                    {
                        packet.ReadUInt32("Transport Time 2", index);
                    }

                    packet.ReadXORBytes(transportGuid, 6, 4);
                    moveInfo.TransportOffset.X = packet.ReadSingle();
                    packet.ReadXORByte(transportGuid, 3);
                    var seat = packet.ReadSByte("Transport Seat", index);
                    if (hasTransportTime3)
                    {
                        packet.ReadUInt32("Transport Time 3", index);
                    }

                    moveInfo.TransportGuid = new WowGuid64(BitConverter.ToUInt64(transportGuid, 0));
                    packet.AddValue("Transport GUID", moveInfo.TransportGuid, index);
                    packet.AddValue("Transport Position", moveInfo.TransportOffset, 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 (moveInfo.HasSplineData)
                {
                    if (hasFullSpline)
                    {
                        if (bit130)
                        {
                            for (var i = 0; i < bits11C; ++i)
                            {
                                packet.ReadSingle("Float13C+1", index, i);
                                packet.ReadSingle("Float13C+0", index, i);
                            }
                        }

                        packet.ReadSingle("Spline Duration Multiplier Next", index);

                        for (var i = 0u; i < splineCount; ++i)
                        {
                            var wp = new Vector3
                            {
                                Y = packet.ReadSingle(),
                                Z = packet.ReadSingle(),
                                X = packet.ReadSingle()
                            };

                            packet.AddValue("Spline Waypoint", wp, index, i);
                        }

                        packet.ReadInt32("Spline Time", index); // if need swap with "Spline Full Time"
                        var type = packet.ReadByte();
                        switch (type)
                        {
                        case 1:
                            splineType = SplineType.Normal;
                            break;

                        case 2:
                            splineType = SplineType.FacingSpot;
                            break;

                        case 3:
                            splineType = SplineType.FacingTarget;
                            break;

                        case 4:
                            splineType = SplineType.FacingAngle;
                            break;
                        }

                        if (splineType == SplineType.FacingAngle)
                        {
                            packet.ReadSingle("Facing Angle", index);
                        }

                        packet.ReadSingle("Spline Duration Multiplier", index); // if need swap with "Spline Duration Multiplier Next"
                        if (hasSplineStartTime)
                        {
                            packet.ReadInt32("Spline Start Time", index);
                        }

                        if (hasSplineVerticalAcceleration)
                        {
                            packet.ReadSingle("Spline Vertical Acceleration", index);
                        }

                        if (splineType == SplineType.FacingSpot)
                        {
                            var point = new Vector3
                            {
                                Y = packet.ReadSingle(),
                                Z = packet.ReadSingle(),
                                X = packet.ReadSingle()
                            };

                            packet.AddValue("Facing Spot", point, index);
                        }

                        packet.ReadInt32("Spline Full Time", index);
                    }

                    packet.ReadInt32("Spline Id", index);
                    moveInfo.Position.Y = packet.ReadSingle();
                    moveInfo.Position.Z = packet.ReadSingle();
                    moveInfo.Position.X = packet.ReadSingle();
                }

                moveInfo.Position.Y = packet.ReadSingle();
                packet.ReadXORByte(guid1, 7);
                for (var i = 0; i < bits160; ++i)
                {
                    packet.ReadSingle("Float14", index, i);
                    packet.ReadUInt32("Int0", index, i);
                    packet.ReadUInt32("Int10", index, i);
                    packet.ReadSingle("Float4", index, i);
                    packet.ReadSingle("Float8", index, i);
                    packet.ReadSingle("FloatC", index, i);
                }

                if (hasFallData)
                {
                    packet.ReadUInt32("Time Fallen", index);
                    if (hasFallDirection)
                    {
                        packet.ReadSingle("Jump Sin", index);
                        packet.ReadSingle("Jump Cos", index);
                        packet.ReadSingle("Jump Velocity", index);
                    }

                    packet.ReadSingle("Fall Start Velocity", index);
                }

                if (hasSplineElevation)
                {
                    packet.ReadSingle("Spline Elevation", index);
                }

                if (bitA0)
                {
                    packet.ReadInt32("Int98", index);
                }

                packet.ReadXORByte(guid1, 1);
                packet.ReadSingle("Turn Speed", index);
                packet.ReadSingle("FlyBack Speed", index);
                packet.ReadSingle("RunBack Speed", index);

                if (hasTimestamp)
                {
                    packet.ReadUInt32("Time", index);
                }

                moveInfo.Position.X = packet.ReadSingle();
                packet.ReadXORByte(guid1, 2);
                packet.ReadSingle("Swim Speed", index);
                packet.ReadSingle("SwimBack Speed", index);

                if (hasOrientation)
                {
                    moveInfo.Orientation = packet.ReadSingle();
                }

                packet.ReadSingle("Fly Speed", index);
                packet.ReadXORByte(guid1, 6);

                if (hasPitch)
                {
                    packet.ReadSingle("Pitch", index);
                }

                moveInfo.RunSpeed = packet.ReadSingle("Run Speed", index) / 7.0f;
                packet.ReadSingle("Pitch Speed", index);
                packet.ReadXORBytes(guid1, 0, 5);

                for (var i = 0; i < bits90; ++i)
                {
                    packet.ReadInt32("Int8C", index, i);
                }

                packet.ReadXORByte(guid1, 4);
                moveInfo.WalkSpeed  = packet.ReadSingle("Walk Speed", index) / 2.5f;
                moveInfo.Position.Z = packet.ReadSingle();
                packet.ReadXORByte(guid1, 3);

                packet.WriteGuid("GUID1", guid1, index);
                packet.AddValue("Position", moveInfo.Position, index);
                packet.AddValue("Orientation", moveInfo.Orientation, index);
            }

            if (hasSceneObjectData)
            {
                for (var i = 0; i < 2; ++i)
                {
                    if (bit358_22[i])
                    {
                        packet.ReadByte("byte358+22", index, i);
                    }

                    packet.ReadByte("byte358+23", index, i);

                    for (var j = 0; j < bits358_10[i]; ++j)
                    {
                        packet.ReadXORByte(guid358_6[i][j], 7);
                        packet.ReadInt32("int358+6+1C", index, i, j);
                        packet.ReadWoWString("string358+6+31", (int)bits358_6_31[i][j], index, i, j);

                        for (var k = 0; k < bits358_6_74[i][j]; ++k)
                        {
                            packet.ReadInt16("short358+6+78+6", index, i, j, k);
                            packet.ReadInt32("int358+6+78+0", index, i, j, k);
                            if (bit358_6_78_9[i][j][k] != 9)
                            {
                                packet.ReadByte("byte358+6+78+9", index, i, j, k);
                            }

                            packet.ReadInt16("short358+6+78+4", index, i, j, k);
                            packet.ReadByte("byte358+6+78+8", index, i, j, k);
                        }

                        for (var k = 0; k < bits358_6_94[i][j]; ++k)
                        {
                            packet.ReadInt32("int358+6+98+4", index, i, j, k);
                            packet.ReadInt32("int358+6+98+0", index, i, j, k);
                        }

                        packet.ReadXORByte(guid358_6[i][j], 6);
                        packet.ReadInt16("short358+6+2C", index, i, j);

                        if (bit358_6_2E[i][j])
                        {
                            packet.ReadInt16("short358+6+2E", index, i, j);
                        }

                        for (var k = 0; k < bits358_6_84[i][j]; ++k)
                        {
                            if (bit358_6_88_10[i][j][k] != 9)
                            {
                                packet.ReadByte("byte358+6+88+10", index, i, j, k);
                            }

                            if (bit358_6_88_8[i][j][k])
                            {
                                packet.ReadInt32("int358+6+88+8", index, i, j, k);
                            }

                            packet.ReadInt32("int358+6+88+0", index, i, j, k);
                            packet.ReadInt32("int358+6+88+4", index, i, j, k);

                            if (bit358_6_88_C[i][j][k])
                            {
                                packet.ReadInt32("int358+6+88+C", index, i, j, k);
                            }
                        }

                        packet.ReadInt16("short358+6+16", index, i, j);
                        packet.ReadInt32("int358+6+8", index, i, j);
                        packet.ReadInt16("short358+6+14", index, i, j);
                        packet.ReadInt32("int358+6+24", index, i, j);

                        if (!bit358_6_30[i][j])
                        {
                            packet.ReadByte("byte358+6+30", index, i, j);
                        }

                        packet.ReadInt32("int358+6+10", index, i, j);
                        packet.ReadXORByte(guid358_6[i][j], 3);
                        packet.ReadInt32("int358+6+28", index, i, j);
                        packet.ReadInt32("int358+6+18", index, i, j);
                        packet.ReadXORBytes(guid358_6[i][j], 0, 2, 4, 5);
                        packet.ReadInt32("int358+6+C", index, i, j);
                        packet.ReadInt32("int358+6+20", index, i, j);
                        packet.ReadXORByte(guid358_6[i][j], 1);

                        packet.WriteGuid("Guid 358_6", guid358_6[i][j], index, i, j);
                    }

                    packet.ReadXORBytes(guid358[i], 7, 1, 4);

                    if (bit358_E[i])
                    {
                        packet.ReadInt16("short358+E", index, i);
                    }

                    if (bit358_A[i])
                    {
                        packet.ReadInt32("int358+A", index, i);
                    }

                    packet.ReadXORBytes(guid358[i], 0, 5, 2, 3);
                    packet.ReadInt32("int358+8", index, i);
                    packet.ReadXORByte(guid358[i], 6);
                    packet.WriteGuid("Guid358", guid358[i], index, i);
                }

                for (var i = 0; i < 3; ++i)
                {
                    for (var j = 0; j < bits388[i]; ++j)
                    {
                        if (bit388_1_C[i][j])
                        {
                            packet.ReadInt32("int388+1+C", index, i, j);
                        }

                        packet.ReadInt32("int388+1+4", index, i, j);
                        packet.ReadInt32("int388+1+0", index, i, j);

                        if (bit388_1_10[i][j] != 9)
                        {
                            packet.ReadByte("byte388+1+10", index, i, j);
                        }

                        if (bit388_1_8[i][j])
                        {
                            packet.ReadInt32("int388+1+8", index, i, j);
                        }
                    }

                    for (var j = 0; j < bits388_10[i]; ++j)
                    {
                        packet.ReadInt32("int388+6+4", index, i, j);
                        packet.ReadInt32("int388+6+0", index, i, j);
                    }
                }

                packet.ReadInt32("Int334", index);
                packet.ParseBitStream(CreatorGUID, 1, 6, 0, 5, 7, 4, 3, 2);

                if (bit340)
                {
                    packet.ReadByte("Byte340", index);
                }

                if (bit341)
                {
                    packet.ReadByte("byte341", index);
                }

                if (bit338)
                {
                    packet.ReadInt32("int338", index);
                }

                if (bit332)
                {
                    packet.ReadInt16("Short332", index);
                }

                if (bit33C)
                {
                    packet.ReadInt32("int33C", index);
                }

                if (bit330)
                {
                    packet.ReadInt16("Short318", index);
                }

                packet.WriteGuid("Creator GUID", CreatorGUID, index);
            }

            if (hasStationaryPosition)
            {
                moveInfo.Position.X  = packet.ReadSingle();
                moveInfo.Position.Z  = packet.ReadSingle();
                moveInfo.Position.Y  = packet.ReadSingle();
                moveInfo.Orientation = packet.ReadSingle("Stationary Orientation", index);

                packet.AddValue("Stationary Position", moveInfo.Position, index);
            }

            if (hasAttackingTarget)
            {
                packet.ParseBitStream(attackingTargetGuid, 1, 3, 5, 4, 7, 6, 2, 0);
                packet.WriteGuid("Attacking GUID", attackingTargetGuid, index);
            }

            if (bit29C)
            {
                if (bit230)
                {
                    packet.ReadInt32("int22C", index);
                }

                if (bit258)
                {
                    packet.ReadSingle("Float240", index);
                    packet.ReadSingle("Float24C", index);
                    packet.ReadSingle("Float250", index);
                    packet.ReadSingle("Float244", index);
                    packet.ReadSingle("Float254", index);
                    packet.ReadSingle("Float248", index);
                }

                packet.ReadInt32("Int208", index);

                if (bit23C)
                {
                    packet.ReadSingle("Float234", index);
                    packet.ReadSingle("Float238", index);
                }

                if (bit220)
                {
                    packet.ReadInt32("int21C", index);
                }

                if (bit284)
                {
                    packet.ReadSingle("Float27C", index);
                    packet.ReadSingle("Float280", index);

                    for (var i = 0; i < bits25C; ++i)
                    {
                        packet.ReadSingle("Float260+0", index, i);
                        packet.ReadSingle("Float260+1", index, i);
                    }

                    for (var i = 0; i < bits26C; ++i)
                    {
                        packet.ReadSingle("Float270+1", index, i);
                        packet.ReadSingle("Float270+0", index, i);
                    }
                }

                if (bit218)
                {
                    packet.ReadInt32("int214", index);
                }

                if (bit298)
                {
                    for (var i = 0; i < bits288; ++i)
                    {
                        packet.ReadSingle("Float28C+0", index, i);
                        packet.ReadSingle("Float28C+1", index, i);
                        packet.ReadSingle("Float28C+2", index, i);
                    }
                }

                if (bit228)
                {
                    packet.ReadInt32("int224", index);
                }
            }

            if (bit1DC)
            {
                packet.ReadInt32("int1D8", index);
            }

            if (hasAnimKits)
            {
                if (hasAnimKit2)
                {
                    packet.ReadUInt16("Anim Kit 2", index);
                }
                if (hasAnimKit3)
                {
                    packet.ReadUInt16("Anim Kit 3", index);
                }
                if (hasAnimKit1)
                {
                    packet.ReadUInt16("Anim Kit 1", index);
                }
            }


            if (hasGameObjectRotation)
            {
                moveInfo.Rotation = packet.ReadPackedQuaternion("GameObject Rotation", index);
            }

            if (hasVehicleData)
            {
                moveInfo.VehicleId = packet.ReadUInt32("Vehicle Id", index);
                packet.ReadSingle("Vehicle Orientation", index);
            }

            if (bit32A)
            {
                packet.ReadBytes("Bytes", (int)bits2AA);
            }

            if (bit414)
            {
                packet.ReadInt32("int410", index);
            }

            if (bit2A4)
            {
                packet.ReadInt32("int2A0", index);
            }

            if (bit428)
            {
                for (var i = 0; i < bits418; ++i)
                {
                    packet.ReadInt32("Int3F8", index, i);
                }
            }

            if (isLiving && moveInfo.HasSplineData && hasFullSpline && splineType == SplineType.FacingTarget)
            {
                var facingTargetGuid = new byte[8];
                facingTargetGuid = packet.StartBitStream(5, 0, 2, 4, 1, 3, 6, 7);
                packet.ParseBitStream(facingTargetGuid, 5, 0, 4, 6, 3, 2, 1, 7);
                packet.WriteGuid("Facing Target GUID", facingTargetGuid, index);
            }

            return(moveInfo);
        }
Exemple #5
0
        public void Update(MovementInfo ob)
        {
            if (ob.SourceRegion == null || ob.SourceRegion.Map != SelectedInfo)
            {
                return;
            }
            if (ob.DestinationRegion?.Map == null || ob.Icon == MapIcon.None)
            {
                return;
            }

            Size size = GetMapSize(SelectedInfo.FileName);

            if (ob.SourceRegion.PointList == null)
            {
                ob.SourceRegion.CreatePoints(size.Width);
            }

            int minX = size.Width, maxX = 0, minY = size.Height, maxY = 0;

            foreach (Point point in ob.SourceRegion.PointList)
            {
                if (point.X < minX)
                {
                    minX = point.X;
                }
                if (point.X > maxX)
                {
                    maxX = point.X;
                }

                if (point.Y < minY)
                {
                    minY = point.Y;
                }
                if (point.Y > maxY)
                {
                    maxY = point.Y;
                }
            }

            int x = (minX + maxX) / 2;
            int y = (minY + maxY) / 2;


            DXImageControl control;

            MapInfoObjects[ob] = control = new DXImageControl
            {
                LibraryFile  = LibraryFile.Interface,
                Parent       = Image,
                Opacity      = Opacity,
                ImageOpacity = Opacity,
                Hint         = ob.DestinationRegion.Map.Description,
            };
            control.OpacityChanged += (o, e) => control.ImageOpacity = control.Opacity;

            switch (ob.Icon)
            {
            case MapIcon.Cave:
                control.Index      = 70;
                control.ForeColour = Color.Red;
                break;

            case MapIcon.Exit:
                control.Index      = 70;
                control.ForeColour = Color.Green;
                break;

            case MapIcon.Down:
                control.Index      = 70;
                control.ForeColour = Color.MediumVioletRed;
                break;

            case MapIcon.Up:
                control.Index      = 70;
                control.ForeColour = Color.DeepSkyBlue;
                break;

            case MapIcon.Province:
                control.Index       = 6125;
                control.LibraryFile = LibraryFile.GameInter;
                break;

            case MapIcon.Building:
                control.Index       = 6124;
                control.LibraryFile = LibraryFile.GameInter;
                break;
            }
            control.MouseClick += (o, e) => SelectedInfo = ob.DestinationRegion.Map;
            control.Location    = new Point((int)(ScaleX * x) - control.Size.Width / 2, (int)(ScaleY * y) - control.Size.Height / 2);
        }
        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);
        }
        private static MovementInfo ReadMovementUpdateBlock(Packet packet, WowGuid guid, 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      = packet.ReadBitsE <MovementFlag>("Movement Flags", 30, index);
                moveInfo.FlagsExtra = packet.ReadBitsE <MovementFlagExtra>("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);
                    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 (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 <SplineFlag434>("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("SpellEffectExtraGUID", index);
                            packet.ReadUInt32("SpellEffectExtra int 1", index);
                            packet.ReadUInt32("SpellEffectExtra int 2", index);
                            packet.ReadUInt32("SpellEffectExtra int 3", 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)
            {
                packet.ResetBitReader();

                // CliAreaTrigger
                packet.ReadInt32("ElapsedMs", index);

                packet.ReadVector3("RollPitchYaw1", index);

                packet.ReadBit("HasAbsoluteOrientation", index);
                packet.ReadBit("HasDynamicShape", index);
                packet.ReadBit("HasAttached", index);
                packet.ReadBit("HasFaceMovementDir", index);
                packet.ReadBit("HasFollowsTerrain", index);
                packet.ReadBit("Unk bit WoD62x", index);

                var hasTargetRollPitchYaw = packet.ReadBit("HasTargetRollPitchYaw", index);
                var hasScaleCurveID       = packet.ReadBit("HasScaleCurveID", index);
                var hasMorphCurveID       = packet.ReadBit("HasMorphCurveID", index);
                var hasFacingCurveID      = packet.ReadBit("HasFacingCurveID", index);
                var hasMoveCurveID        = packet.ReadBit("HasMoveCurveID", index);
                var unkbit4C               = packet.ReadBit();
                var unkbit50               = packet.ReadBit();
                var unkbit58               = packet.ReadBit();
                var hasAreaTriggerSphere   = packet.ReadBit("HasAreaTriggerSphere", index);
                var hasAreaTriggerBox      = packet.ReadBit("HasAreaTriggerBox", index);
                var hasAreaTriggerPolygon  = packet.ReadBit("HasAreaTriggerPolygon", index);
                var hasAreaTriggerCylinder = packet.ReadBit("HasAreaTriggerCylinder", index);
                var hasAreaTriggerSpline   = packet.ReadBit("HasAreaTriggerSpline", index);
                var hasAreaTriggerUnkType  = packet.ReadBit("HasAreaTriggerUnkType", index);

                if (unkbit50)
                {
                    packet.ReadBit();
                }

                if (hasAreaTriggerSpline)
                {
                    AreaTriggerHandler.ReadAreaTriggerSpline(packet, index);
                }

                if (hasTargetRollPitchYaw)
                {
                    packet.ReadVector3("TargetRollPitchYaw", index);
                }

                if (hasScaleCurveID)
                {
                    packet.ReadInt32("ScaleCurveID", index);
                }

                if (hasMorphCurveID)
                {
                    packet.ReadInt32("MorphCurveID", index);
                }

                if (hasFacingCurveID)
                {
                    packet.ReadInt32("FacingCurveID", index);
                }

                if (hasMoveCurveID)
                {
                    packet.ReadInt32("MoveCurveID", index);
                }

                if (unkbit4C)
                {
                    packet.ReadInt32();
                }

                if (unkbit58)
                {
                    packet.ReadUInt32();
                }

                if (hasAreaTriggerSphere)
                {
                    packet.ReadSingle("Radius", index);
                    packet.ReadSingle("RadiusTarget", index);
                }

                if (hasAreaTriggerBox)
                {
                    packet.ReadVector3("Extents", index);
                    packet.ReadVector3("ExtentsTarget", index);
                }

                if (hasAreaTriggerPolygon)
                {
                    var verticesCount       = packet.ReadInt32("VerticesCount", index);
                    var verticesTargetCount = packet.ReadInt32("VerticesTargetCount", index);
                    packet.ReadSingle("Height", index);
                    packet.ReadSingle("HeightTarget", index);

                    for (var i = 0; i < verticesCount; ++i)
                    {
                        packet.ReadVector2("Vertices", index, i);
                    }

                    for (var i = 0; i < verticesTargetCount; ++i)
                    {
                        packet.ReadVector2("VerticesTarget", index, i);
                    }
                }

                if (hasAreaTriggerCylinder)
                {
                    packet.ReadSingle("Radius", index);
                    packet.ReadSingle("RadiusTarget", index);
                    packet.ReadSingle("Height", index);
                    packet.ReadSingle("HeightTarget", index);
                    packet.ReadSingle("LocationZOffset", index);
                    packet.ReadSingle("LocationZOffsetTarget", index);
                }

                if (hasAreaTriggerUnkType)
                {
                    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);
                    }
                }
            }

            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);
        }
Exemple #8
0
        private static MovementInfo ReadMovementInfo420(ref Packet packet, int index)
        {
            var info = new MovementInfo();

            info.Flags = packet.ReadEnum <MovementFlag>("Movement Flags", 30, index);

            packet.ReadEnum <MovementFlagExtra>("Extra Movement Flags", 12, index);

            var onTransport             = packet.ReadBit("OnTransport", index);
            var hasInterpolatedMovement = false;
            var time3 = false;

            if (onTransport)
            {
                hasInterpolatedMovement = packet.ReadBit("HasInterpolatedMovement", index);
                time3 = packet.ReadBit("Time3", index);
            }

            var swimming            = packet.ReadBit("Swimming", index);
            var interPolatedTurning = packet.ReadBit("InterPolatedTurning", index);

            var jumping = false;

            if (interPolatedTurning)
            {
                jumping = packet.ReadBit("Jumping", index);
            }

            var splineElevation = packet.ReadBit("SplineElevation", index);

            info.HasSplineData = packet.ReadBit("HasSplineData", index);

            packet.ResetBitReader(); // reset bitreader

            packet.ReadGuid("GUID 2", index);

            packet.ReadInt32("Time", index);

            info.Position    = packet.ReadVector3("Position", index);
            info.Orientation = packet.ReadSingle("Orientation", index);

            if (onTransport)
            {
                packet.ReadGuid("Transport GUID", index);
                packet.ReadVector4("Transport Position", index);
                packet.ReadByte("Transport Seat", index);
                packet.ReadInt32("Transport Time", index);
                if (hasInterpolatedMovement)
                {
                    packet.ReadInt32("Transport Time 2", index);
                }
                if (time3)
                {
                    packet.ReadInt32("Transport Time 3", index);
                }
            }
            if (swimming)
            {
                packet.ReadSingle("Swim Pitch", index);
            }

            if (interPolatedTurning)
            {
                packet.ReadInt32("Time Fallen", index);
                packet.ReadSingle("Fall Start Velocity", index);
                if (jumping)
                {
                    packet.ReadSingle("Jump Sin", index);
                    packet.ReadSingle("Jump Cos", index);
                    packet.ReadSingle("Jump Velocity", index);
                }
            }
            if (splineElevation)
            {
                packet.ReadSingle("Spline Elevation", index);
            }

            return(info);
        }
Exemple #9
0
        private static MovementInfo ReadMovementInfoGen(ref Packet packet, Guid guid, int index)
        {
            var info = new MovementInfo();

            info.Flags = packet.ReadEnum <MovementFlag>("Movement Flags", TypeCode.Int32, index);

            var flagsTypeCode = ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056) ? TypeCode.Int16 : TypeCode.Byte;

            info.FlagsExtra = packet.ReadEnum <MovementFlagExtra>("Extra Movement Flags", flagsTypeCode, index);

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_2_14545))
            {
                if (packet.ReadGuid("GUID 2", index) != guid)
                {
                    throw new InvalidDataException("Guids are not equal.");
                }
            }

            packet.ReadInt32("Time", index);

            info.Position    = packet.ReadVector3("Position", index);
            info.Orientation = packet.ReadSingle("Orientation", index);

            if (info.Flags.HasAnyFlag(MovementFlag.OnTransport))
            {
                if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767))
                {
                    packet.ReadPackedGuid("Transport GUID", index);
                }
                else
                {
                    packet.ReadGuid("Transport GUID", index);
                }

                packet.ReadVector4("Transport Position", index);
                packet.ReadInt32("Transport Time", index);

                if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                {
                    packet.ReadByte("Transport Seat", index);
                }

                if (info.FlagsExtra.HasAnyFlag(MovementFlagExtra.InterpolateMove))
                {
                    packet.ReadInt32("Transport Time", index);
                }
            }

            if (info.Flags.HasAnyFlag(MovementFlag.Swimming | MovementFlag.Flying) ||
                info.FlagsExtra.HasAnyFlag(MovementFlagExtra.AlwaysAllowPitching))
            {
                packet.ReadSingle("Swim Pitch", index);
            }

            if (ClientVersion.RemovedInVersion(ClientType.Cataclysm))
            {
                packet.ReadInt32("Fall Time", index);
            }

            if (info.Flags.HasAnyFlag(MovementFlag.Falling))
            {
                if (ClientVersion.AddedInVersion(ClientType.Cataclysm))
                {
                    packet.ReadInt32("Fall Time", index);
                }

                packet.ReadSingle("Fall Velocity", index);
                packet.ReadSingle("Fall Sin Angle", index);
                packet.ReadSingle("Fall Cos Angle", index);
                packet.ReadSingle("Fall Speed", index);
            }

            if (ClientVersion.RemovedInVersion(ClientVersionBuild.V4_2_2_14545))
            {
                if (info.Flags.HasAnyFlag(MovementFlag.SplineElevation))
                {
                    packet.ReadSingle("Spline Elevation", index);
                }
            }

            return(info);
        }
 public ClientMovementInfoEventArgs(MovementInfo MI)
 {
     this.mi = MI;
 }
Exemple #11
0
        void HandleMovementOpcode(ClientOpcodes opcode, MovementInfo movementInfo)
        {
            Unit   mover    = GetPlayer().GetUnitBeingMoved();
            Player plrMover = mover.ToPlayer();

            if (plrMover && plrMover.IsBeingTeleported())
            {
                return;
            }

            GetPlayer().ValidateMovementInfo(movementInfo);

            if (movementInfo.Guid != mover.GetGUID())
            {
                Log.outError(LogFilter.Network, "HandleMovementOpcodes: guid error");
                return;
            }
            if (!movementInfo.Pos.IsPositionValid())
            {
                Log.outError(LogFilter.Network, "HandleMovementOpcodes: Invalid Position");
                return;
            }

            if (!mover.MoveSpline.Finalized())
            {
                return;
            }

            // stop some emotes at player move
            if (plrMover && (plrMover.GetEmoteState() != 0))
            {
                plrMover.SetEmoteState(Emote.OneshotNone);
            }

            //handle special cases
            if (!movementInfo.transport.guid.IsEmpty())
            {
                // We were teleported, skip packets that were broadcast before teleport
                if (movementInfo.Pos.GetExactDist2d(mover) > MapConst.SizeofGrids)
                {
                    return;
                }

                if (Math.Abs(movementInfo.transport.pos.GetPositionX()) > 75f || Math.Abs(movementInfo.transport.pos.GetPositionY()) > 75f || Math.Abs(movementInfo.transport.pos.GetPositionZ()) > 75f)
                {
                    return;
                }

                if (!GridDefines.IsValidMapCoord(movementInfo.Pos.posX + movementInfo.transport.pos.posX, movementInfo.Pos.posY + movementInfo.transport.pos.posY,
                                                 movementInfo.Pos.posZ + movementInfo.transport.pos.posZ, movementInfo.Pos.Orientation + movementInfo.transport.pos.Orientation))
                {
                    return;
                }

                if (plrMover)
                {
                    if (!plrMover.GetTransport())
                    {
                        Transport transport = plrMover.GetMap().GetTransport(movementInfo.transport.guid);
                        if (transport)
                        {
                            transport.AddPassenger(plrMover);
                        }
                    }
                    else if (plrMover.GetTransport().GetGUID() != movementInfo.transport.guid)
                    {
                        plrMover.GetTransport().RemovePassenger(plrMover);
                        Transport transport = plrMover.GetMap().GetTransport(movementInfo.transport.guid);
                        if (transport)
                        {
                            transport.AddPassenger(plrMover);
                        }
                        else
                        {
                            movementInfo.ResetTransport();
                        }
                    }
                }

                if (!mover.GetTransport() && !mover.GetVehicle())
                {
                    GameObject go = mover.GetMap().GetGameObject(movementInfo.transport.guid);
                    if (!go || go.GetGoType() != GameObjectTypes.Transport)
                    {
                        movementInfo.transport.Reset();
                    }
                }
            }
            else if (plrMover && plrMover.GetTransport())                // if we were on a transport, leave
            {
                plrMover.GetTransport().RemovePassenger(plrMover);
            }

            // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
            if (opcode == ClientOpcodes.MoveFallLand && plrMover && !plrMover.IsInFlight())
            {
                plrMover.HandleFall(movementInfo);
            }

            // interrupt parachutes upon falling or landing in water
            if (opcode == ClientOpcodes.MoveFallLand || opcode == ClientOpcodes.MoveStartSwim || opcode == ClientOpcodes.MoveSetFly)
            {
                mover.RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags.LandingOrFlight); // Parachutes
            }
            movementInfo.Guid    = mover.GetGUID();
            movementInfo.Time    = AdjustClientMovementTime(movementInfo.Time);
            mover.m_movementInfo = movementInfo;

            // Some vehicles allow the passenger to turn by himself
            Vehicle vehicle = mover.GetVehicle();

            if (vehicle)
            {
                VehicleSeatRecord seat = vehicle.GetSeatForPassenger(mover);
                if (seat != null)
                {
                    if (seat.HasFlag(VehicleSeatFlags.AllowTurning))
                    {
                        if (movementInfo.Pos.GetOrientation() != mover.GetOrientation())
                        {
                            mover.SetOrientation(movementInfo.Pos.GetOrientation());
                            mover.RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags.Turning);
                        }
                    }
                }
                return;
            }

            mover.UpdatePosition(movementInfo.Pos);

            MoveUpdate moveUpdate = new();

            moveUpdate.Status = mover.m_movementInfo;
            mover.SendMessageToSet(moveUpdate, GetPlayer());

            if (plrMover)                                            // nothing is charmed, or player charmed
            {
                if (plrMover.IsSitState() && movementInfo.HasMovementFlag(MovementFlag.MaskMoving | MovementFlag.MaskTurning))
                {
                    plrMover.SetStandState(UnitStandStateType.Stand);
                }

                plrMover.UpdateFallInformationIfNeed(movementInfo, opcode);

                if (movementInfo.Pos.posZ < plrMover.GetMap().GetMinHeight(plrMover.GetPhaseShift(), movementInfo.Pos.GetPositionX(), movementInfo.Pos.GetPositionY()))
                {
                    if (!(plrMover.GetBattleground() && plrMover.GetBattleground().HandlePlayerUnderMap(GetPlayer())))
                    {
                        // NOTE: this is actually called many times while falling
                        // even after the player has been teleported away
                        // @todo discard movement packets after the player is rooted
                        if (plrMover.IsAlive())
                        {
                            plrMover.AddPlayerFlag(PlayerFlags.IsOutOfBounds);
                            plrMover.EnvironmentalDamage(EnviromentalDamage.FallToVoid, (uint)GetPlayer().GetMaxHealth());
                            // player can be alive if GM/etc
                            // change the death state to CORPSE to prevent the death timer from
                            // starting in the next player update
                            if (plrMover.IsAlive())
                            {
                                plrMover.KillPlayer();
                            }
                        }
                    }
                }
                else
                {
                    plrMover.RemovePlayerFlag(PlayerFlags.IsOutOfBounds);
                }

                if (opcode == ClientOpcodes.MoveJump)
                {
                    plrMover.RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags2.Jump); // Mind Control
                    Unit.ProcSkillsAndAuras(plrMover, null, ProcFlags.Jump, ProcFlags.None, ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.None, ProcFlagsHit.None, null, null, null);
                }
            }
        }
Exemple #12
0
 public DiamondMovement(GameObject _player, MovementInfo _info)
 {
     player = _player;
     info   = _info;
     rb     = _player.GetComponent <Rigidbody>();
 }
        /// <summary>
        /// Update is called every frame, if the MonoBehaviour is enabled.
        /// </summary>
        void Update()
        {
            if (!isLocalPlayer)
            {
                return;
            }
            if (Mathf.Approximately(Time.deltaTime, 0))
            {
                return;
            }
            if (HitState != null && HitState.Hitstun > 0)
            {
                return;
            }
            if (CurrentState.Data.MovementType == MovementType.Locked)
            {
                PhysicsState.SetHorizontalVelocity(0f);
                PhysicsState.SetVerticalVelocity(0f);
                return;
            }
            var movement = new MovementInfo {
                facing = Direction
            };

            // If currently hanging from a edge
            if (CurrentLedge != null)
            {
                LedgeMovement();
                if (Time.time > _grabTime + Config.Player.MaxLedgeHangTime)
                {
                    CurrentLedge = null;
                }
                else
                {
                    PhysicsState.SetHorizontalVelocity(movement.Speed.x);
                    return;
                }
            }
            var movementInput = InputState.Movement;

            if (PhysicsState.IsGrounded)
            {
                IsFastFalling = false;
                if (JumpCount != MaxJumpCount)
                {
                    CmdResetJumps();
                }
                if (movementInput.x > DirectionalInput.DeadZone)
                {
                    movement.facing = true;
                }
                if (movementInput.x < -DirectionalInput.DeadZone)
                {
                    movement.facing = false;
                }
                Direction = movement.facing;
            }
            else
            {
                if (GetKeysDown(KeyCode.S, KeyCode.DownArrow) || InputState.Smash.y < -DirectionalInput.DeadZone)
                {
                    IsFastFalling = true;
                }
                LimitFallSpeed();
            }
            movement = ApplyControlledMovement(movement, movementInput);
            PhysicsState.SetHorizontalVelocity(movement.Speed.x);
        }
Exemple #14
0
        private static MovementInfo ReadMovementUpdateBlock(ref Packet packet, Guid guid, int index)
        {
            var moveInfo = new MovementInfo();

            var guid1               = new byte[8];
            var transportGuid       = new byte[8];
            var goTransportGuid     = new byte[8];
            var attackingTargetGuid = new byte[8];

            var hasAnimKit1                   = false;
            var hasAnimKit2                   = false;
            var hasAnimKit3                   = false;
            var hasFullSpline                 = false;
            var hasSplineStartTime            = false;
            var hasSplineVerticalAcceleration = false;
            var hasGOTransportTime2           = false;
            var hasGOTransportTime3           = false;
            var hasSplineElevation            = false;
            var hasMovementFlags              = false;
            var hasMoveFlagsExtra             = false;
            var hasTimestamp                  = false;
            var hasOrientation                = false;
            var hasTransportData              = false;
            var hasTransportTime3             = false;
            var hasTransportTime2             = false;
            var hasPitch         = false;
            var hasFallData      = false;
            var hasFallDirection = false;

            var bit130 = false;
            var bit98  = false;
            var bit23C = false;
            var bit298 = false;
            var bit230 = false;
            var bit284 = false;
            var bit228 = false;
            var bit258 = false;
            var bit218 = false;
            var bit220 = false;

            var        bits160     = 0u;
            var        splineCount = 0u;
            var        bits11C     = 0u;
            var        bits88      = 0u;
            var        bits25C     = 0u;
            var        bits26C     = 0u;
            var        bits288     = 0u;
            var        bits418     = 0u;
            var        bits2AA     = 0u;
            SplineType splineType  = SplineType.Stop;

            var bit29C             = packet.ReadBit();
            var hasSceneObjectData = packet.ReadBit("Has Scene Object Data", index);
            var bit2A4             = packet.ReadBit();
            var bit1DC             = packet.ReadBit();
            var bit32A             = packet.ReadBit();
            var hasAnimKits        = packet.ReadBit("Has Anim Kits", index);
            var bit2A8             = packet.ReadBit();
            var bit414             = packet.ReadBit();
            var transportFrames    = packet.ReadBits("Transport Frames Count", 22, index);

            packet.ReadBit(); // fake 2
            packet.ReadBit(); // fake 1
            var isLiving = packet.ReadBit("Is Living", index);
            var hasStationaryPosition = packet.ReadBit("Has Stationary Position", index);
            var hasGameObjectPosition = packet.ReadBit("Has GameObject Position", index);
            var hasGameObjectRotation = packet.ReadBit("Has GameObject Rotation", index);
            var hasAttackingTarget    = packet.ReadBit("Has Attacking Target", index);
            var bit428 = packet.ReadBit();

            packet.ReadBit(); // fake 3
            packet.ReadBit(); // fake 0
            var bit2A9         = packet.ReadBit();
            var hasVehicleData = packet.ReadBit("Has Vehicle Data", index);

            if (hasGameObjectPosition)
            {
                packet.StartBitStream(goTransportGuid, 5, 0, 6);
                hasGOTransportTime2 = packet.ReadBit();
                packet.StartBitStream(goTransportGuid, 7, 3, 2);
                hasGOTransportTime3 = packet.ReadBit();
                packet.StartBitStream(goTransportGuid, 4, 1);
            }

            // Sceneobject data
            var CreatorGUID = new byte[8];

            byte[][]   guid358        = null;
            byte[][][] guid358_6      = null;
            uint[]     bits358_5      = null;
            uint[][]   bits358_6_84   = null;
            uint[][]   bits358_6_94   = null;
            uint[][]   bits358_6_31   = null;
            uint[][]   bits358_6_74   = null;
            byte[][][] bit358_6_78_9  = null;
            byte[][][] bit358_6_88_10 = null;
            bool[][][] bit358_6_88_C  = null;
            bool[][][] bit358_6_88_8  = null;
            bool[][]   bit358_6_2E    = null;
            bool[][]   bit358_6_30    = null;
            bool[]     bit358_10      = null;
            bool[]     bit358_C       = null;
            bool[]     bit358_24      = null;

            var bit338 = false;
            var bit330 = false;
            var bit341 = false;
            var bit340 = false;
            var bit332 = false;
            var bit33C = false;

            uint[]   bits388     = null;
            uint[]   bits388_10  = null;
            byte[][] bit388_1_10 = null;
            bool[][] bit388_1_C  = null;
            bool[][] bit388_1_8  = null;

            if (hasSceneObjectData)
            {
                guid358        = new byte[2][];
                guid358_6      = new byte[2][][];
                bits358_5      = new uint[2];
                bits358_6_84   = new uint[2][];
                bits358_6_94   = new uint[2][];
                bits358_6_31   = new uint[2][];
                bits358_6_74   = new uint[2][];
                bit358_6_78_9  = new byte[2][][];
                bit358_6_88_10 = new byte[2][][];
                bit358_6_88_C  = new bool[2][][];
                bit358_6_88_8  = new bool[2][][];
                bit358_6_2E    = new bool[2][];
                bit358_6_30    = new bool[2][];
                bit358_10      = new bool[2];
                bit358_C       = new bool[2];
                bit358_24      = new bool[2];

                for (var i = 0; i < 2; ++i)
                {
                    guid358[i] = new byte[8];
                    packet.StartBitStream(guid358[i], 2, 0, 4);
                    bit358_10[i]  = !packet.ReadBit();
                    guid358[i][7] = packet.ReadBit();
                    bits358_5[i]  = packet.ReadBits(2);

                    guid358_6[i]      = new byte[bits358_5[i]][];
                    bits358_6_84[i]   = new uint[bits358_5[i]];
                    bits358_6_94[i]   = new uint[bits358_5[i]];
                    bits358_6_31[i]   = new uint[bits358_5[i]];
                    bits358_6_74[i]   = new uint[bits358_5[i]];
                    bit358_6_78_9[i]  = new byte[bits358_5[i]][];
                    bit358_6_88_10[i] = new byte[bits358_5[i]][];
                    bit358_6_88_C[i]  = new bool[bits358_5[i]][];
                    bit358_6_88_8[i]  = new bool[bits358_5[i]][];
                    bit358_6_2E[i]    = new bool[bits358_5[i]];
                    bit358_6_30[i]    = new bool[bits358_5[i]];

                    for (var j = 0; j < bits358_5[i]; ++j)
                    {
                        guid358_6[i][j]    = new byte[8];
                        bits358_6_31[i][j] = packet.ReadBits(7);
                        guid358_6[i][j][3] = packet.ReadBit();
                        bit358_6_2E[i][j]  = !packet.ReadBit();
                        packet.StartBitStream(guid358_6[i][j], 2, 6, 4);
                        bits358_6_84[i][j] = packet.ReadBits(21);
                        guid358_6[i][j][1] = packet.ReadBit();

                        bit358_6_88_8[i][j]  = new bool[bits358_6_84[i][j]];
                        bit358_6_88_C[i][j]  = new bool[bits358_6_84[i][j]];
                        bit358_6_88_10[i][j] = new byte[bits358_6_84[i][j]];
                        for (var k = 0; k < bits358_6_84[i][j]; ++k)
                        {
                            bit358_6_88_8[i][j][k]  = !packet.ReadBit();
                            bit358_6_88_C[i][j][k]  = !packet.ReadBit();
                            bit358_6_88_10[i][j][k] = (byte)(10 - packet.ReadBit());
                        }

                        guid358_6[i][j][5] = packet.ReadBit();
                        bits358_6_74[i][j] = packet.ReadBits(20);
                        packet.StartBitStream(guid358_6[i][j], 7, 0);

                        bit358_6_78_9[i][j] = new byte[bits358_6_74[i][j]];
                        for (var k = 0; k < bits358_6_74[i][j]; ++k)
                        {
                            bit358_6_78_9[i][j][k] = (byte)(10 - packet.ReadBit());
                        }

                        bit358_6_30[i][j]  = packet.ReadBit();
                        bits358_6_94[i][j] = packet.ReadBits(21);
                    }

                    packet.StartBitStream(guid358[i], 6, 1, 5, 3);
                    bit358_C[i]  = !packet.ReadBit();
                    bit358_24[i] = packet.ReadBit();
                }

                bit338 = !packet.ReadBit();
                bit33C = !packet.ReadBit();

                bits388     = new uint[3];
                bits388_10  = new uint[3];
                bit388_1_10 = new byte[3][];
                bit388_1_C  = new bool[3][];
                bit388_1_8  = new bool[3][];

                for (var i = 0; i < 3; ++i)
                {
                    bits388_10[i]  = packet.ReadBits(21);
                    bits388[i]     = packet.ReadBits(21);
                    bit388_1_10[i] = new byte[bits388[i]];
                    bit388_1_C[i]  = new bool[bits388[i]];
                    bit388_1_8[i]  = new bool[bits388[i]];

                    for (var j = 0; j < bits388[i]; ++j)
                    {
                        bit388_1_C[i][j]  = !packet.ReadBit();
                        bit388_1_10[i][j] = (byte)(10 - packet.ReadBit());
                        bit388_1_8[i][j]  = !packet.ReadBit();
                    }
                }

                packet.ReadBit(); // fake bit
                packet.StartBitStream(CreatorGUID, 5, 1, 6, 4, 3, 7, 0, 2);
                bit330 = !packet.ReadBit();
                packet.ReadBit("bit351", index);
                packet.ReadBit("bit350", index);
                bit341 = !packet.ReadBit();
                bit340 = !packet.ReadBit();
                bit332 = !packet.ReadBit();
            }

            if (bit29C)
            {
                bit23C = packet.ReadBit();
                bit230 = packet.ReadBit();
                bit298 = packet.ReadBit();
                packet.ReadBit("bit20C", index);
                if (bit298)
                {
                    bits288 = packet.ReadBits(20);
                }

                bit284 = packet.ReadBit();
                bit228 = packet.ReadBit();
                bit258 = packet.ReadBit();
                packet.ReadBit("bit20F", index);
                if (bit284)
                {
                    bits26C = packet.ReadBits(21);
                    bits25C = packet.ReadBits(21);
                }

                packet.ReadBit("bit20D", index);
                packet.ReadBit("bit20E", index);
                packet.ReadBit("bit210", index);
                bit218 = packet.ReadBit();
                bit220 = packet.ReadBit();
            }

            if (isLiving)
            {
                guid1[5] = packet.ReadBit();
                moveInfo.HasSplineData = packet.ReadBit();
                packet.ReadBit("bit9C", index);
                packet.StartBitStream(guid1, 1, 3);
                hasOrientation = !packet.ReadBit();
                packet.ReadBit("bit85", index);
                if (moveInfo.HasSplineData)
                {
                    hasFullSpline = packet.ReadBit();
                    if (hasFullSpline)
                    {
                        hasSplineStartTime = packet.ReadBit("Has Spline Start Time", index);
                        packet.ReadEnum <SplineMode>("Spline Mode", 2, index);
                        packet.ReadEnum <SplineFlag434>("Spline flags", 25, index);
                        bit130 = packet.ReadBit();
                        if (bit130)
                        {
                            bits11C = packet.ReadBits(21);
                            packet.ReadBits("bits12C", 2, index);
                        }
                        splineCount = packet.ReadBits("SplineWaypointsCount", 20, index);
                        hasSplineVerticalAcceleration = packet.ReadBit("has Spline Vertical Acceleration", index);
                    }
                }
                bits88 = packet.ReadBits(22);
                packet.StartBitStream(guid1, 6, 7);
                hasTransportData   = packet.ReadBit();
                hasSplineElevation = !packet.ReadBit();
                if (hasTransportData)
                {
                    hasTransportTime3 = packet.ReadBit();
                    packet.StartBitStream(transportGuid, 6, 2, 1, 0, 5);
                    hasTransportTime2 = packet.ReadBit();
                    packet.StartBitStream(transportGuid, 3, 7, 4);
                }

                bits160 = packet.ReadBits(19);
                for (var i = 0; i < bits160; ++i)
                {
                    packet.ReadBits("bits164", 2, index, i);
                }
                hasMoveFlagsExtra = !packet.ReadBit();
                guid1[2]          = packet.ReadBit();
                hasMovementFlags  = !packet.ReadBit();
                hasTimestamp      = !packet.ReadBit();
                if (hasMovementFlags)
                {
                    moveInfo.Flags = packet.ReadEnum <MovementFlag>("Movement Flags", 30, index);
                }

                hasFallData = packet.ReadBit();
                if (hasMoveFlagsExtra)
                {
                    moveInfo.FlagsExtra = packet.ReadEnum <MovementFlagExtra>("Extra Movement Flags", 13, index);
                }
                guid1[4] = packet.ReadBit();
                if (hasFallData)
                {
                    hasFallDirection = packet.ReadBit();
                }
                guid1[0] = packet.ReadBit();
                packet.ReadBit("bit84", index);
                hasPitch = !packet.ReadBit();
                bit98    = !packet.ReadBit();
            }

            if (hasAttackingTarget)
            {
                packet.StartBitStream(attackingTargetGuid, 6, 4, 5, 2, 3, 7, 0, 1);
            }

            if (bit32A)
            {
                bits2AA = packet.ReadBits(7);
            }

            if (hasAnimKits)
            {
                hasAnimKit2 = !packet.ReadBit();
                hasAnimKit3 = !packet.ReadBit();
                hasAnimKit1 = !packet.ReadBit();
            }

            if (bit428)
            {
                bits418 = packet.ReadBits(22);
            }

            packet.ResetBitReader();

            for (var i = 0; i < transportFrames; ++i)
            {
                packet.ReadInt32("Transport frame", index, i);
            }

            if (bit29C)
            {
                if (bit258)
                {
                    packet.ReadSingle("Float24C", index);
                    packet.ReadSingle("Float248", index);
                    packet.ReadSingle("Float250", index);
                    packet.ReadSingle("Float244", index);
                    packet.ReadSingle("Float254", index);
                    packet.ReadSingle("Float240", index);
                }

                if (bit284)
                {
                    for (var i = 0; i < bits25C; ++i)
                    {
                        packet.ReadSingle("Float260+1", index, i);
                        packet.ReadSingle("Float260+0", index, i);
                    }

                    packet.ReadSingle("Float280", index);
                    for (var i = 0; i < bits26C; ++i)
                    {
                        packet.ReadSingle("Float270+1", index, i);
                        packet.ReadSingle("Float270+0", index, i);
                    }

                    packet.ReadSingle("Float27C", index);
                }

                if (bit228)
                {
                    packet.ReadInt32("int224", index);
                }
                if (bit218)
                {
                    packet.ReadInt32("int214", index);
                }

                packet.ReadInt32("Int208", index);

                if (bit298)
                {
                    for (var i = 0; i < bits288; ++i)
                    {
                        packet.ReadSingle("Float28C+0", index, i);
                        packet.ReadSingle("Float28C+2", index, i);
                        packet.ReadSingle("Float28C+1", index, i);
                    }
                }

                if (bit230)
                {
                    packet.ReadInt32("int22C", index);
                }
                if (bit220)
                {
                    packet.ReadInt32("int21C", index);
                }

                if (bit23C)
                {
                    packet.ReadSingle("Float234", index);
                    packet.ReadSingle("Float238", index);
                }
            }

            if (isLiving)
            {
                if (moveInfo.HasSplineData)
                {
                    if (hasFullSpline)
                    {
                        var type = packet.ReadByte();
                        switch (type)
                        {
                        case 1:
                            splineType = SplineType.Normal;
                            break;

                        case 2:
                            splineType = SplineType.FacingSpot;
                            break;

                        case 3:
                            splineType = SplineType.FacingTarget;
                            break;

                        case 4:
                            splineType = SplineType.FacingAngle;
                            break;
                        }

                        packet.ReadSingle("Spline Duration Multiplier", index); // if need swap with "Spline Duration Multiplier Next"
                        for (var i = 0u; i < splineCount; ++i)
                        {
                            var wp = new Vector3
                            {
                                Z = packet.ReadSingle(),
                                X = packet.ReadSingle(),
                                Y = packet.ReadSingle(),
                            };

                            packet.WriteLine("[{0}][{1}] Spline Waypoint: {2}", index, i, wp);
                        }

                        if (bit130)
                        {
                            for (var i = 0; i < bits11C; ++i)
                            {
                                packet.ReadSingle("Float13C+0", index, i);
                                packet.ReadSingle("Float13C+1", index, i);
                            }
                        }

                        packet.ReadSingle("Spline Duration Multiplier Next", index);
                        if (splineType == SplineType.FacingSpot)
                        {
                            var point = new Vector3
                            {
                                Z = packet.ReadSingle(),
                                Y = packet.ReadSingle(),
                                X = packet.ReadSingle(),
                            };

                            packet.WriteLine("[{0}] Facing Spot: {1}", index, point);
                        }

                        if (splineType == SplineType.FacingAngle)
                        {
                            packet.ReadSingle("Facing Angle", index);
                        }

                        if (hasSplineVerticalAcceleration)
                        {
                            packet.ReadSingle("Spline Vertical Acceleration", index);
                        }

                        if (hasSplineStartTime)
                        {
                            packet.ReadInt32("Spline Start Time", index);
                        }

                        packet.ReadInt32("Spline Time", index); // if need swap with "Spline Full Time"
                        packet.ReadInt32("Spline Full Time", index);
                    }

                    packet.ReadInt32("Spline Id", index);
                    moveInfo.Position.Z = packet.ReadSingle();
                    moveInfo.Position.X = packet.ReadSingle();
                    moveInfo.Position.Y = packet.ReadSingle();
                }

                if (hasTransportData)
                {
                    moveInfo.TransportOffset.X = packet.ReadSingle();
                    if (hasTransportTime2)
                    {
                        packet.ReadUInt32("Transport Time 2", index);
                    }

                    packet.ReadUInt32("Transport Time", index);
                    moveInfo.TransportOffset.Z = packet.ReadSingle();
                    packet.ReadXORBytes(transportGuid, 4, 3);
                    packet.ReadByte("Transport Seat", index);
                    moveInfo.TransportOffset.Y = packet.ReadSingle();
                    moveInfo.TransportOffset.O = packet.ReadSingle();
                    packet.ReadXORBytes(transportGuid, 0, 7, 6, 5, 1, 2);
                    if (hasTransportTime3)
                    {
                        packet.ReadUInt32("Transport Time 3", index);
                    }

                    moveInfo.TransportGuid = new Guid(BitConverter.ToUInt64(transportGuid, 0));
                    packet.WriteLine("[{0}] Transport GUID {1}", index, moveInfo.TransportGuid);
                    packet.WriteLine("[{0}] Transport Position: {1}", index, moveInfo.TransportOffset);
                }

                for (var i = 0; i < bits160; ++i)
                {
                    packet.ReadSingle("Float16C+1", index, i);
                    packet.ReadInt32("Int16C+4", index, i);
                    packet.ReadInt32("Int16C+0", index, i);
                    packet.ReadSingle("Float16C+3", index, i);
                    packet.ReadSingle("Float16C+5", index, i);
                    packet.ReadSingle("Float16C+2", index, i);
                }

                packet.ReadXORBytes(guid1, 2, 6, 0);

                if (hasFallData)
                {
                    if (hasFallDirection)
                    {
                        packet.ReadSingle("Jump Sin", index);
                        packet.ReadSingle("Jump Cos", index);
                        packet.ReadSingle("Jump Velocity", index);
                    }
                    packet.ReadSingle("Fall Start Velocity", index);
                    packet.ReadUInt32("Time Fallen", index);
                }

                if (hasPitch)
                {
                    packet.ReadSingle("Pitch", index);
                }

                moveInfo.Position.Y = packet.ReadSingle();

                if (hasTimestamp)
                {
                    packet.ReadUInt32("Time", index);
                }

                packet.ReadSingle("FloatC8", index);
                packet.ReadXORByte(guid1, 7);
                for (var i = 0; i < bits88; ++i)
                {
                    packet.ReadInt32("Int8C", index, i);
                }

                if (hasOrientation)
                {
                    moveInfo.Orientation = packet.ReadSingle();
                }

                packet.ReadSingle("FloatC0", index);
                packet.ReadSingle("FloatB4", index);
                packet.ReadXORByte(guid1, 1);
                moveInfo.Position.Z = packet.ReadSingle();
                if (hasSplineElevation)
                {
                    packet.ReadSingle("Spline Elevation", index);
                }
                packet.ReadXORByte(guid1, 4);
                packet.ReadSingle("FloatBC", index);
                packet.ReadSingle("FloatAC", index);
                packet.ReadSingle("FloatB8", index);
                packet.ReadSingle("FloatC4", index);
                packet.ReadSingle("FloatB0", index);
                moveInfo.Position.X = packet.ReadSingle();
                packet.ReadXORBytes(guid1, 5, 3);
                if (bit98)
                {
                    packet.ReadInt32("Int98", index);
                }

                packet.ReadSingle("FloatA8", index);

                packet.WriteGuid("GUID1", guid1, index);
                packet.WriteLine("[{0}] Position: {1}", index, moveInfo.Position);
                packet.WriteLine("[{0}] Orientation: {1}", index, moveInfo.Orientation);
            }

            if (hasSceneObjectData)
            {
                packet.ReadInt32("int334", index);
                if (bit340)
                {
                    packet.ReadByte("byte340", index);
                }

                for (var i = 0; i < 2; ++i)
                {
                    packet.ReadXORByte(guid358[i], 3);
                    for (var j = 0; j < bits358_5[i]; ++j)
                    {
                        if (bit358_6_2E[i][j])
                        {
                            packet.ReadInt16("short358+6+2E", index, i, j);
                        }

                        packet.ReadXORByte(guid358_6[i][j], 3);
                        for (var k = 0; k < bits358_6_74[i][j]; ++k)
                        {
                            packet.ReadByte("byte358+6+78+8", index, i, j, k);
                            if (bit358_6_78_9[i][j][k] != 9)
                            {
                                packet.ReadByte("byte358+6+78+9", index, i, j, k);
                            }

                            packet.ReadInt16("short358+6+78+2", index, i, j, k);
                            packet.ReadInt32("int358+6+78+0", index, i, j, k);
                            packet.ReadInt16("short358+6+78+3", index, i, j, k);
                        }

                        packet.ReadXORByte(guid358_6[i][j], 6);
                        for (var k = 0; k < bits358_6_84[i][j]; ++k)
                        {
                            packet.ReadInt32("int358+6+88+0", index, i, j, k);
                            if (bit358_6_88_C[i][j][k])
                            {
                                packet.ReadInt32("int358+6+88+C", index, i, j, k);
                            }

                            if (bit358_6_88_8[i][j][k])
                            {
                                packet.ReadInt32("int358+6+88+8", index, i, j, k);
                            }

                            if (bit358_6_88_10[i][j][k] != 9)
                            {
                                packet.ReadByte("byte358+6+88+10", index, i, j, k);
                            }

                            packet.ReadInt32("int358+6+88+4", index, i, j, k);
                        }

                        packet.ReadInt32("int358+6+28", index, i, j);
                        packet.ReadWoWString("String358+6+31", (int)bits358_6_31[i][j], index, i, j);

                        if (!bit358_6_30[i][j])
                        {
                            packet.ReadByte("byte358+6+30", index, i, j);
                        }

                        packet.ReadInt32("int358+6+24", index, i, j);
                        packet.ReadXORByte(guid358_6[i][j], 5);
                        packet.ReadInt32("int358+6+C", index, i, j);
                        for (var k = 0; k < bits358_6_94[i][j]; ++k)
                        {
                            packet.ReadInt32("int358+6+98+0", index, i, j, k);
                            packet.ReadInt32("int358+6+98+4", index, i, j, k);
                        }

                        packet.ReadXORByte(guid358_6[i][j], 7);
                        packet.ReadInt32("int358+6+18", index, i, j);
                        packet.ReadInt16("short358+6+2C", index, i, j);
                        packet.ReadInt32("int358+6+20", index, i, j);
                        packet.ReadInt32("int358+6+1C", index, i, j);
                        packet.ReadInt32("int358+6+10", index, i, j);
                        packet.ReadXORByte(guid358_6[i][j], 4);
                        packet.ReadInt16("short358+6+16", index, i, j);
                        packet.ReadXORByte(guid358_6[i][j], 2);
                        packet.ReadInt32("Int358+6+8", index, i, j);
                        packet.ReadXORByte(guid358_6[i][j], 1);
                        packet.ReadInt16("short358+6+14", index, i, j);
                        packet.ReadXORByte(guid358_6[i][j], 0);
                        packet.WriteGuid("Guid 358_6", guid358_6[i][j], index, i, j);
                    }

                    packet.ReadXORBytes(guid358[i], 5, 4, 0);
                    packet.ReadInt32("int358+8", index, i);
                    packet.ReadXORBytes(guid358[i], 7);
                    if (!bit358_24[i])
                    {
                        packet.ReadByte("byte358+24", index, i);
                    }

                    if (bit358_10[i])
                    {
                        packet.ReadInt16("Short358+10", index, i);
                    }

                    packet.ReadXORBytes(guid358[i], 6);
                    if (bit358_C[i])
                    {
                        packet.ReadInt32("int358+C", index, i);
                    }

                    packet.ReadByte("byte358+37", index, i);
                    packet.ReadXORBytes(guid358[i], 1, 2);
                    packet.WriteGuid("Guid358", guid358[i], index, i);
                }

                for (var i = 0; i < 3; ++i)
                {
                    for (var j = 0; j < bits388_10[i]; ++j)
                    {
                        packet.ReadInt32("int388+6+4", index, i, j);
                        packet.ReadInt32("int388+6+0", index, i, j);
                    }

                    for (var j = 0; j < bits388[i]; ++j)
                    {
                        if (bit388_1_C[i][j])
                        {
                            packet.ReadInt32("int388+1+C", index, i, j);
                        }

                        packet.ReadInt32("int388+1+0", index, i, j);

                        if (bit388_1_10[i][j] != 9)
                        {
                            packet.ReadByte("byte388+1+10", index, i, j);
                        }

                        packet.ReadInt32("int388+1+4", index, i, j);

                        if (bit388_1_8[i][j])
                        {
                            packet.ReadInt32("int388+1+8", index, i, j);
                        }
                    }
                }

                packet.ParseBitStream(CreatorGUID, 7, 0, 6, 2, 5, 1, 3, 4);
                if (bit332)
                {
                    packet.ReadInt16("short332", index);
                }
                if (bit338)
                {
                    packet.ReadInt32("int338", index);
                }
                if (bit341)
                {
                    packet.ReadByte("byte341", index);
                }
                if (bit33C)
                {
                    packet.ReadInt32("int33C", index);
                }
                if (bit330)
                {
                    packet.ReadInt16("Short318", index);
                }

                packet.WriteGuid("Creator GUID", CreatorGUID, index);
            }

            if (hasGameObjectPosition)
            {
                packet.ReadUInt32("GO Transport Time", index);
                moveInfo.TransportOffset.Y = packet.ReadSingle();
                packet.ReadXORBytes(goTransportGuid, 0, 5);
                if (hasGOTransportTime3)
                {
                    packet.ReadUInt32("GO Transport Time 3", index);
                }

                packet.ReadXORBytes(goTransportGuid, 7, 4);
                moveInfo.TransportOffset.O = packet.ReadSingle();
                moveInfo.TransportOffset.Z = packet.ReadSingle();
                packet.ReadXORBytes(goTransportGuid, 1, 3, 6);
                packet.ReadSByte("GO Transport Seat", index);
                if (hasGOTransportTime2)
                {
                    packet.ReadUInt32("GO Transport Time 2", index);
                }

                packet.ReadXORByte(goTransportGuid, 2);
                moveInfo.TransportOffset.X = packet.ReadSingle();
                moveInfo.TransportGuid     = new Guid(BitConverter.ToUInt64(goTransportGuid, 0));
                packet.WriteLine("[{0}] GO Transport GUID {1}", index, moveInfo.TransportGuid);
                packet.WriteLine("[{0}] GO Transport Position: {1}", index, moveInfo.TransportOffset);
            }

            if (hasStationaryPosition)
            {
                moveInfo.Orientation = packet.ReadSingle("Stationary Orientation", index);
                moveInfo.Position.Z  = packet.ReadSingle();
                moveInfo.Position.X  = packet.ReadSingle();
                moveInfo.Position.Y  = packet.ReadSingle();

                packet.WriteLine("[{0}] Stationary Position: {1}", index, moveInfo.Position);
            }

            if (hasAttackingTarget)
            {
                packet.ParseBitStream(attackingTargetGuid, 1, 5, 4, 7, 6, 2, 0, 3);
                packet.WriteGuid("Attacking GUID", attackingTargetGuid, index);
            }

            if (bit1DC)
            {
                packet.ReadInt32("int1D8", index);
            }
            if (bit2A4)
            {
                packet.ReadInt32("int2A0", index);
            }
            if (hasGameObjectRotation)
            {
                packet.ReadPackedQuaternion("GameObject Rotation", index);
            }

            if (hasVehicleData)
            {
                packet.ReadSingle("Vehicle Orientation", index);
                moveInfo.VehicleId = packet.ReadUInt32("Vehicle Id", index);
            }

            if (hasAnimKits)
            {
                if (hasAnimKit2)
                {
                    packet.ReadUInt16("Anim Kit 2", index);
                }
                if (hasAnimKit1)
                {
                    packet.ReadUInt16("Anim Kit 1", index);
                }
                if (hasAnimKit3)
                {
                    packet.ReadUInt16("Anim Kit 3", index);
                }
            }

            if (bit428)
            {
                for (var i = 0; i < bits418; ++i)
                {
                    packet.ReadInt32("Int3F8", index, i);
                }
            }

            if (bit414)
            {
                packet.ReadInt32("int410", index);
            }

            if (bit32A)
            {
                var bytes = packet.ReadBytes((int)bits2AA);
                packet.WriteLine("Bytes {0}", Utilities.ByteArrayToHexString(bytes), index);
            }

            if (isLiving && moveInfo.HasSplineData && hasFullSpline && splineType == SplineType.FacingTarget)
            {
                var facingTargetGuid = new byte[8];
                facingTargetGuid = packet.StartBitStream(3, 1, 0, 7, 6, 4, 5, 2);
                packet.ParseBitStream(facingTargetGuid, 3, 0, 4, 6, 1, 5, 2, 7);
                packet.WriteGuid("Facing Target GUID", facingTargetGuid, index);
            }

            return(moveInfo);
        }
Exemple #15
0
    public static Bar GeneratePercussInstrument1(MovementInfo movement)
    {
        Bar newBar = new Bar();
        int totalBarBeatDuration = movement.Tempo.getTimeSignature("4/4");
        int currentTotalDuration = 0;
        int SongDuration         = 0;
        int AccurateSongDuration = 0;
        int Root = movement.Root;
        int n    = 0; //keeps track of rhythm in bar and whether it is rest or not for that rhythm

        List <String> RhythmForBar = new List <String>();

        RhythmForBar.Add("eigth");
        RhythmForBar.Add("eigth");
        RhythmForBar.Add("eigth");
        RhythmForBar.Add("eigth");
        RhythmForBar.Add("eigth");
        RhythmForBar.Add("eigth");
        RhythmForBar.Add("eigth");
        RhythmForBar.Add("eigth");


        //Decides whether note is a rest or not, SHOULD MATCH UP WITH EACH ADDITION TO RhythmForBar
        List <int> DecideRest = new List <int>();

        DecideRest.Add(1);
        DecideRest.Add(1);
        DecideRest.Add(1);
        DecideRest.Add(1);
        DecideRest.Add(1);
        DecideRest.Add(1);
        DecideRest.Add(1);
        DecideRest.Add(1);

        for (int i = 0; i < 4; i++)
        {
            //Declares note to be played
            Root = (byte)(60);
            n    = 0;

            //The "-4" is because of the rounding error that occurs with midi. This should make sure that an "almost" full bar
            //counts as a full bar.
            //Adjust this number if the exception error occurs for a rhythm you know should fill the bar.
            while (totalBarBeatDuration - 4 > currentTotalDuration)
            {
                foreach (String y in RhythmForBar)
                {
                    if (DecideRest[n] == 1)
                    {
                        //Parameters of the added note: Current place in duration of the bar, a byte decided by notes based in the offset of the chords, the beat duration of the current note to be played, and a byte describing the volume
                        newBar.notes.Add(new Note(AccurateSongDuration, (byte)(Root), movement.Tempo.getNoteDuration(RhythmForBar[n]), (byte)movement.Volume));
                    }
                    currentTotalDuration += movement.Tempo.getNoteDuration(RhythmForBar[n]);
                    AccurateSongDuration += movement.Tempo.getNoteDuration(RhythmForBar[n]);
                    n += 1;
                }
            }
            currentTotalDuration = 0;
            SongDuration        += movement.Tempo.getTimeSignature("4/4");
            AccurateSongDuration = SongDuration;
        }
        return(newBar);
    }
Exemple #16
0
        public static void HandleMovementSetFacing422(Packet packet)
        {
            var info               = new MovementInfo();
            var guidBytes          = new byte[8];
            var transportGuidBytes = new byte[8];

            info.Flags = packet.ReadEnum <MovementFlag>("Movement Flags", 30);

            guidBytes[4] = (byte)(packet.ReadBit() ? 1 : 0);
            guidBytes[2] = (byte)(packet.ReadBit() ? 1 : 0);

            info.HasSplineData = packet.ReadBit("HasSplineData");

            guidBytes[3] = (byte)(packet.ReadBit() ? 1 : 0);
            guidBytes[5] = (byte)(packet.ReadBit() ? 1 : 0);

            packet.ReadEnum <MovementFlagExtra>("Extra Movement Flags", 12);

            guidBytes[0] = (byte)(packet.ReadBit() ? 1 : 0);
            guidBytes[7] = (byte)(packet.ReadBit() ? 1 : 0);
            guidBytes[6] = (byte)(packet.ReadBit() ? 1 : 0);
            guidBytes[1] = (byte)(packet.ReadBit() ? 1 : 0);

            var splineElevation = packet.ReadBit("HaveSplineElevation");

            var havePitch         = packet.ReadBit("HavePitch");
            var haveFallData      = packet.ReadBit("HaveFallData");
            var haveFallDirection = false;

            if (haveFallData)
            {
                haveFallDirection = packet.ReadBit("HaveFallDirection");
            }

            var haveTransportData = packet.ReadBit("HaveTransportData");

            var haveTransportTime2 = false;
            var haveTransportTime3 = false;

            if (haveTransportData)
            {
                transportGuidBytes = packet.StartBitStream(0, 6, 2, 5, 4, 1, 3, 7);
                haveTransportTime2 = packet.ReadBit("HaveTransportTime2");
                haveTransportTime3 = packet.ReadBit("HaveTransportTime3");
            }

            info.Orientation = packet.ReadSingle("Orientation");

            packet.ReadUInt32("Timestamp");

            info.Position = packet.ReadVector3("Position");

            packet.ParseBitStream(guidBytes, 7, 5);

            if (splineElevation)
            {
                packet.ReadSingle("Spline Elevation");
            }

            packet.ParseBitStream(guidBytes, 4, 1, 2);

            if (havePitch)
            {
                packet.ReadSingle("Pitch");
            }

            if (haveFallData)
            {
                packet.ReadUInt32("Fall Time");
                packet.ReadSingle("Fall Vertical Speed");
                packet.ReadSingle("Fall Horizontal Speed");

                if (haveFallDirection)
                {
                    packet.ReadSingle("Fall Cos Angle");
                    packet.ReadSingle("Fall Sin Angle");
                }
            }

            packet.ParseBitStream(guidBytes, 6, 0);

            if (haveTransportData)
            {
                packet.ReadByte("Transport Seat");
                packet.ReadSingle("Transport Orientation");
                packet.ReadVector3("Transport Position");

                packet.ReadUInt32("Transport Time");

                if (haveTransportTime2)
                {
                    packet.ReadUInt32("Transport Time 2");
                }

                packet.ParseBitStream(transportGuidBytes, 3, 6);

                if (haveTransportTime3)
                {
                    packet.ReadUInt32("Transport Time 3");
                }

                packet.ParseBitStream(transportGuidBytes, 7, 5, 2, 1, 0, 4);
            }

            packet.ParseBitStream(guidBytes, 3);

            packet.ToGuid("Guid", guidBytes);
            packet.ToGuid("Transport Guid", transportGuidBytes);
        }
Exemple #17
0
        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 (ClientVersion.AddedInVersion(ClientType.Shadowlands))
                {
                    if (packet.ReadBit("HasAreaTriggerUnk901", index)) // seen with spellid 343597
                    {
                        areaTriggerTemplate.Flags |= (uint)AreaTriggerFlags.Unk901;
                    }
                }

                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.Unk901) != 0)
                {
                    packet.ReadInt32("Unk901"); // some id prolly, its neither npc nor spell though
                    packet.ReadVector3("Unk901Position");
                }

                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);
        }
 // Outdated, not using new UpdateFields. Plix rewrite.
 public static void HandleUpdateFieldChangedValues(Guid guid, ObjectType objType,
                                                   Dictionary <int, UpdateField> updates, MovementInfo moves, bool updatingObject = false)
 {
     /* bool shouldCommit;
      * bool isIntValue;
      * bool flags;
      * const bool isTemplate = true;
      * var isCreated = false;
      * string sql;
      * string fieldName = null;
      *
      * if (objType == ObjectType.Unit && guid.GetHighType() != HighGuidType.Pet)
      * {
      *   if (!updatingObject)
      *   {
      *       SQLStore.WriteData(SQLStore.CreatureUpdates.GetCommand("speed_walk", guid.GetEntry(), moves.WalkSpeed));
      *       SQLStore.WriteData(SQLStore.CreatureUpdates.GetCommand("speed_run", guid.GetEntry(), moves.RunSpeed));
      *   }
      *
      *   foreach (var upVal in updates)
      *   {
      *       shouldCommit = true;
      *       isIntValue = true;
      *       flags = false;
      *
      *       var idx = (UnitField)upVal.Key;
      *       var val = upVal.Value;
      *
      *       switch (idx)
      *       {
      *           case UnitField.UNIT_CREATED_BY_SPELL:
      *           case UnitField.UNIT_FIELD_CREATEDBY:
      *           case UnitField.UNIT_FIELD_SUMMONEDBY:
      *           {
      *               isCreated = true;
      *               shouldCommit = false;
      *               break;
      *           }
      *           case (UnitField)ObjectField.OBJECT_FIELD_SCALE_X:
      *           {
      *               fieldName = "scale";
      *               isIntValue = false;
      *               break;
      *           }
      *           case UnitField.UNIT_DYNAMIC_FLAGS:
      *           {
      *               fieldName = "dynamicflags";
      *               flags = true;
      *               break;
      *           }
      *           case UnitField.UNIT_NPC_FLAGS:
      *           {
      *               fieldName = "npcflag";
      *               flags = true;
      *               break;
      *           }
      *           case UnitField.UNIT_FIELD_FLAGS:
      *           {
      *               fieldName = "unit_flags";
      *               flags = true;
      *               break;
      *           }
      *           case UnitField.UNIT_FIELD_ATTACK_POWER:
      *           {
      *               fieldName = "attackpower";
      *               break;
      *           }
      *           case UnitField.UNIT_FIELD_BASEATTACKTIME:
      *           {
      *               fieldName = "baseattacktime";
      *               break;
      *           }
      *           case UnitField.UNIT_FIELD_LEVEL:
      *           {
      *               fieldName = "minlevel = " + val.Int32Value + ", maxlevel";
      *               break;
      *           }
      *           case UnitField.UNIT_FIELD_RANGED_ATTACK_POWER:
      *           {
      *               fieldName = "rangedattackpower";
      *               break;
      *           }
      *           case UnitField.UNIT_FIELD_RANGEDATTACKTIME:
      *           {
      *               fieldName = "rangeattacktime";
      *               break;
      *           }
      *           case UnitField.UNIT_FIELD_FACTIONTEMPLATE:
      *           {
      *               fieldName = "faction_A = " + val.Int32Value + ", faction_H";
      *               break;
      *           }
      *           default:
      *           {
      *               shouldCommit = false;
      *               break;
      *           }
      *       }
      *
      *       if (!shouldCommit)
      *           continue;
      *
      *       var finalValue = isIntValue ? (object)val.Int32Value : val.SingleValue;
      *
      *       if (flags)
      *           finalValue = "0x" + ((int)finalValue).ToString("X8");
      *
      *       if (updatingObject)
      *           sql = SQLStore.CreatureSpawnUpdates.GetCommand(fieldName, (uint) guid.GetLow(), finalValue);
      *       else sql = SQLStore.CreatureUpdates.GetCommand(fieldName, guid.GetEntry(), finalValue);
      *
      *       SQLStore.WriteData(sql);
      *   }
      *
      *   if (!isCreated)
      *       SQLStore.WriteData(SQLStore.CreatureSpawns.GetCommand(guid.GetEntry(),
      *           MovementHandler.CurrentMapId, MovementHandler.CurrentPhaseMask,
      *           moves.Position, moves.Orientation));
      * }
      *
      * if (objType != ObjectType.GameObject)
      *   return;
      *
      * foreach (var upVal in updates)
      * {
      *   shouldCommit = true;
      *   isIntValue = true;
      *   flags = false;
      *
      *   var idx = (GameObjectField)upVal.Key;
      *   var val = upVal.Value;
      *
      *   switch (idx)
      *   {
      *       //case GameObjectField.GAMEOBJECT_FIELD_CREATED_BY:
      *       //{
      *       //    isCreated = true;
      *       //    shouldCommit = false;
      *       //  break;
      *       //}
      *       case (GameObjectField)ObjectField.OBJECT_FIELD_SCALE_X:
      *       {
      *           fieldName = "size";
      *           isIntValue = false;
      *           break;
      *       }
      *       case GameObjectField.GAMEOBJECT_FACTION:
      *       {
      *           fieldName = "faction";
      *           break;
      *       }
      *       case GameObjectField.GAMEOBJECT_FLAGS:
      *       {
      *           fieldName = "flags";
      *           flags = true;
      *           break;
      *       }
      *       default:
      *       {
      *           shouldCommit = false;
      *           break;
      *       }
      *   }
      *
      *   if (!shouldCommit)
      *       continue;
      *
      *   var finalValue = isIntValue ? (object)val.Int32Value : val.SingleValue;
      *
      *   if (flags)
      *       finalValue = "0x" + ((int)finalValue).ToString("X8");
      *
      *   if (isTemplate)
      *       sql = SQLStore.GameObjectUpdates.GetCommand(fieldName, guid.GetEntry(), finalValue);
      *   //else
      *   //    sql = SQLStore.GameObjectSpawnUpdates.GetCommand(fieldName, (uint)guid.GetLow(),
      *   //        finalValue);
      *
      *   SQLStore.WriteData(sql);
      * }
      *
      * if (!isCreated)
      *   SQLStore.WriteData(SQLStore.GameObjectSpawns.GetCommand(guid.GetEntry(), MovementHandler.CurrentMapId,
      *       MovementHandler.CurrentPhaseMask, moves.Position, moves.Orientation));
      * */
 }
        private static MovementInfo ReadMovementUpdateBlock(Packet packet, WowGuid guid, object index)
        {
            var moveInfo = new MovementInfo();

            var guid1               = new byte[8];
            var transportGuid       = new byte[8];
            var goTransportGuid     = new byte[8];
            var attackingTargetGuid = new byte[8];
            var guid5               = new byte[8];
            var guid6               = new byte[8];
            var guid7               = new byte[8];

            var hasAnimKit1                   = false;
            var hasAnimKit2                   = false;
            var hasAnimKit3                   = false;
            var hasFullSpline                 = false;
            var hasSplineStartTime            = false;
            var hasSplineVerticalAcceleration = false;
            var hasGOTransportTime2           = false;
            var hasGOTransportTime3           = false;
            var hasSplineElevation            = false;
            var hasMovementFlags              = false;
            var hasMoveFlagsExtra             = false;
            var hasTimestamp                  = false;
            var hasOrientation                = false;
            var hasTransportData              = false;
            var hasTransportTime3             = false;
            var hasTransportTime2             = false;
            var hasPitch         = false;
            var hasFallData      = false;
            var hasFallDirection = false;

            var bit95  = false;
            var bit94  = false;
            var bit134 = false;
            var bitA8  = false;
            var bit228 = false;
            var bit270 = false;
            var bit21C = false;
            var bit244 = false;

            var bits168     = 0u;
            var splineCount = 0u;
            var bits138     = 0u;
            var bits98      = 0u;
            var bits248     = 0u;
            var bits258     = 0u;
            var bits274     = 0u;
            var bits3F4     = 0u;
            var bits28F     = 0u;
            var splineType  = SplineType.Stop;

            packet.ReadBit();
            var transportFrames       = packet.ReadBits(22);
            var hasVehicleData        = packet.ReadBit("Has Vehicle Data", index);
            var bit3F0                = packet.ReadBit();
            var hasGameObjectPosition = packet.ReadBit("Has GameObject Position", index);

            packet.ReadBit(); // fake bit
            var isSceneObject         = packet.ReadBit("Scene Object", index);
            var transport             = packet.ReadBit("On transport", index);
            var bit284                = packet.ReadBit();
            var bit208                = packet.ReadBit();
            var hasGameObjectRotation = packet.ReadBit("Has GameObject Rotation", index);
            var hasAttackingTarget    = packet.ReadBit("Has Attacking Target", index);

            packet.ReadBit();                             // fake bit
            packet.ReadBit();                             // fake bit
            packet.ReadBit("Self", index);
            packet.ReadBit();                             // fake bit
            var living                = packet.ReadBit("Living", index);
            var bit3E8                = packet.ReadBit(); // something with scene object
            var bit28E                = packet.ReadBit();
            var hasAnimKits           = packet.ReadBit("Has AnimKits", index);
            var hasStationaryPosition = packet.ReadBit("Has Stationary Position", index);

            if (living)
            {
                guid1[0]           = packet.ReadBit();
                hasSplineElevation = !packet.ReadBit();
                packet.StartBitStream(guid1, 4, 7);
                hasMoveFlagsExtra = !packet.ReadBit();
                packet.StartBitStream(guid1, 5, 2);
                moveInfo.HasSplineData = packet.ReadBit("Has spline data", index);
                hasMovementFlags       = !packet.ReadBit();
                hasTimestamp           = !packet.ReadBit("Lacks timestamp", index);
                bit95          = packet.ReadBit();
                bit94          = packet.ReadBit();
                hasOrientation = !packet.ReadBit();
                if (hasMovementFlags)
                {
                    moveInfo.Flags = (uint)packet.ReadBitsE <MovementFlag>("Movement Flags", 30, index);
                }

                hasTransportData = packet.ReadBit("Has Transport Data", index);
                if (hasTransportData)
                {
                    packet.StartBitStream(transportGuid, 1, 0, 6);
                    hasTransportTime3 = packet.ReadBit();
                    packet.StartBitStream(transportGuid, 2, 7, 4, 3);
                    hasTransportTime2 = packet.ReadBit();
                    transportGuid[5]  = packet.ReadBit();
                }

                hasPitch = !packet.ReadBit("Lacks pitch", index);
                guid1[6] = packet.ReadBit();
                bits168  = packet.ReadBits(19);
                for (var i = 0; i < bits168; ++i)
                {
                    packet.ReadBits("bits168", 2, index);
                }

                guid1[1] = packet.ReadBit();
                if (moveInfo.HasSplineData)
                {
                    hasFullSpline = packet.ReadBit();
                    if (hasFullSpline)
                    {
                        hasSplineStartTime = packet.ReadBit();
                        bit134             = packet.ReadBit();
                        packet.ReadBitsE <SplineMode>("Spline Mode", 2, index);
                        splineCount = packet.ReadBits("SplineWaypointsCount", 20, index);
                        hasSplineVerticalAcceleration = packet.ReadBit("Has Spline Vertical Acceleration", index);
                        if (bit134)
                        {
                            bits138 = packet.ReadBits(21);
                            packet.ReadBits("bits148", 2, index);
                        }
                        packet.ReadBitsE <SplineFlag434>("Spline flags", 25, index);
                    }
                }

                bitA8    = !packet.ReadBit();
                guid1[3] = packet.ReadBit();
                bits98   = packet.ReadBits(22);
                if (hasMoveFlagsExtra)
                {
                    moveInfo.Flags2 = (uint)packet.ReadBitsE <MovementFlag2>("Extra Movement Flags", 13, index);
                }

                hasFallData = packet.ReadBit("Has Fall Data", index);
                if (hasFallData)
                {
                    hasFallDirection = packet.ReadBit("Has Fall Direction", index);
                }

                packet.ReadBit("bitAC", index);
            }

            if (hasGameObjectPosition)
            {
                packet.StartBitStream(goTransportGuid, 7, 3);
                hasGOTransportTime2 = packet.ReadBit();
                packet.StartBitStream(goTransportGuid, 1, 4, 0, 2, 6);
                hasGOTransportTime3 = packet.ReadBit();
                goTransportGuid[5]  = packet.ReadBit();
            }

            if (hasAnimKits)
            {
                hasAnimKit2 = !packet.ReadBit();
                hasAnimKit3 = !packet.ReadBit();
                hasAnimKit1 = !packet.ReadBit();
            }

            if (hasAttackingTarget)
            {
                attackingTargetGuid = packet.StartBitStream(7, 3, 6, 1, 5, 4, 0, 2);
            }

            if (bit208)
            {
                packet.ReadBit("bit21A", index);
                bit228 = packet.ReadBit();
                bit270 = packet.ReadBit();
                packet.ReadBit("bit219", index);
                packet.ReadBit("bit218", index);
                bit21C = packet.ReadBit();
                bit244 = packet.ReadBit();

                if (bit244)
                {
                    bits248 = packet.ReadBits(21);
                    bits258 = packet.ReadBits(21);
                }

                if (bit270)
                {
                    bits274 = packet.ReadBits(20);
                }

                packet.ReadBit("bit21B", index);
            }

            // Sceneobject data
            var CreatorGUID = new byte[8];

            byte[][]   guid310        = null;
            byte[][][] guid34C_4      = null;
            uint[]     bits34C_0      = null;
            uint[][]   bits34C_4_84   = null;
            uint[][]   bits34C_4_94   = null;
            uint[][]   bits34C_4_31   = null;
            uint[][]   bits34C_4_74   = null;
            byte[][][] bit34C_4_78_9  = null;
            byte[][][] bit34C_4_88_10 = null;
            bool[][][] bit34C_4_88_C  = null;
            bool[][][] bit34C_4_88_8  = null;
            bool[][]   bit34C_4_2E    = null;
            bool[][]   bit34C_4_30    = null;
            bool[]     bit34C_4       = null;
            bool[]     bit34C_8       = null;

            var bit318 = false;
            var bit31A = false;
            var bit329 = false;
            var bit320 = false;
            var bit328 = false;
            var bit324 = false;

            uint[]   bits388     = null;
            uint[]   bits388_10  = null;
            byte[][] bit388_1_10 = null;
            bool[][] bit388_1_C  = null;
            bool[][] bit388_1_8  = null;

            if (isSceneObject)
            {
                guid310        = new byte[2][];
                guid34C_4      = new byte[2][][];
                bits34C_0      = new uint[2];
                bits34C_4_84   = new uint[2][];
                bits34C_4_94   = new uint[2][];
                bits34C_4_31   = new uint[2][];
                bits34C_4_74   = new uint[2][];
                bit34C_4_78_9  = new byte[2][][];
                bit34C_4_88_10 = new byte[2][][];
                bit34C_4_88_C  = new bool[2][][];
                bit34C_4_88_8  = new bool[2][][];
                bit34C_4_2E    = new bool[2][];
                bit34C_4_30    = new bool[2][];
                bit34C_4       = new bool[2];
                bit34C_8       = new bool[2];

                for (var i = 0; i < 2; ++i)
                {
                    guid310[i] = new byte[8];
                    packet.StartBitStream(guid310[i], 7, 6);
                    bits34C_0[i] = packet.ReadBits(2);

                    guid34C_4[i]      = new byte[bits34C_0[i]][];
                    bits34C_4_84[i]   = new uint[bits34C_0[i]];
                    bits34C_4_94[i]   = new uint[bits34C_0[i]];
                    bits34C_4_31[i]   = new uint[bits34C_0[i]];
                    bits34C_4_74[i]   = new uint[bits34C_0[i]];
                    bit34C_4_78_9[i]  = new byte[bits34C_0[i]][];
                    bit34C_4_88_10[i] = new byte[bits34C_0[i]][];
                    bit34C_4_88_C[i]  = new bool[bits34C_0[i]][];
                    bit34C_4_88_8[i]  = new bool[bits34C_0[i]][];
                    bit34C_4_2E[i]    = new bool[bits34C_0[i]];
                    bit34C_4_30[i]    = new bool[bits34C_0[i]];

                    for (var j = 0; j < bits34C_0[i]; ++j)
                    {
                        guid34C_4[i][j]   = new byte[8];
                        bit34C_4_2E[i][j] = !packet.ReadBit();
                        packet.StartBitStream(guid34C_4[i][j], 7, 0, 6, 3);

                        bits34C_4_84[i][j]   = packet.ReadBits(21);
                        bit34C_4_88_8[i][j]  = new bool[bits34C_4_84[i][j]];
                        bit34C_4_88_C[i][j]  = new bool[bits34C_4_84[i][j]];
                        bit34C_4_88_10[i][j] = new byte[bits34C_4_84[i][j]];

                        for (var k = 0; k < bits34C_4_84[i][j]; ++k)
                        {
                            bit34C_4_88_10[i][j][k] = (byte)(10 - packet.ReadBit());
                            bit34C_4_88_C[i][j][k]  = !packet.ReadBit();
                            bit34C_4_88_8[i][j][k]  = !packet.ReadBit();
                        }

                        bits34C_4_94[i][j] = packet.ReadBits(21);
                        packet.StartBitStream(guid34C_4[i][j], 2);
                        bit34C_4_30[i][j] = packet.ReadBit();
                        packet.StartBitStream(guid34C_4[i][j], 5, 4, 1);

                        bits34C_4_74[i][j]  = packet.ReadBits(20);
                        bit34C_4_78_9[i][j] = new byte[bits34C_4_74[i][j]];

                        for (var k = 0; k < bits34C_4_74[i][j]; ++k)
                        {
                            bit34C_4_78_9[i][j][k] = (byte)(10 - packet.ReadBit());
                        }

                        bits34C_4_31[i][j] = packet.ReadBits(7);
                    }

                    bit34C_8[i] = !packet.ReadBit();
                    packet.StartBitStream(guid310[i], 3, 5, 2);
                    bit34C_4[i] = packet.ReadBit();
                    packet.StartBitStream(guid310[i], 1, 0, 4);
                }

                bits388     = new uint[3];
                bits388_10  = new uint[3];
                bit388_1_10 = new byte[3][];
                bit388_1_C  = new bool[3][];
                bit388_1_8  = new bool[3][];

                for (var i = 0; i < 3; ++i)
                {
                    bits388[i]     = packet.ReadBits(21);
                    bit388_1_10[i] = new byte[bits388[i]];
                    bit388_1_C[i]  = new bool[bits388[i]];
                    bit388_1_8[i]  = new bool[bits388[i]];

                    for (var j = 0; j < bits388[i]; ++j)
                    {
                        bit388_1_10[i][j] = (byte)(10 - packet.ReadBit());
                        bit388_1_C[i][j]  = packet.ReadBit();
                        bit388_1_8[i][j]  = packet.ReadBit();
                    }

                    bits388_10[i] = packet.ReadBits(21);
                }

                bit31A = !packet.ReadBit();
                bit329 = !packet.ReadBit();
                bit320 = !packet.ReadBit();
                bit328 = !packet.ReadBit();
                packet.ReadBit(); // fake bit
                packet.StartBitStream(CreatorGUID, 7, 1, 0, 2, 3, 6, 4, 5);
                bit324 = !packet.ReadBit();
                bit318 = !packet.ReadBit();
            }

            if (bit3F0)
            {
                bits3F4 = packet.ReadBits(22);
            }

            if (bit28E)
            {
                bits28F = packet.ReadBits(7);
            }

            packet.ResetBitReader();

            for (var i = 0; i < transportFrames; ++i)
            {
                packet.ReadInt32("Transport frame", i, index);
            }

            if (living)
            {
                if (hasTimestamp)
                {
                    packet.ReadUInt32("Time", index);
                }

                for (var i = 0; i < bits168; ++i)
                {
                    packet.ReadSingle("Float16C+5", index);
                    packet.ReadInt32("Int16C+4", index);
                    packet.ReadSingle("Float16C+1", index);
                    packet.ReadInt32("Int16C+0", index);
                    packet.ReadSingle("Float16C+2", index);
                    packet.ReadSingle("Float16C+3", index);
                }

                if (moveInfo.HasSplineData)
                {
                    if (hasFullSpline)
                    {
                        if (hasSplineStartTime)
                        {
                            packet.ReadInt32("Spline Start Time", index);
                        }

                        packet.ReadSingle("Spline Duration Multiplier", index);
                        if (hasSplineVerticalAcceleration)
                        {
                            packet.ReadSingle("Spline Vertical Acceleration", index);
                        }

                        packet.ReadInt32("Spline Time", index);
                        for (var i = 0u; i < splineCount; ++i)
                        {
                            var wp = new Vector3
                            {
                                Z = packet.ReadSingle(),
                                Y = packet.ReadSingle(),
                                X = packet.ReadSingle()
                            };

                            packet.AddValue("Spline Waypoint", wp, index, i);
                        }

                        if (bit134)
                        {
                            for (var i = 0; i < bits138; ++i)
                            {
                                packet.ReadSingle("Float13C+1", index, i);
                                packet.ReadSingle("Float13C+0", index, i);
                            }
                        }

                        packet.ReadSingle("Spline Duration Multiplier Next", index);
                        var type = packet.ReadByte();
                        switch (type)
                        {
                        case 1:
                            splineType = SplineType.Normal;
                            break;

                        case 2:
                            splineType = SplineType.FacingSpot;
                            break;

                        case 3:
                            splineType = SplineType.FacingTarget;
                            break;

                        case 4:
                            splineType = SplineType.FacingAngle;
                            break;
                        }

                        if (splineType == SplineType.FacingAngle)
                        {
                            packet.ReadSingle("Facing Angle", index);
                        }

                        if (splineType == SplineType.FacingSpot)
                        {
                            var point = new Vector3
                            {
                                X = packet.ReadSingle(),
                                Z = packet.ReadSingle(),
                                Y = packet.ReadSingle()
                            };

                            packet.AddValue("Facing Spot", point, index);
                        }

                        packet.ReadInt32("Spline Full Time", index);
                    }

                    moveInfo.Position.Y = packet.ReadSingle();
                    moveInfo.Position.Z = packet.ReadSingle();
                    packet.ReadInt32("Spline Id", index);
                    moveInfo.Position.X = packet.ReadSingle();
                }

                if (hasTransportData)
                {
                    moveInfo.Transport = new MovementInfo.TransportInfo();

                    packet.ReadXORByte(transportGuid, 4);
                    moveInfo.Transport.Offset.Z = packet.ReadSingle();
                    moveInfo.Transport.Offset.Y = packet.ReadSingle();
                    packet.ReadUInt32("Transport Time", index);
                    var seat = packet.ReadByte("Transport Seat", index);
                    packet.ReadXORBytes(transportGuid, 3, 1, 6);
                    if (hasTransportTime2)
                    {
                        packet.ReadUInt32("Transport Time 2", index);
                    }

                    packet.ReadXORByte(transportGuid, 5);
                    moveInfo.Transport.Offset.O = packet.ReadSingle();
                    moveInfo.Transport.Offset.X = packet.ReadSingle();
                    packet.ReadXORBytes(transportGuid, 2, 0, 7);
                    if (hasTransportTime3)
                    {
                        packet.ReadUInt32("Transport Time 3", index);
                    }

                    moveInfo.Transport.Guid = new WowGuid64(BitConverter.ToUInt64(transportGuid, 0));
                    packet.AddValue("Transport GUID", moveInfo.Transport.Guid, index);
                    packet.AddValue("Transport Position", moveInfo.Transport.Offset, 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);
                    }
                }

                packet.ReadXORBytes(guid1, 2, 1);
                packet.ReadSingle("RunBack Speed", index);
                packet.ReadSingle("Fly Speed", index);
                packet.ReadXORBytes(guid1, 0, 3);
                packet.ReadSingle("SwimBack Speed", index);
                if (hasFallData)
                {
                    if (hasFallDirection)
                    {
                        packet.ReadSingle("Jump Sin", index);
                        packet.ReadSingle("Jump Velocity", index);
                        packet.ReadSingle("Jump Cos", index);
                    }
                    packet.ReadSingle("Fall Start Velocity", index);
                    packet.ReadUInt32("Time Fallen", index);
                }

                packet.ReadSingle("Turn Speed", index);
                packet.ReadXORByte(guid1, 5);
                moveInfo.Position.Z = packet.ReadSingle();
                if (hasOrientation)
                {
                    moveInfo.Orientation = packet.ReadSingle();
                }

                packet.ReadXORByte(guid1, 6);
                if (hasSplineElevation)
                {
                    packet.ReadSingle("Spline Elevation", index);
                }

                packet.ReadSingle("Pitch Speed", index);
                if (hasPitch)
                {
                    packet.ReadSingle("Pitch", index);
                }

                for (var i = 0; i < bits98; ++i)
                {
                    packet.ReadInt32("Int9C", index, i);
                }

                moveInfo.WalkSpeed = packet.ReadSingle("Walk Speed", index) / 2.5f;
                if (bitA8)
                {
                    packet.ReadInt32("IntA8", index);
                }

                moveInfo.Position.Y = packet.ReadSingle();
                packet.ReadSingle("Swim Speed", index);
                packet.ReadSingle("FlyBack Speed", index);
                packet.ReadXORByte(guid1, 7);
                moveInfo.RunSpeed   = packet.ReadSingle("Run Speed", index) / 7.0f;
                moveInfo.Position.X = packet.ReadSingle();
                packet.ReadXORByte(guid1, 4);

                packet.WriteGuid("GUID1", guid1, index);
                packet.AddValue("Position", moveInfo.Position, index);
                packet.AddValue("Orientation", moveInfo.Orientation, index);
            }

            if (isSceneObject)
            {
                if (bit318)
                {
                    packet.ReadInt16("Short318", index);
                }

                for (var i = 0; i < 2; ++i)
                {
                    for (var j = 0; j < bits34C_0[i]; ++j)
                    {
                        packet.ReadXORBytes(guid34C_4[i][j], 0, 2);
                        packet.ReadInt32("Int34C+4+8", index, i, j);
                        packet.ReadXORBytes(guid34C_4[i][j], 5, 7);
                        packet.ReadInt32("Int34C+4+18", index, i, j);

                        for (var k = 0; k < bits34C_4_84[i][j]; ++k)
                        {
                            if (bit34C_4_88_C[i][j][k])
                            {
                                packet.ReadInt32("int34C+4+88+C", index, i, j, k);
                            }

                            if (bit34C_4_88_8[i][j][k])
                            {
                                packet.ReadInt32("int34C+4+88+8", index, i, j, k);
                            }

                            if (bit34C_4_88_10[i][j][k] != 9)
                            {
                                packet.ReadByte("byte34C+4+88+10", index, i, j, k);
                            }

                            packet.ReadInt32("int34C+4+88+0", index, i, j, k);
                            packet.ReadInt32("int34C+4+88+4", index, i, j, k);
                        }

                        packet.ReadInt32("int34C+4+28", index, i, j);

                        for (var k = 0; k < bits34C_4_94[i][j]; ++k)
                        {
                            packet.ReadInt32("int34C+4+98+0", index, i, j, k);
                            packet.ReadInt32("int34C+4+98+4", index, i, j, k);
                        }

                        packet.ReadBytes("Bytes34C+4+31", (int)bits34C_4_31[i][j], index, i, j);
                        packet.ReadXORByte(guid34C_4[i][j], 6);

                        for (var k = 0; k < bits34C_4_74[i][j]; ++k)
                        {
                            packet.ReadInt32("int34C+4+78+0", index, i, j, k);
                            packet.ReadByte("byte34C+4+78+8", index, i, j, k);
                            packet.ReadInt16("short34C+4+78+3", index, i, j, k);
                            packet.ReadInt16("short34C+4+78+2", index, i, j, k);
                            if (bit34C_4_78_9[i][j][k] != 9)
                            {
                                packet.ReadByte("byte34C+4+78+9", index, i, j, k);
                            }
                        }

                        if (bit34C_4_2E[i][j])
                        {
                            packet.ReadInt16("short34C+4+2E", index, i, j);
                        }

                        packet.ReadXORByte(guid34C_4[i][j], 4);
                        packet.ReadInt32("int34C+4+24", index, i, j);
                        packet.ReadXORBytes(guid34C_4[i][j], 1, 3);
                        packet.ReadInt16("short34C+4+16", index, i, j);
                        packet.ReadInt32("int34C+4+C", index, i, j);
                        packet.ReadInt32("int34C+4+10", index, i, j);

                        if (!bit34C_4_30[i][j])
                        {
                            packet.ReadByte("byte34C+4+30", index, i, j);
                        }

                        packet.ReadInt32("int34C+4+20", index, i, j);
                        packet.ReadInt32("int34C+4+1C", index, i, j);
                        packet.ReadInt16("short34C+4+14", index, i, j);
                        packet.ReadInt16("short34C+4+2C", index, i, j);
                        packet.WriteGuid("Guid 34C_4", guid34C_4[i][j]);
                    }

                    if (!bit34C_4[i])
                    {
                        packet.ReadByte("byte34C-4", index, i);
                    }

                    packet.ReadXORBytes(guid310[i], 6, 3, 7);
                    packet.ReadInt32("int34C-12", index, i);
                    packet.ReadXORBytes(guid310[i], 5, 1, 4, 0);
                    packet.ReadByte("byte34C+16", index, i);

                    if (bit34C_8[i])
                    {
                        packet.ReadInt32("int34C-8", index, i);
                    }

                    packet.ReadXORByte(guid310[i], 2);
                    packet.WriteGuid("Guid34C-20", guid310[i], index, i);
                }

                packet.ParseBitStream(CreatorGUID, 2, 5, 4, 7, 3, 1, 0, 6);
                packet.WriteGuid("Creator GUID", CreatorGUID);

                if (bit329)
                {
                    packet.ReadByte("byte329", index);
                }

                for (var i = 0; i < 3; ++i)
                {
                    for (var j = 0; j < bits388_10[i]; ++j)
                    {
                        packet.ReadByte("byte388+4+4", index, i, j);
                        packet.ReadByte("byte388+4+0", index, i, j);
                    }

                    for (var j = 0; j < bits388[i]; ++j)
                    {
                        if (bit388_1_10[i][j] != 9)
                        {
                            packet.ReadByte("byte388+1+10", index, i, j);
                        }

                        if (bit388_1_C[i][j])
                        {
                            packet.ReadInt32("int388+1+C", index, i, j);
                        }

                        packet.ReadInt32("int388+1+4", index, i, j);
                        packet.ReadInt32("int388+1+0", index, i, j);

                        if (bit388_1_8[i][j])
                        {
                            packet.ReadInt32("int388+1+8", index, i, j);
                        }
                    }
                }

                if (bit320)
                {
                    packet.ReadInt32("int320", index);
                }
                if (bit31A)
                {
                    packet.ReadInt16("short31A", index);
                }

                packet.ReadInt32("int31C", index);
                if (bit324)
                {
                    packet.ReadInt32("int324", index);
                }
                if (bit328)
                {
                    packet.ReadByte("byte328", index);
                }
            }

            if (hasGameObjectPosition)
            {
                moveInfo.Transport = new MovementInfo.TransportInfo();

                packet.ReadUInt32("GO Transport Time", index);
                packet.ReadXORByte(goTransportGuid, 7);
                moveInfo.Transport.Offset.Y = packet.ReadSingle();
                packet.ReadXORByte(goTransportGuid, 0);
                if (hasGOTransportTime3)
                {
                    packet.ReadUInt32("GO Transport Time 3", index);
                }

                packet.ReadXORByte(goTransportGuid, 3);
                packet.ReadSByte("GO Transport Seat", index);
                packet.ReadXORByte(goTransportGuid, 1);
                moveInfo.Transport.Offset.Z = packet.ReadSingle();
                moveInfo.Transport.Offset.O = packet.ReadSingle();
                if (hasGOTransportTime2)
                {
                    packet.ReadUInt32("GO Transport Time 2", index);
                }

                moveInfo.Transport.Offset.X = packet.ReadSingle();
                packet.ReadXORBytes(goTransportGuid, 2, 4, 5, 6);

                moveInfo.Transport.Guid = new WowGuid64(BitConverter.ToUInt64(goTransportGuid, 0));
                packet.AddValue("GO Transport GUID", moveInfo.Transport.Guid, index);
                packet.AddValue("GO Transport Position", moveInfo.Transport.Offset, index);
            }

            if (bit208)
            {
                if (bit21C)
                {
                    packet.ReadSingle("Float224", index);
                    packet.ReadSingle("Float220", index);
                }

                packet.ReadSingle("Float210", index);
                if (bit244)
                {
                    for (var i = 0; i < bits258; ++i)
                    {
                        packet.ReadSingle("Float25C+1", index);
                        packet.ReadSingle("Float25C+0", index);
                    }

                    for (var i = 0; i < bits248; ++i)
                    {
                        packet.ReadSingle("Float24C+0", index);
                        packet.ReadSingle("Float24C+1", index);
                    }

                    packet.ReadSingle("Float26C", index);
                    packet.ReadSingle("Float268", index);
                }

                if (bit228)
                {
                    packet.ReadSingle("Float22C", index);
                    packet.ReadSingle("Float230", index);
                    packet.ReadSingle("Float23C", index);
                    packet.ReadSingle("Float234", index);
                    packet.ReadSingle("Float238", index);
                    packet.ReadSingle("Float240", index);
                }

                if (bit270)
                {
                    for (var i = 0; i < bits274; ++i)
                    {
                        packet.ReadSingle("Float277+1", index);
                        packet.ReadSingle("Float277+0", index);
                        packet.ReadSingle("Float277+2", index);
                    }
                }

                packet.ReadSingle("Float214", index);
                packet.ReadInt32("Int20C", index);
            }

            if (hasVehicleData)
            {
                packet.ReadSingle("Vehicle Orientation", index);
                moveInfo.VehicleId = packet.ReadUInt32("Vehicle Id", index);
            }

            if (hasAttackingTarget)
            {
                packet.ParseBitStream(attackingTargetGuid, 7, 1, 4, 6, 0, 2, 5, 3);
                packet.WriteGuid("Attacking GUID", attackingTargetGuid, index);
            }

            if (hasGameObjectRotation)
            {
                moveInfo.Rotation = packet.ReadPackedQuaternion("GameObject Rotation", index);
            }

            if (hasAnimKits)
            {
                if (hasAnimKit2)
                {
                    packet.ReadUInt16("Anim Kit 2", index);
                }
                if (hasAnimKit1)
                {
                    packet.ReadUInt16("Anim Kit 1", index);
                }
                if (hasAnimKit3)
                {
                    packet.ReadUInt16("Anim Kit 3", index);
                }
            }

            if (bit28E)
            {
                packet.ReadBytes("Bytes", (int)bits28F, index);
            }

            if (hasStationaryPosition)
            {
                moveInfo.Position.X  = packet.ReadSingle();
                moveInfo.Position.Z  = packet.ReadSingle();
                moveInfo.Orientation = packet.ReadSingle("Stationary Orientation", index);
                moveInfo.Position.Y  = packet.ReadSingle();
                packet.AddValue("Stationary Position", moveInfo.Position, index);
            }

            if (transport)
            {
                packet.ReadInt32("Transport path timer", index);
            }

            if (bit3F0)
            {
                for (var i = 0; i < bits3F4; ++i)
                {
                    packet.ReadInt32("Int3F8", index, i);
                }
            }

            if (bit284)
            {
                packet.ReadInt32("Int288", index);
            }

            if (bit3E8)
            {
                packet.ReadInt32("Int3EC", index);
            }

            if (living && moveInfo.HasSplineData && hasFullSpline && splineType == SplineType.FacingTarget)
            {
                var facingTargetGuid = new byte[8];
                facingTargetGuid = packet.StartBitStream(2, 4, 6, 3, 1, 5, 7, 0);
                packet.ParseBitStream(facingTargetGuid, 1, 3, 6, 7, 2, 4, 5, 0);
                packet.WriteGuid("Facing Target GUID", facingTargetGuid, index);
            }

            return(moveInfo);
        }
        public static MovementInfo ReadMovementUpdateBlock(ref Packet packet, Guid guid, int index)
        {
            var moveInfo = new MovementInfo();

            var flagsTypeCode = ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767) ? TypeCode.UInt16 : TypeCode.Byte;
            var flags         = packet.ReadEnum <UpdateFlag>("[" + index + "] Update Flags", flagsTypeCode);

            if (flags.HasAnyFlag(UpdateFlag.Living))
            {
                if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_0_14333))
                {
                    moveInfo = MovementHandler.ReadMovementInfo420(ref packet, guid, index);
                }
                else
                {
                    moveInfo = MovementHandler.ReadMovementInfo(ref packet, guid, index);
                }
                var moveFlags = moveInfo.Flags;

                var speedCount = ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056) ? 9 : 8;
                int speedShift;
                if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_1_0_13914) &&
                    ClientVersion.RemovedInVersion(ClientVersionBuild.V4_2_2_14545))
                {
                    speedShift = 1;  // enums shifted by one
                }
                else
                {
                    speedShift = 0;
                }

                for (var i = 0; i < speedCount - speedShift; i++)
                {
                    var speedType = (SpeedType)(i + speedShift);
                    var speed     = packet.ReadSingle("[" + index + "] " + speedType + " Speed");

                    switch (speedType)
                    {
                    case SpeedType.Walk:
                    {
                        moveInfo.WalkSpeed = speed / 2.5f;
                        break;
                    }

                    case SpeedType.Run:
                    {
                        moveInfo.RunSpeed = speed / 7.0f;
                        break;
                    }
                    }
                }

                // this is incorrect for certain objects but I can't figure out why
                if (moveFlags.HasAnyFlag(MovementFlag.SplineEnabled) || moveInfo.HasSplineData)
                {
                    var splineFlags = packet.ReadEnum <SplineFlag>("Spline Flags", TypeCode.Int32, index);

                    // HACK: Fix splineflags for next ifs. Need to use different enum for TBC
                    if (ClientVersion.RemovedInVersion(ClientType.WrathOfTheLichKing))
                    {
                        splineFlags = (SplineFlag)((int)splineFlags >> 1);
                    }

                    if (splineFlags.HasAnyFlag(SplineFlag.FinalTarget))
                    {
                        packet.ReadGuid("Final Spline Target GUID", index);
                    }
                    else if (splineFlags.HasAnyFlag(SplineFlag.FinalOrientation))
                    {
                        packet.ReadSingle("Final Spline Orientation", index);
                    }
                    else if (splineFlags.HasAnyFlag(SplineFlag.FinalPoint))
                    {
                        packet.ReadVector3("Final Spline Coords", index);
                    }

                    packet.ReadInt32("Spline Time", index);
                    packet.ReadInt32("Spline Full Time", index);
                    packet.ReadInt32("Spline Unk Int32 1", index);

                    if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767))
                    {
                        packet.ReadSingle("Spline Duration Multiplier", index);
                        packet.ReadSingle("Spline Unit Interval", index);
                        packet.ReadSingle("Spline Unk Float 2", index);
                        packet.ReadInt32("Spline Height Time", index);
                    }

                    var splineCount = packet.ReadInt32();
                    for (var i = 0; i < splineCount; i++)
                    {
                        packet.ReadVector3("Spline Waypoint", index, i);
                    }

                    if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767))
                    {
                        packet.ReadEnum <SplineMode>("Spline Mode", TypeCode.Byte, index);
                    }

                    packet.ReadVector3("Spline Endpoint", index);
                }
            }
            else // !UpdateFlag.Living
            {
                if (flags.HasAnyFlag(UpdateFlag.GOPosition))
                {
                    packet.ReadPackedGuid("GO Position GUID", index);

                    moveInfo.Position = packet.ReadVector3("[" + index + "] GO Position");
                    packet.ReadVector3("GO Transport Position", index);

                    moveInfo.Orientation = packet.ReadSingle("[" + index + "] GO Orientation");
                    packet.ReadSingle("GO Transport Orientation", index);
                }
                else if (flags.HasAnyFlag(UpdateFlag.StationaryObject))
                {
                    packet.ReadVector4("Stationary Position", index);
                }
            }

            if (ClientVersion.RemovedInVersion(ClientVersionBuild.V4_2_2_14545))
            {
                if (flags.HasAnyFlag(UpdateFlag.Unknown1))
                {
                    packet.ReadInt32("Unk Int32", index);
                }

                if (flags.HasAnyFlag(UpdateFlag.LowGuid))
                {
                    packet.ReadInt32("Low GUID", index);
                }
            }

            if (flags.HasAnyFlag(UpdateFlag.AttackingTarget))
            {
                packet.ReadPackedGuid("Target GUID", index);
            }

            if (flags.HasAnyFlag(UpdateFlag.Transport))
            {
                packet.ReadInt32("Transport Movement Time (ms)", index);
            }

            if (flags.HasAnyFlag(UpdateFlag.Vehicle))
            {
                moveInfo.VehicleId = packet.ReadUInt32("[" + index + "] Vehicle ID");
                packet.ReadSingle("Vehicle Orientation", index);
            }

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_2_14545))
            {
                if (flags.HasAnyFlag(UpdateFlag.AnimKits))
                {
                    packet.ReadInt16("Unk Int16", index);
                    packet.ReadInt16("Unk Int16", index);
                    packet.ReadInt16("Unk Int16", index);
                }
            }

            if (flags.HasAnyFlag(UpdateFlag.GORotation))
            {
                packet.ReadPackedQuaternion("GO Rotation", index);
            }

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_2_14545))
            {
                if (flags.HasAnyFlag(UpdateFlag.TransportUnkArray))
                {
                    var count = packet.ReadByte("Count", index);
                    for (var i = 0; i < count; i++)
                    {
                        packet.ReadInt32("Unk Int32", index, count);
                    }
                }
            }

            // Initialize fields that are not used by GOs
            if (guid.GetObjectType() == ObjectType.GameObject)
            {
                moveInfo.VehicleId = 0;
                moveInfo.WalkSpeed = 0;
                moveInfo.RunSpeed  = 0;
            }

            return(moveInfo);
        }
Exemple #21
0
        private static MovementInfo ReadMovementUpdateBlock434(Packet packet, WowGuid guid, object index)
        {
            var moveInfo = new MovementInfo();

            // bits
            /*var bit3 =*/
            packet.ReadBit();
            /*var bit4 =*/
            packet.ReadBit();
            var hasGameObjectRotation = packet.ReadBit("Has GameObject Rotation", index);
            var hasAnimKits           = packet.ReadBit("Has AnimKits", index);
            var hasAttackingTarget    = packet.ReadBit("Has Attacking Target", index);

            packet.ReadBit("Self", index);
            var hasVehicleData = packet.ReadBit("Has Vehicle Data", index);
            var living         = packet.ReadBit("Living", index);
            var unkLoopCounter = packet.ReadBits("Unknown array size", 24, index);

            /*var bit1 =*/
            packet.ReadBit();
            var hasGameObjectPosition = packet.ReadBit("Has GameObject Position", index);
            var hasStationaryPosition = packet.ReadBit("Has Stationary Position", index);
            var hasAreaTrigger        = packet.ReadBit();

            /*var bit2 =*/
            packet.ReadBit();
            var transport                     = packet.ReadBit("Transport", index);
            var hasOrientation                = false;
            var guid2                         = new byte[8];
            var hasPitch                      = false;
            var hasFallData                   = false;
            var hasSplineElevation            = false;
            var hasTransportData              = false;
            var hasTimestamp                  = false;
            var transportGuid                 = new byte[8];
            var hasTransportTime2             = false;
            var hasTransportTime3             = false;
            var bit216                        = false;
            var hasSplineStartTime            = false;
            var splineCount                   = 0u;
            var splineType                    = SplineType.Stop;
            var facingTargetGuid              = new byte[8];
            var hasSplineVerticalAcceleration = false;
            var hasFallDirection              = false;
            var goTransportGuid               = new byte[8];
            var hasGOTransportTime2           = false;
            var hasGOTransportTime3           = false;
            var attackingTargetGuid           = new byte[8];
            var hasAnimKit1                   = false;
            var hasAnimKit2                   = false;
            var hasAnimKit3                   = false;

            if (living)
            {
                var hasMovementFlags = !packet.ReadBit();
                hasOrientation = !packet.ReadBit("Lacks orientation", index);
                guid2[7]       = packet.ReadBit();
                guid2[3]       = packet.ReadBit();
                guid2[2]       = packet.ReadBit();
                if (hasMovementFlags)
                {
                    moveInfo.Flags = (uint)packet.ReadBitsE <MovementFlag>("Movement Flags", 30, index);
                }

                packet.ReadBit("Has MovementInfo spline", index);
                hasPitch = !packet.ReadBit("Lacks pitch", index);
                moveInfo.HasSplineData = packet.ReadBit("Has Spline Data", index);
                hasFallData            = packet.ReadBit("Has Fall Data", index);
                hasSplineElevation     = !packet.ReadBit("Lacks spline elevation", index);
                guid2[5]         = packet.ReadBit();
                hasTransportData = packet.ReadBit("Has Transport Data", index);
                hasTimestamp     = !packet.ReadBit("Lacks timestamp", index);
                if (hasTransportData)
                {
                    transportGuid[1]  = packet.ReadBit();
                    hasTransportTime2 = packet.ReadBit();
                    transportGuid[4]  = packet.ReadBit();
                    transportGuid[0]  = packet.ReadBit();
                    transportGuid[6]  = packet.ReadBit();
                    hasTransportTime3 = packet.ReadBit();
                    transportGuid[7]  = packet.ReadBit();
                    transportGuid[5]  = packet.ReadBit();
                    transportGuid[3]  = packet.ReadBit();
                    transportGuid[2]  = packet.ReadBit();
                }

                guid2[4] = packet.ReadBit();
                if (moveInfo.HasSplineData)
                {
                    bit216 = packet.ReadBit("Has extended spline data", index);
                    if (bit216)
                    {
                        /*var splineMode =*/
                        packet.ReadBitsE <SplineMode>("Spline Mode", 2, index);
                        hasSplineStartTime = packet.ReadBit("Has spline start time", index);
                        splineCount        = packet.ReadBits("Spline Waypoints", 22, index);
                        var bits57 = packet.ReadBits(2);
                        switch (bits57)
                        {
                        case 0:
                            splineType = SplineType.FacingAngle;
                            break;

                        case 1:
                            splineType = SplineType.FacingSpot;
                            break;

                        case 2:
                            splineType = SplineType.FacingTarget;
                            break;

                        case 3:
                            splineType = SplineType.Normal;
                            break;
                        }

                        if (splineType == SplineType.FacingTarget)
                        {
                            facingTargetGuid = packet.StartBitStream(4, 3, 7, 2, 6, 1, 0, 5);
                        }

                        hasSplineVerticalAcceleration = packet.ReadBit("Has spline vertical acceleration", index);
                        packet.AddValue("Spline type", splineType, index);
                        /*splineFlags =*/
                        packet.ReadBitsE <SplineFlag434>("Spline flags", 25, index);
                    }
                }

                guid2[6] = packet.ReadBit();
                if (hasFallData)
                {
                    hasFallDirection = packet.ReadBit("Has Fall Direction", index);
                }

                guid2[0] = packet.ReadBit();
                guid2[1] = packet.ReadBit();
                packet.ReadBit();
                if (!packet.ReadBit())
                {
                    moveInfo.Flags2 = (uint)packet.ReadBitsE <MovementFlag2>("Extra Movement Flags", 12, index);
                }
            }

            if (hasGameObjectPosition)
            {
                goTransportGuid[5]  = packet.ReadBit();
                hasGOTransportTime3 = packet.ReadBit();
                goTransportGuid[0]  = packet.ReadBit();
                goTransportGuid[3]  = packet.ReadBit();
                goTransportGuid[6]  = packet.ReadBit();
                goTransportGuid[1]  = packet.ReadBit();
                goTransportGuid[4]  = packet.ReadBit();
                goTransportGuid[2]  = packet.ReadBit();
                hasGOTransportTime2 = packet.ReadBit();
                goTransportGuid[7]  = packet.ReadBit();
            }

            if (hasAttackingTarget)
            {
                attackingTargetGuid = packet.StartBitStream(2, 7, 0, 4, 5, 6, 1, 3);
            }

            if (hasAnimKits)
            {
                hasAnimKit1 = !packet.ReadBit();
                hasAnimKit2 = !packet.ReadBit();
                hasAnimKit3 = !packet.ReadBit();
            }

            packet.ResetBitReader();

            // Reading data
            for (var i = 0u; i < unkLoopCounter; ++i)
            {
                packet.ReadUInt32("Unk UInt32", index, (int)i);
            }

            if (living)
            {
                packet.ReadXORByte(guid2, 4);

                packet.ReadSingle("RunBack Speed", index);
                if (hasFallData)
                {
                    if (hasFallDirection)
                    {
                        packet.ReadSingle("Jump XY Speed", index);
                        packet.ReadSingle("Jump Cos", index);
                        packet.ReadSingle("Jump Sin", index);
                    }

                    packet.ReadInt32("Time Fallen", index);
                    packet.ReadSingle("Fall Z Speed", index);
                }

                packet.ReadSingle("SwimBack Speed", index);
                if (hasSplineElevation)
                {
                    packet.ReadSingle("Spline Elevation", index);
                }

                if (moveInfo.HasSplineData)
                {
                    if (bit216)
                    {
                        if (hasSplineVerticalAcceleration)
                        {
                            packet.ReadSingle("Spline Vertical Acceleration", index);
                        }
                        packet.ReadUInt32("Spline Time", index);
                        if (splineType == SplineType.FacingAngle)
                        {
                            packet.ReadSingle("Facing Angle", index);
                        }
                        else if (splineType == SplineType.FacingTarget)
                        {
                            packet.ParseBitStream(facingTargetGuid, 5, 3, 7, 1, 6, 4, 2, 0);
                            packet.WriteGuid("Facing Target GUID", facingTargetGuid, index);
                        }

                        for (var i = 0u; i < splineCount; ++i)
                        {
                            var wp = new Vector3
                            {
                                Z = packet.ReadSingle(),
                                X = packet.ReadSingle(),
                                Y = packet.ReadSingle()
                            };

                            packet.AddValue("Spline Waypoint", wp, index, i);
                        }

                        if (splineType == SplineType.FacingSpot)
                        {
                            var point = new Vector3
                            {
                                X = packet.ReadSingle(),
                                Z = packet.ReadSingle(),
                                Y = packet.ReadSingle()
                            };

                            packet.AddValue("Facing Spot", point, index);
                        }

                        packet.ReadSingle("Spline Duration Multiplier Next", index);
                        packet.ReadUInt32("Spline Full Time", index);
                        if (hasSplineStartTime)
                        {
                            packet.ReadUInt32("Spline Start time", index);
                        }

                        packet.ReadSingle("Spline Duration Multiplier", index);
                    }

                    var endPoint = new Vector3
                    {
                        Z = packet.ReadSingle(),
                        X = packet.ReadSingle(),
                        Y = packet.ReadSingle()
                    };

                    packet.ReadUInt32("Spline Id", index);
                    packet.AddValue("Spline Endpoint:", endPoint, index);
                }

                moveInfo.Position.Z = packet.ReadSingle();
                packet.ReadXORByte(guid2, 5);

                if (hasTransportData)
                {
                    moveInfo.Transport = new MovementInfo.TransportInfo();

                    packet.ReadXORByte(transportGuid, 5);
                    packet.ReadXORByte(transportGuid, 7);

                    packet.ReadUInt32("Transport Time", index);
                    moveInfo.Transport.Offset.O = packet.ReadSingle();
                    if (hasTransportTime2)
                    {
                        packet.ReadUInt32("Transport Time 2", index);
                    }

                    moveInfo.Transport.Offset.Y = packet.ReadSingle();
                    moveInfo.Transport.Offset.X = packet.ReadSingle();
                    packet.ReadXORByte(transportGuid, 3);

                    moveInfo.Transport.Offset.Z = packet.ReadSingle();
                    packet.ReadXORByte(transportGuid, 0);

                    if (hasTransportTime3)
                    {
                        packet.ReadUInt32("Transport Time 3", index);
                    }

                    var seat = packet.ReadSByte("Transport Seat", index);
                    packet.ReadXORByte(transportGuid, 1);
                    packet.ReadXORByte(transportGuid, 6);
                    packet.ReadXORByte(transportGuid, 2);
                    packet.ReadXORByte(transportGuid, 4);
                    moveInfo.Transport.Guid = new WowGuid64(BitConverter.ToUInt64(transportGuid, 0));
                    packet.AddValue("Transport GUID", moveInfo.Transport.Guid, index);
                    packet.AddValue("Transport Position", moveInfo.Transport.Offset, 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);
                    }
                }

                moveInfo.Position.X = packet.ReadSingle();
                packet.ReadSingle("Pitch Speed", index);
                packet.ReadXORByte(guid2, 3);
                packet.ReadXORByte(guid2, 0);

                packet.ReadSingle("Swim Speed", index);
                moveInfo.Position.Y = packet.ReadSingle();
                packet.ReadXORByte(guid2, 7);
                packet.ReadXORByte(guid2, 1);
                packet.ReadXORByte(guid2, 2);

                moveInfo.WalkSpeed = packet.ReadSingle("Walk Speed", index) / 2.5f;
                if (hasTimestamp)
                {
                    packet.ReadUInt32("Time", index);
                }

                packet.ReadSingle("FlyBack Speed", index);
                packet.ReadXORByte(guid2, 6);

                packet.ReadSingle("Turn Speed", index);
                if (hasOrientation)
                {
                    moveInfo.Orientation = packet.ReadSingle();
                }

                moveInfo.RunSpeed = packet.ReadSingle("Run Speed", index) / 7.0f;
                if (hasPitch)
                {
                    packet.ReadSingle("Pitch", index);
                }

                packet.ReadSingle("Fly Speed", index);

                packet.WriteGuid("GUID 2", guid2);
                packet.AddValue("Position", moveInfo.Position, index);
                packet.AddValue("Orientation", moveInfo.Orientation, index);
            }

            if (hasVehicleData)
            {
                packet.ReadSingle("Vehicle Orientation", index);
                moveInfo.VehicleId = packet.ReadUInt32("Vehicle Id", index);
            }

            if (hasGameObjectPosition)
            {
                moveInfo.Transport = new MovementInfo.TransportInfo();

                packet.ReadXORByte(goTransportGuid, 0);
                packet.ReadXORByte(goTransportGuid, 5);
                if (hasGOTransportTime3)
                {
                    packet.ReadUInt32("GO Transport Time 3", index);
                }

                packet.ReadXORByte(goTransportGuid, 3);

                moveInfo.Transport.Offset.X = packet.ReadSingle();
                packet.ReadXORByte(goTransportGuid, 4);
                packet.ReadXORByte(goTransportGuid, 6);
                packet.ReadXORByte(goTransportGuid, 1);

                packet.ReadSingle("GO Transport Time", index);
                moveInfo.Transport.Offset.Y = packet.ReadSingle();
                packet.ReadXORByte(goTransportGuid, 2);
                packet.ReadXORByte(goTransportGuid, 7);

                moveInfo.Transport.Offset.Z = packet.ReadSingle();
                packet.ReadByte("GO Transport Seat", index);
                moveInfo.Transport.Offset.O = packet.ReadSingle();
                if (hasGOTransportTime2)
                {
                    packet.ReadUInt32("GO Transport Time 2", index);
                }

                moveInfo.Transport.Guid = new WowGuid64(BitConverter.ToUInt64(goTransportGuid, 0));
                packet.AddValue("GO Transport GUID", moveInfo.Transport.Guid, index);
                packet.AddValue("GO Transport Position", moveInfo.Transport.Offset, index);
            }

            if (hasGameObjectRotation)
            {
                moveInfo.Rotation = packet.ReadPackedQuaternion("GameObject Rotation", index);
            }

            if (hasAreaTrigger)
            {
                // float[] arr = new float[16];
                // ordering: 13, 4, 7, 15, BYTE, 10, 11, 3, 5, 14, 6, 1, 8, 12, 0, 2, 9
                var arr      = new float[16];
                var sequence = new int[] { 13, 4, 7, 15, 10, 11, 3, 5, 14, 6, 1, 8, 12, 0, 2, 9 };
                foreach (var idx in sequence)
                {
                    arr[idx] = packet.ReadSingle($"AreaTrigger Data[{idx}]");
                    if (idx == 15)
                    {
                        packet.ReadByte("AreaTrigger Byte");
                    }
                }
            }

            if (hasStationaryPosition)
            {
                moveInfo.Orientation = packet.ReadSingle("Stationary Orientation", index);
                moveInfo.Position    = packet.ReadVector3("Stationary Position", index);
            }

            if (hasAttackingTarget)
            {
                packet.ParseBitStream(attackingTargetGuid, 4, 0, 3, 5, 7, 6, 2, 1);
                packet.WriteGuid("Attacking Target GUID", attackingTargetGuid, index);
            }

            if (hasAnimKits)
            {
                if (hasAnimKit1)
                {
                    packet.ReadUInt16("AI Anim Kit Id", index);
                }
                if (hasAnimKit2)
                {
                    packet.ReadUInt16("Movement Anim Kit Id", index);
                }
                if (hasAnimKit3)
                {
                    packet.ReadUInt16("Melee Anim Kit Id", index);
                }
            }

            if (transport)
            {
                packet.ReadUInt32("Transport path timer", index);
            }

            return(moveInfo);
        }
Exemple #22
0
        private static MovementInfo ReadMovementUpdateBlock(Packet packet, WowGuid guid, object index)
        {
            var moveInfo = new MovementInfo();

            var guid1               = new byte[8];
            var transportGuid       = new byte[8];
            var goTransportGuid     = new byte[8];
            var attackingTargetGuid = new byte[8];
            var guid5               = new byte[8];
            var guid6               = new byte[8];
            var guid7               = new byte[8];

            var hasAnimKit1                   = false;
            var hasAnimKit2                   = false;
            var hasAnimKit3                   = false;
            var hasFullSpline                 = false;
            var hasSplineStartTime            = false;
            var hasSplineVerticalAcceleration = false;
            var hasMovementFlags              = false;
            var hasMoveFlagsExtra             = false;
            var hasTimestamp                  = false;
            var hasOrientation                = false;
            var hasTransportData              = false;
            var hasTransportTime2             = false;
            var hasTransportTime3             = false;
            var hasGOTransportTime2           = false;
            var hasGOTransportTime3           = false;
            var hasPitch           = false;
            var hasFallData        = false;
            var hasFallDirection   = false;
            var hasSplineElevation = false;

            var bit134 = false;
            var bitA8  = false;
            var bit23C = false;
            var bit298 = false;
            var bit230 = false;
            var bit284 = false;
            var bit228 = false;
            var bit258 = false;
            var bit218 = false;
            var bit220 = false;

            var bits168     = 0u;
            var splineCount = 0u;
            var bits138     = 0u;
            var bits98      = 0u;
            var bits25C     = 0u;
            var bits26C     = 0u;
            var bits288     = 0u;
            var bits418     = 0u;
            var bits2AA     = 0u;
            var splineType  = SplineType.Stop;

            var bit2A4                = packet.ReadBit();                                 // 676
            var hasVehicleData        = packet.ReadBit("Has Vehicle Data", index);        // 488
            var bit414                = packet.ReadBit();                                 // 1044
            var hasGameObjectRotation = packet.ReadBit("Has GameObject Rotation", index); // 512

            packet.ReadBit();                                                             // fake 0
            var isLiving           = packet.ReadBit("Is Living", index);                  // 368
            var hasSceneObjectData = packet.ReadBit("Has Scene Object Data", index);      // 1032

            packet.ReadBit();                                                             // fake 2
            var bit29C = packet.ReadBit();                                                // 668
            var bit2A8 = packet.ReadBit();                                                // 680
            var bit2A9 = packet.ReadBit();                                                // 681

            packet.ReadBit();                                                             // fake 1
            var hasTransportPosition = packet.ReadBit("Has Transport Position", index);   // 424
            var bit1DC                = packet.ReadBit();                                 // 476
            var hasAnimKits           = packet.ReadBit("Has Anim Kits", index);           // 498
            var hasStationaryPosition = packet.ReadBit("Has Stationary Position", index); // 448
            var hasAttackingTarget    = packet.ReadBit("Has Attacking Target", index);    // 464

            packet.ReadBit();                                                             // fake 3
            var transportFrames = packet.ReadBits("Transport Frames Count", 22, index);   // 1068
            var bit32A          = packet.ReadBit();                                       // 810
            var bit428          = packet.ReadBit();                                       // 1064

            if (bit428)
            {
                bits418 = packet.ReadBits(22);
            }

            if (hasTransportPosition)
            {
                packet.StartBitStream(goTransportGuid, 3, 5, 2, 1, 4);
                hasGOTransportTime3 = packet.ReadBit();
                hasGOTransportTime2 = packet.ReadBit();
                packet.StartBitStream(goTransportGuid, 0, 6, 7);
            }

            if (isLiving)
            {
                hasTransportData = packet.ReadBit("Has Transport Data", index);
                if (hasTransportData)
                {
                    transportGuid[4]  = packet.ReadBit();
                    transportGuid[0]  = packet.ReadBit();
                    transportGuid[5]  = packet.ReadBit();
                    transportGuid[2]  = packet.ReadBit();
                    transportGuid[3]  = packet.ReadBit();
                    hasTransportTime2 = packet.ReadBit();
                    transportGuid[7]  = packet.ReadBit();
                    transportGuid[6]  = packet.ReadBit();
                    transportGuid[1]  = packet.ReadBit();
                    hasTransportTime3 = packet.ReadBit();
                }

                hasPitch = !packet.ReadBit("Has Pitch", index);
                packet.ReadBit();
                bits168           = packet.ReadBits(19);
                guid1[1]          = packet.ReadBit();
                hasMoveFlagsExtra = !packet.ReadBit();
                packet.ReadBit();
                hasSplineElevation = !packet.ReadBit("Has SplineElevation", index);

                if (hasMoveFlagsExtra)
                {
                    moveInfo.Flags2 = (uint)packet.ReadBitsE <MovementFlag2>("Extra Movement Flags", 13, index);
                }

                hasOrientation   = !packet.ReadBit();
                hasTimestamp     = !packet.ReadBit();
                hasMovementFlags = !packet.ReadBit();
                bitA8            = !packet.ReadBit("bitA8", index);
                guid1[2]         = packet.ReadBit();
                guid1[6]         = packet.ReadBit();
                hasFallData      = packet.ReadBit();
                guid1[5]         = packet.ReadBit();
                guid1[4]         = packet.ReadBit();
                guid1[0]         = packet.ReadBit();

                if (hasMovementFlags)
                {
                    moveInfo.Flags = (uint)packet.ReadBitsE <MovementFlag>("Movement Flags", 30, index);
                }
                packet.ReadBit();
                if (hasFallData)
                {
                    hasFallDirection = packet.ReadBit();
                }
                bits98 = packet.ReadBits("bits98", 22, index);

                guid1[7] = packet.ReadBit();
                moveInfo.HasSplineData = packet.ReadBit();
                guid1[3] = packet.ReadBit();


                if (moveInfo.HasSplineData)
                {
                    hasFullSpline = packet.ReadBit();
                    if (hasFullSpline)
                    {
                        hasSplineVerticalAcceleration = packet.ReadBit();
                        packet.ReadBitsE <SplineMode>("Spline Mode", 2, index);
                        splineCount = packet.ReadBits(20);
                        packet.ReadBitsE <SplineFlag434>("Spline flags", 25, index);

                        hasSplineStartTime = packet.ReadBit();
                        bit134             = packet.ReadBit();
                        if (bit134)
                        {
                            bits138 = packet.ReadBits(21);
                            packet.ReadBits(2);
                        }
                    }
                }
            }

            if (bit29C)
            {
                bit230 = packet.ReadBit();
                bit258 = packet.ReadBit();
                packet.ReadBit("bit20E", index);
                packet.ReadBit("bit20F", index);
                bit228 = packet.ReadBit();
                packet.ReadBit("bit20C", index);
                bit218 = packet.ReadBit();
                packet.ReadBit("bit20D", index);
                bit284 = packet.ReadBit();

                if (bit284)
                {
                    bits25C = packet.ReadBits(21);
                    bits26C = packet.ReadBits(21);
                }

                bit298 = packet.ReadBit();

                if (bit298)
                {
                    bits288 = packet.ReadBits(20);
                }

                bit23C = packet.ReadBit();
                packet.ReadBit("bit210", index);
                bit220 = packet.ReadBit();
            }

            if (hasAttackingTarget)
            {
                attackingTargetGuid = packet.StartBitStream(4, 6, 3, 5, 0, 2, 7, 1);
            }

            if (hasAnimKits)
            {
                hasAnimKit1 = !packet.ReadBit();
                hasAnimKit2 = !packet.ReadBit();
                hasAnimKit3 = !packet.ReadBit();
            }

            if (bit32A)
            {
                bits2AA = packet.ReadBits(7);
            }

            packet.ResetBitReader();

            for (var i = 0; i < transportFrames; ++i)
            {
                packet.ReadInt32("Transport frame", index, i);
            }

            if (bit29C)
            {
                if (bit23C)
                {
                    packet.ReadSingle("Float234", index);
                    packet.ReadSingle("Float238", index);
                }

                if (bit284)
                {
                    for (var i = 0; i < bits26C; ++i)
                    {
                        packet.ReadSingle("Float270+0", index, i);
                        packet.ReadSingle("Float270+1", index, i);
                    }

                    packet.ReadSingle("Float27C", index);

                    for (var i = 0; i < bits25C; ++i)
                    {
                        packet.ReadSingle("Float260+0", index, i);
                        packet.ReadSingle("Float260+1", index, i);
                    }

                    packet.ReadSingle("Float280", index);
                }

                if (bit258)
                {
                    packet.ReadSingle("Float244", index);
                    packet.ReadSingle("Float250", index);
                    packet.ReadSingle("Float254", index);
                    packet.ReadSingle("Float248", index);
                    packet.ReadSingle("Float240", index);
                    packet.ReadSingle("Float24C", index);
                }

                packet.ReadInt32("Int208", index);

                if (bit298)
                {
                    for (var i = 0; i < bits288; ++i)
                    {
                        packet.ReadSingle("Float28C+0", index, i);
                        packet.ReadSingle("Float28C+1", index, i);
                        packet.ReadSingle("Float28C+2", index, i);
                    }
                }

                if (bit220)
                {
                    packet.ReadInt32("int21C", index);
                }

                if (bit218)
                {
                    packet.ReadInt32("int214", index);
                }

                if (bit230)
                {
                    packet.ReadInt32("int22C", index);
                }

                if (bit228)
                {
                    packet.ReadInt32("int224", index);
                }
            }

            if (isLiving)
            {
                if (hasFallData)
                {
                    if (hasFallDirection)
                    {
                        packet.ReadSingle("Jump Sin Angle", index);
                        packet.ReadSingle("Jump Cos Angle", index);
                        packet.ReadSingle("Jump XY Speed", index);
                    }

                    packet.ReadSingle("Jump Z Speed", index);
                    packet.ReadUInt32("Jump Fall Time", index);
                }

                if (moveInfo.HasSplineData)
                {
                    if (hasFullSpline)
                    {
                        packet.ReadSingle("Duration Mod Next", index);
                        for (uint i = 0; i < splineCount; i++)
                        {
                            Vector3 v = new Vector3();
                            v.Z = packet.ReadSingle();
                            v.Y = packet.ReadSingle();
                            v.X = packet.ReadSingle();

                            packet.AddValue("Spline", v, index);
                        }

                        var type = packet.ReadByte();
                        switch (type)
                        {
                        case 1:
                            splineType = SplineType.Normal;
                            break;

                        case 2:
                            splineType = SplineType.FacingSpot;
                            break;

                        case 3:
                            splineType = SplineType.FacingTarget;
                            break;

                        case 4:
                            splineType = SplineType.FacingAngle;
                            break;
                        }

                        packet.ReadSingle("Duration Mod", index);

                        //    NYI block here

                        if (splineType == SplineType.FacingSpot)
                        {
                            packet.ReadVector3("Facing spot", index);
                        }

                        if (hasSplineVerticalAcceleration)
                        {
                            packet.ReadSingle("Spline Vertical Acceleration", index);
                        }

                        if (splineType == SplineType.FacingAngle)
                        {
                            packet.ReadSingle("Facing Angle", index);
                        }

                        packet.ReadUInt32("Spline FULL Time", index);
                        if (hasSplineStartTime)
                        {
                            packet.ReadUInt32("Spline Start time", index);
                        }

                        packet.ReadUInt32("Spline Time", index);
                    }

                    packet.ReadUInt32("Spline ID", index);
                    packet.ReadVector3("Spline Endpoint", index);
                }

                /*for (var i = 0; i < 10; ++i)
                 *  packet.ReadSingle("unk float");
                 * if (bits98 > 0)
                 *  packet.ReadBits((int)bits98);*/
                //for (var i = 0; i < bits98; ++i)
                //    packet.ReadInt32("Int9C", index, i);


                moveInfo.Position.Z = packet.ReadSingle();
                moveInfo.Position.Y = packet.ReadSingle();
                packet.ReadSingle("Fly Speed", index);
                packet.ReadXORByte(guid1, 6);
                packet.ReadSingle("Fly Back Speed", index);

                if (hasTransportData)
                {
                    moveInfo.Transport = new MovementInfo.TransportInfo();

                    packet.ReadXORByte(transportGuid, 7);
                    packet.ReadXORByte(transportGuid, 4);

                    if (hasTransportTime3)
                    {
                        packet.ReadUInt32("Transport Time 3", index);
                    }

                    packet.ReadUInt32("Transport Time", index);

                    if (hasTransportTime2)
                    {
                        packet.ReadUInt32("Transport Time 2", index);
                    }

                    moveInfo.Transport.Offset.O = packet.ReadSingle();
                    moveInfo.Transport.Offset.X = packet.ReadSingle();
                    packet.ReadXORByte(transportGuid, 6);
                    packet.ReadXORByte(transportGuid, 3);
                    packet.ReadXORByte(transportGuid, 2);
                    moveInfo.Transport.Offset.Z = packet.ReadSingle();
                    moveInfo.Transport.Offset.Y = packet.ReadSingle();
                    var seat = packet.ReadSByte("Transport Seat", index);
                    packet.ReadXORByte(transportGuid, 1);
                    packet.ReadXORByte(transportGuid, 0);
                    packet.ReadXORByte(transportGuid, 5);

                    moveInfo.Transport.Guid = new WowGuid64(BitConverter.ToUInt64(transportGuid, 0));
                    packet.AddValue("Transport GUID", moveInfo.Transport.Guid, index);
                    packet.AddValue("Transport Position", moveInfo.Transport.Offset, 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);
                    }
                }

                moveInfo.Position.X = packet.ReadSingle();
                packet.AddValue("Position", moveInfo.Position, index);
                packet.ReadXORByte(guid1, 2);

                if (hasPitch)
                {
                    packet.ReadSingle("Pitch", index);
                }

                packet.ReadSingle("Swim Speed", index);
                packet.ReadXORByte(guid1, 1);
                packet.ReadSingle("Run Back Speed", index);
                packet.ReadSingle("Swim Back Speed", index);
                packet.ReadXORByte(guid1, 5);

                if (hasSplineElevation)
                {
                    packet.ReadSingle("Spline Elevation", index);
                }

                if (bitA8)
                {
                    packet.ReadInt32("IntA8", index);
                }

                packet.ReadSingle("Turn Speed", index);
                packet.ReadXORByte(guid1, 3);
                moveInfo.RunSpeed = packet.ReadSingle("Run Speed", index) / 7.0f;
                packet.ReadXORByte(guid1, 7);
                moveInfo.WalkSpeed = packet.ReadSingle("Walk Speed", index) / 2.5f;
                packet.ReadSingle("Pitch Speed", index);

                if (hasTimestamp)
                {
                    packet.ReadUInt32("Time?", index);
                }

                packet.ReadXORByte(guid1, 4);
                packet.ReadXORByte(guid1, 0);
                packet.WriteGuid("GUID2", guid1);

                if (hasOrientation)
                {
                    moveInfo.Orientation = packet.ReadSingle("Orientation", index);
                }
            }

            if (hasAttackingTarget)
            {
                packet.ParseBitStream(attackingTargetGuid, 5, 1, 2, 0, 3, 4, 6, 7);
                packet.WriteGuid("Attacking Target GUID", attackingTargetGuid, index);
            }

            if (hasStationaryPosition)
            {
                moveInfo.Orientation = packet.ReadSingle("Stationary Orientation", index);
                moveInfo.Position    = packet.ReadVector3("Stationary Position", index);
            }

            if (hasTransportPosition)
            {
                moveInfo.Transport = new MovementInfo.TransportInfo();

                packet.ReadSByte("Transport Seat", index);
                moveInfo.Transport.Offset.X = packet.ReadSingle();
                packet.ReadXORBytes(goTransportGuid, 1, 0, 2, 6, 5, 4);

                if (hasGOTransportTime2)
                {
                    packet.ReadUInt32("Transport Time 3", index);
                }

                packet.ReadXORByte(goTransportGuid, 7);
                moveInfo.Transport.Offset.O = packet.ReadSingle();
                moveInfo.Transport.Offset.Z = packet.ReadSingle();
                moveInfo.Transport.Offset.Y = packet.ReadSingle();

                if (hasGOTransportTime3)
                {
                    packet.ReadUInt32("Transport Time 2", index);
                }

                packet.ReadXORByte(goTransportGuid, 3);
                packet.ReadUInt32("Transport Time", index);

                moveInfo.Transport.Guid = new WowGuid64(BitConverter.ToUInt64(goTransportGuid, 0));
                packet.AddValue("Transport GUID", moveInfo.Transport.Guid, index);
                packet.AddValue("Transport Position", moveInfo.Transport.Offset, index);
            }

            if (bit1DC)
            {
                packet.ReadInt32("int1D8", index);
            }

            if (bit2A4)
            {
                packet.ReadInt32("int2A0", index);
            }

            if (bit32A)
            {
                packet.ReadBytes("Bytes", (int)bits2AA);
            }

            if (hasGameObjectRotation)
            {
                moveInfo.Rotation = packet.ReadPackedQuaternion("GameObject Rotation", index);
            }

            if (hasVehicleData)
            {
                moveInfo.VehicleId = packet.ReadUInt32("Vehicle Id", index);
                packet.ReadSingle("Vehicle Orientation", index);
            }

            if (bit414)
            {
                packet.ReadInt32("int410", index);
            }

            if (hasAnimKits)
            {
                if (hasAnimKit1)
                {
                    packet.ReadUInt16("Anim Kit 1", index);
                }
                if (hasAnimKit2)
                {
                    packet.ReadUInt16("Anim Kit 2", index);
                }
                if (hasAnimKit3)
                {
                    packet.ReadUInt16("Anim Kit 3", index);
                }
            }

            if (bit428)
            {
                for (var i = 0; i < bits418; ++i)
                {
                    packet.ReadInt32("Int3F8", index, i);
                }
            }

            if (isLiving && moveInfo.HasSplineData && hasFullSpline && splineType == SplineType.FacingTarget)
            {
                var facingTargetGuid = new byte[8];
                packet.StartBitStream(facingTargetGuid, 6, 7, 3, 0, 5, 1, 4, 2);
                packet.ParseBitStream(facingTargetGuid, 4, 2, 5, 6, 0, 7, 1, 3);
                packet.WriteGuid("Facing Target GUID", facingTargetGuid, index);
            }

            return(moveInfo);
        }
        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 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)
                {
                    V7_0_3_22248.Parsers.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();
                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);
        }
    }
Exemple #24
0
        public static void HandleMoveStopTurn(ref PacketReader packet, ref WorldSession session)
        {
            var mi = new MovementInfo();

            byte[] mask = new byte[8];

            mi.Pos = new ObjectPosition()
            {
                X = packet.ReadFloat(),
                Z = packet.ReadFloat(),
                Y = packet.ReadFloat()
            };

            mi.Status.HasTimeStamp = !packet.ReadBit();
            mask[5] = packet.GetBit();
            bool Unknown = packet.ReadBit();

            mi.Status.HasTransportData = packet.ReadBit();
            bool Unknown2 = packet.ReadBit();

            mask[3] = packet.GetBit();
            mi.Status.HasSplineElevation = !packet.ReadBit();
            mask[0]            = packet.GetBit();
            mi.Status.HasPitch = !packet.ReadBit();
            uint counter = packet.GetBits <uint>(24);

            mask[1] = packet.GetBit();
            mask[7] = packet.GetBit();
            mi.Status.HasMovementFlags = !packet.ReadBit();
            mi.Status.IsAlive          = !packet.ReadBit();
            mask[2] = packet.GetBit();
            mask[6] = packet.GetBit();
            mi.Status.HasOrientation = !packet.ReadBit();
            bool Unknown3 = packet.ReadBit();

            mi.Status.HasMovementFlags2 = !packet.ReadBit();
            bool Unknown4 = packet.ReadBit();

            mask[4] = packet.GetBit();

            if (mi.Status.HasTransportData)
            {
            }

            if (mi.Status.HasFallData)
            {
                mi.Status.HasFallDirection = packet.ReadBit();
            }

            if (mi.Status.HasMovementFlags)
            {
                mi.Flags = (MovementFlag)packet.GetBits <uint>(30);
            }

            if (mi.Status.HasMovementFlags2)
            {
                mi.Flags2 = (MovementFlag2)packet.GetBits <uint>(13);
            }

            mi.Guid[6] = packet.ReadByteSeq(mask[6]);
            mi.Guid[0] = packet.ReadByteSeq(mask[0]);
            mi.Guid[5] = packet.ReadByteSeq(mask[5]);

            for (int i = 0; i < counter; i++)
            {
                packet.ReadUInt32();
            }

            mi.Guid[1] = packet.ReadByteSeq(mask[1]);
            mi.Guid[7] = packet.ReadByteSeq(mask[7]);
            mi.Guid[3] = packet.ReadByteSeq(mask[3]);
            mi.Guid[4] = packet.ReadByteSeq(mask[4]);
            mi.Guid[2] = packet.ReadByteSeq(mask[2]);

            if (mi.Status.HasTransportData)
            {
            }

            if (mi.Status.HasOrientation)
            {
                mi.Pos.Orientation = packet.ReadFloat();
            }

            if (mi.Status.IsAlive)
            {
                mi.Time = packet.ReadUInt32();
            }

            if (mi.Status.HasFallData)
            {
            }

            if (mi.Status.HasPitch)
            {
                mi.Pitch = packet.ReadFloat();
            }

            if (mi.Status.HasSplineElevation)
            {
                mi.SplineElevation = packet.ReadFloat();
            }

            if (mi.Status.HasTimeStamp)
            {
                mi.Time = packet.ReadUInt32();
            }

            HandleMoveUpdate(ref session, mi);
        }
Exemple #25
0
        public bool DragonDrop(int distance)
        {
            if (CurrentMap == null)
            {
                return(false);
            }

            Cell  best         = null;
            int   bestCount    = 0;
            Point bestLocation = Point.Empty;

            for (int d = 0; d <= distance; d++)
            {
                for (int y = CurrentLocation.Y + 3; y <= CurrentLocation.Y + (d * 2); y++)
                {
                    if (y < 0)
                    {
                        continue;
                    }
                    if (y >= CurrentMap.Height)
                    {
                        break;
                    }

                    for (int x = CurrentLocation.X - d; x <= CurrentLocation.X + d; x += Math.Abs(y - CurrentLocation.Y) == d ? 1 : d * 2)
                    {
                        if (x < 0)
                        {
                            continue;
                        }
                        if (x >= CurrentMap.Width)
                        {
                            break;
                        }
                        if (!CurrentMap.ValidPoint(x, y))
                        {
                            continue;
                        }

                        bool movement = false;
                        for (int i = 0; i < CurrentMap.Info.Movements.Count; i++)
                        {
                            MovementInfo info = CurrentMap.Info.Movements[i];
                            if (info.Source != new Point(x, y))
                            {
                                continue;
                            }
                            movement = true;
                            break;
                        }

                        if (movement)
                        {
                            continue;
                        }

                        Cell cell = CurrentMap.GetCell(x, y);

                        if (cell.Objects == null)
                        {
                            CurrentLocation = new Point(x, y);
                            CurrentMap.AddObject(this);
                            Spawned();
                            return(true);
                        }

                        int  count    = 0;
                        bool blocking = false;

                        for (int i = 0; i < cell.Objects.Count; i++)
                        {
                            MapObject ob = cell.Objects[i];
                            if (ob.Blocking)
                            {
                                blocking = true;
                                break;
                            }
                            if (ob.Race == ObjectType.Item)
                            {
                                count++;
                            }
                        }

                        if (blocking || count >= Settings.DropStackSize)
                        {
                            continue;
                        }

                        if (count == 0)
                        {
                            CurrentLocation = new Point(x, y);
                            CurrentMap.AddObject(this);
                            Spawned();
                            return(true);
                        }

                        if (best == null || count < bestCount)
                        {
                            best         = cell;
                            bestCount    = count;
                            bestLocation = new Point(x, y);
                        }
                    }
                }
            }

            if (best == null)
            {
                return(false);
            }

            CurrentLocation = bestLocation;
            CurrentMap.AddObject(this);
            Spawned();
            return(true);
        }
Exemple #26
0
        static void WriteMovementInfo(ref PacketWriter writer, MovementInfo mi)
        {
            writer.WriteBit(mi.Guid[0]);
            writer.WriteBit(!mi.Status.HasMovementFlags);
            writer.WriteBit(!mi.Status.HasOrientation);
            writer.WriteBit(mi.Guid[2]);
            writer.WriteBit(mi.Guid[6]);
            writer.WriteBit(!mi.Status.HasMovementFlags2);
            writer.WriteBit(mi.Guid[7]);
            writer.WriteBits <uint>(0, 24);
            writer.WriteBit(mi.Guid[1]);
            if (mi.Status.HasMovementFlags)
            {
                writer.WriteBits((uint)mi.Flags, 30);
            }
            writer.WriteBit(mi.Guid[4]);
            writer.WriteBit(!mi.Status.IsAlive);
            writer.WriteBit(mi.Status.HasTransportData);//not sure
            if (mi.Status.HasMovementFlags2)
            {
                writer.WriteBits((uint)mi.Flags2, 13);
            }

            writer.WriteBit(mi.Status.HasSpline);
            writer.WriteBit(mi.Guid[5]);
            writer.WriteBit(true);                          //not sure
            writer.WriteBit(0);                             //not sure
            writer.WriteBit(mi.Status.HasFallData);
            writer.WriteBit(false);                         //not sure
            writer.WriteBit(!mi.Status.HasPitch);           //not sure
            writer.WriteBit(mi.Guid[3]);
            writer.WriteBit(!mi.Status.HasSplineElevation); //not sure

            if (mi.Status.HasFallData)
            {
                writer.WriteBit(mi.Status.HasFallDirection);
            }

            /*
             * if (mi.Status.HaveTransportData)
             * {
             *  writer.WriteBit(mi.TransGuid[3]);
             *  writer.WriteBit(mi.Status.HaveTransportTime3);
             *  writer.WriteBit(mi.TransGuid[6]);
             *  writer.WriteBit(mi.TransGuid[1]);
             *  writer.WriteBit(mi.TransGuid[7]);
             *  writer.WriteBit(mi.TransGuid[0]);
             *  writer.WriteBit(mi.TransGuid[4]);
             *  writer.WriteBit(mi.Status.HaveTransportTime2);
             *  writer.WriteBit(mi.TransGuid[5]);
             *  writer.WriteBit(mi.TransGuid[2]);
             * }
             */
            writer.BitFlush();

            if (mi.Status.HasFallData)
            {
                writer.WriteUInt32(mi.FallTime);
                if (mi.Status.HasFallDirection)
                {
                    writer.WriteFloat(mi.Jump.xyspeed);
                    writer.WriteFloat(mi.Jump.cosAngle);
                    writer.WriteFloat(mi.Jump.sinAngle);
                }
                writer.WriteFloat(mi.Jump.velocity);
            }
            if (mi.Status.IsAlive)
            {
                writer.WriteUInt32(mi.Time);
            }
            writer.WriteByteSeq(mi.Guid[5]);
            writer.WriteByteSeq(mi.Guid[7]);
            writer.WriteByteSeq(mi.Guid[1]);
            writer.WriteFloat(mi.Pos.Z);
            writer.WriteByteSeq(mi.Guid[4]);
            writer.WriteByteSeq(mi.Guid[3]);
            writer.WriteByteSeq(mi.Guid[2]);
            writer.WriteByteSeq(mi.Guid[6]);
            writer.WriteByteSeq(mi.Guid[0]);

            writer.WriteFloat(mi.Pos.X);
            if (mi.Status.HasOrientation)
            {
                writer.WriteFloat(mi.Pos.Orientation);
            }
            writer.WriteFloat(mi.Pos.Y);


            /*
             * if (mi.Status.HaveSplineElevation)
             *  writer.WriteFloat(mi.SplineElevation);
             *
             * if (mi.Status.HaveTransportData)
             * {
             *  if (mi.Status.HaveTransportTime3)
             *      writer.WriteUInt32(mi.TransTime2);
             *  writer.WriteByteSeq(mi.TransGuid[6]);
             *  writer.WriteInt32(mi.TransSeat);
             *  writer.WriteByteSeq(mi.TransGuid[5]);
             *  writer.WriteFloat(mi.TransPos.X);
             *  writer.WriteByteSeq(mi.TransGuid[1]);
             *  writer.WriteFloat(mi.TransPos.Orientation);
             *  writer.WriteByteSeq(mi.TransGuid[2]);
             *  if (mi.Status.HaveTransportTime2)
             *      writer.WriteUInt32(mi.TransTime2);
             *  writer.WriteByteSeq(mi.TransGuid[0]);
             *  writer.WriteFloat(mi.TransPos.Z);
             *  writer.WriteByteSeq(mi.TransGuid[7]);
             *  writer.WriteByteSeq(mi.TransGuid[4]);
             *  writer.WriteByteSeq(mi.TransGuid[3]);
             *  writer.WriteFloat(mi.TransPos.Y);
             *  writer.WriteUInt32(mi.TransTime);
             * }
             *
             * if (mi.Status.HavePitch)
             *  writer.WriteFloat(mi.Pitch);
             */
        }
Exemple #27
0
        public Cell GetMovement(MapObject ob)
        {
            if (Movements == null || Movements.Count == 0)
            {
                return(this);
            }

            for (int i = 0; i < 5; i++) //20 Attempts to get movement;
            {
                MovementInfo movement = Movements[SEnvir.Random.Next(Movements.Count)];

                Map map = SEnvir.GetMap(movement.DestinationRegion.Map);


                Cell cell = map.GetCell(movement.DestinationRegion.PointList[SEnvir.Random.Next(movement.DestinationRegion.PointList.Count)]);

                if (cell == null)
                {
                    continue;
                }

                if (ob.Race == ObjectType.Player)
                {
                    PlayerObject player = (PlayerObject)ob;

                    if (movement.DestinationRegion.Map.MinimumLevel > ob.Level && !player.Character.Account.TempAdmin)
                    {
                        player.Connection.ReceiveChat(string.Format(player.Connection.Language.NeedLevel, movement.DestinationRegion.Map.MinimumLevel), MessageType.System);

                        foreach (SConnection con in player.Connection.Observers)
                        {
                            con.ReceiveChat(string.Format(con.Language.NeedLevel, movement.DestinationRegion.Map.MinimumLevel), MessageType.System);
                        }

                        break;
                    }
                    if (movement.DestinationRegion.Map.MaximumLevel > 0 && movement.DestinationRegion.Map.MaximumLevel < ob.Level && !player.Character.Account.TempAdmin)
                    {
                        player.Connection.ReceiveChat(string.Format(player.Connection.Language.NeedMaxLevel, movement.DestinationRegion.Map.MaximumLevel), MessageType.System);

                        foreach (SConnection con in player.Connection.Observers)
                        {
                            con.ReceiveChat(string.Format(con.Language.NeedMaxLevel, movement.DestinationRegion.Map.MaximumLevel), MessageType.System);
                        }

                        break;
                    }

                    if (movement.NeedSpawn != null)
                    {
                        SpawnInfo spawn = SEnvir.Spawns.FirstOrDefault(x => x.Info == movement.NeedSpawn);

                        if (spawn == null)
                        {
                            break;
                        }

                        if (spawn.AliveCount == 0)
                        {
                            player.Connection.ReceiveChat(player.Connection.Language.NeedMonster, MessageType.System);

                            foreach (SConnection con in player.Connection.Observers)
                            {
                                con.ReceiveChat(con.Language.NeedMonster, MessageType.System);
                            }

                            break;
                        }
                    }

                    if (movement.NeedItem != null)
                    {
                        if (player.GetItemCount(movement.NeedItem) == 0)
                        {
                            player.Connection.ReceiveChat(string.Format(player.Connection.Language.NeedItem, movement.NeedItem.ItemName), MessageType.System);

                            foreach (SConnection con in player.Connection.Observers)
                            {
                                con.ReceiveChat(string.Format(con.Language.NeedItem, movement.NeedItem.ItemName), MessageType.System);
                            }
                            break;
                        }

                        player.TakeItem(movement.NeedItem, 1);
                    }

                    switch (movement.Effect)
                    {
                    case MovementEffect.SpecialRepair:
                        player.SpecialRepair(EquipmentSlot.Weapon);
                        player.SpecialRepair(EquipmentSlot.Shield);
                        player.SpecialRepair(EquipmentSlot.Helmet);
                        player.SpecialRepair(EquipmentSlot.Armour);
                        player.SpecialRepair(EquipmentSlot.Necklace);
                        player.SpecialRepair(EquipmentSlot.BraceletL);
                        player.SpecialRepair(EquipmentSlot.BraceletR);
                        player.SpecialRepair(EquipmentSlot.RingL);
                        player.SpecialRepair(EquipmentSlot.RingR);
                        player.SpecialRepair(EquipmentSlot.Shoes);

                        player.RefreshStats();
                        break;
                    }
                }

                return(cell.GetMovement(ob));
            }

            return(this);
        }
        private static MovementInfo ReadMovementUpdateBlock(ref Packet packet, Guid guid, int index)
        {
            var moveInfo = new MovementInfo();

            var guid1               = new byte[8];
            var transportGuid       = new byte[8];
            var goTransportGuid     = new byte[8];
            var attackingTargetGuid = new byte[8];
            var guid5               = new byte[8];
            var guid6               = new byte[8];
            var guid7               = new byte[8];

            var hasGOTransportTime2 = false;
            var hasGOTransportTime3 = false;
            var hasAnimKit1         = false;
            var hasAnimKit2         = false;
            var hasAnimKit3         = false;

            var bit28D                = packet.ReadBit();
            var bits404               = packet.ReadBits(22);
            var hasVehicleData        = packet.ReadBit("Has Vehicle Data", index);
            var bit3F0                = packet.ReadBit();
            var hasGameObjectPosition = packet.ReadBit("Has GameObject Rotation", index);

            packet.ReadBit(); // fake bit
            var bit310             = packet.ReadBit();
            var bit1D8             = packet.ReadBit();
            var bit284             = packet.ReadBit();
            var bit208             = packet.ReadBit();
            var bit1F8             = packet.ReadBit();
            var hasAttackingTarget = packet.ReadBit("Has Attacking Target", index);

            packet.ReadBit(); // fake bit
            packet.ReadBit(); // fake bit
            var isSelf = packet.ReadBit("Self", index);

            packet.ReadBit(); // fake bit
            var living                = packet.ReadBit("Living", index);
            var bit3E8                = packet.ReadBit();
            var bit28E                = packet.ReadBit();
            var hasAnimKits           = packet.ReadBit("Has AnimKits", index);
            var hasStationaryPosition = packet.ReadBit("Has Stationary Position", index);

            var hasSplineElevation = false;
            var hasMoveFlagsExtra  = false;
            var bitD8             = false;
            var hasMovementFlags  = false;
            var hasTimestamp      = false;
            var bit95             = false;
            var bit94             = false;
            var hasOrientation    = false;
            var hasTransportData  = false;
            var hasTransportTime3 = false;
            var hasTransportTime2 = false;
            var hasPitch          = false;
            var bitF0             = false;
            var bit118            = false;
            var bit134            = false;
            var bit110            = false;
            var bitA8             = false;
            var hasFallData       = false;
            var hasFallDirection  = false;
            var bit228            = false;
            var bit270            = false;
            var bit21C            = false;
            var bit244            = false;

            var bits168    = 0u;
            var bits120    = 0u;
            var bits138    = 0u;
            var bits98     = 0u;
            var bits248    = 0u;
            var bits258    = 0u;
            var bits274    = 0u;
            var bits3F4    = 0u;
            var bits28F    = 0u;
            var splineType = -1;

            uint[] bits168A;

            if (living)
            {
                guid1[0]           = packet.ReadBit();
                hasSplineElevation = !packet.ReadBit();
                packet.StartBitStream(guid1, 4, 7);
                hasMoveFlagsExtra = !packet.ReadBit();
                packet.StartBitStream(guid1, 5, 2);
                bitD8            = packet.ReadBit();
                hasMovementFlags = !packet.ReadBit();
                hasTimestamp     = !packet.ReadBit("Lacks timestamp", index);
                bit95            = packet.ReadBit();
                bit94            = packet.ReadBit();
                hasOrientation   = !packet.ReadBit();
                if (hasMovementFlags)
                {
                    moveInfo.Flags = packet.ReadEnum <MovementFlag>("Movement Flags", 30, index);
                }

                hasTransportData = packet.ReadBit("Has Transport Data", index);
                if (hasTransportData)
                {
                    packet.StartBitStream(transportGuid, 1, 0, 6);
                    hasTransportTime3 = packet.ReadBit();
                    packet.StartBitStream(transportGuid, 2, 7, 4, 3);
                    hasTransportTime2 = packet.ReadBit();
                    transportGuid[5]  = packet.ReadBit();
                }

                hasPitch = !packet.ReadBit("Lacks pitch", index);
                guid1[6] = packet.ReadBit();
                bits168  = packet.ReadBits(19);
                bits168A = new uint[bits168];
                for (var i = 0; i < bits168; ++i)
                {
                    bits168A[i] = packet.ReadBits("bits168", 2, index);
                }

                guid1[1] = packet.ReadBit();
                if (bitD8)
                {
                    bitF0 = packet.ReadBit();
                    if (bitF0)
                    {
                        bit118 = packet.ReadBit();
                        bit134 = packet.ReadBit();
                        packet.ReadBits("bits130", 2, index);
                        bits120 = packet.ReadBits(20);
                        bit110  = packet.ReadBit();
                        if (bit134)
                        {
                            bits138 = packet.ReadBits(21);
                            packet.ReadBits("bits148", 2, index);
                        }
                        packet.ReadEnum <SplineFlag434>("Spline flags", 25, index);
                    }
                }

                bitA8    = !packet.ReadBit();
                guid1[3] = packet.ReadBit();
                bits98   = packet.ReadBits(22);
                if (hasMoveFlagsExtra)
                {
                    moveInfo.FlagsExtra = packet.ReadEnum <MovementFlagExtra>("Extra Movement Flags", 13, index);
                }

                hasFallData = packet.ReadBit("Has Fall Data", index);
                if (hasFallData)
                {
                    hasFallDirection = packet.ReadBit("Has Fall Direction", index);
                }

                packet.ReadBit("bitAC", index);
            }

            if (hasGameObjectPosition)
            {
                packet.StartBitStream(goTransportGuid, 7, 3);
                hasGOTransportTime2 = packet.ReadBit();
                packet.StartBitStream(goTransportGuid, 1, 4, 0, 2, 6);
                hasGOTransportTime3 = packet.ReadBit();
                goTransportGuid[5]  = packet.ReadBit();
            }

            if (hasAnimKits)
            {
                hasAnimKit2 = !packet.ReadBit();
                hasAnimKit3 = !packet.ReadBit();
                hasAnimKit1 = !packet.ReadBit();
            }

            if (hasAttackingTarget)
            {
                attackingTargetGuid = packet.StartBitStream(7, 3, 6, 1, 5, 4, 0, 2);
            }

            if (bit208)
            {
                packet.ReadBit("bit21A", index);
                bit228 = packet.ReadBit();
                bit270 = packet.ReadBit();
                packet.ReadBit("bit219", index);
                packet.ReadBit("bit218", index);
                bit21C = packet.ReadBit();
                bit244 = packet.ReadBit();

                if (bit244)
                {
                    bits248 = packet.ReadBits(21);
                    bits258 = packet.ReadBits(21);
                }

                if (bit270)
                {
                    bits274 = packet.ReadBits(20);
                }

                packet.ReadBit("bit21B", index);
            }

            if (bit310)
            {
                packet.WriteLine("Missing data for bit310");
            }

            if (bit3F0)
            {
                bits3F4 = packet.ReadBits(22);
            }

            if (bit28E)
            {
                bits28F = packet.ReadBits(7);
            }

            packet.ResetBitReader();

            for (var i = 0; i < bits404; ++i)
            {
                packet.ReadInt32("Int408", index);
            }

            if (living)
            {
                if (hasTimestamp)
                {
                    packet.ReadUInt32("Time", index);
                }

                for (var i = 0; i < bits168; ++i)
                {
                    packet.ReadSingle("Float16C+5", index);
                    packet.ReadInt32("Int16C+4", index);
                    packet.ReadSingle("Float16C+1", index);
                    packet.ReadInt32("Int16C+0", index);
                    packet.ReadSingle("Float16C+2", index);
                    packet.ReadSingle("Float16C+3", index);
                }

                if (bitD8)
                {
                    if (bitF0)
                    {
                        if (bit118)
                        {
                            packet.ReadInt32("Int11C", index);
                        }

                        packet.ReadSingle("Float108", index);
                        if (bit110)
                        {
                            packet.ReadSingle("Float114", index);
                        }

                        packet.ReadInt32("Int100", index);
                        for (var i = 0u; i < bits120; ++i)
                        {
                            var wp = new Vector3
                            {
                                Z = packet.ReadSingle(),
                                Y = packet.ReadSingle(),
                                X = packet.ReadSingle(),
                            };

                            packet.WriteLine("[{0}][{1}] Spline Waypoint: {2}", index, i, wp);
                        }

                        if (bit134)
                        {
                            for (var i = 0; i < bits138; ++i)
                            {
                                packet.ReadSingle("Float13C+1", index, i);
                                packet.ReadSingle("Float13C+0", index, i);
                            }
                        }

                        packet.ReadSingle("Float10C", index);
                        splineType = packet.ReadByte("ByteFC", index);
                        if (splineType == 4)
                        {
                            packet.ReadSingle("Facing Angle", index);
                        }

                        if (splineType == 2)
                        {
                            var point = new Vector3
                            {
                                X = packet.ReadSingle(),
                                Z = packet.ReadSingle(),
                                Y = packet.ReadSingle(),
                            };

                            packet.WriteLine("[{0}] Facing Spot: {1}", index, point);
                        }

                        packet.ReadInt32("Int104", index);
                    }

                    moveInfo.Position.Y = packet.ReadSingle();
                    moveInfo.Position.Z = packet.ReadSingle();
                    packet.ReadInt32("IntE0", index);
                    moveInfo.Position.X = packet.ReadSingle();
                }

                if (hasTransportData)
                {
                    packet.ReadXORByte(transportGuid, 4);
                    moveInfo.TransportOffset.Z = packet.ReadSingle();
                    moveInfo.TransportOffset.Y = packet.ReadSingle();
                    packet.ReadUInt32("Transport Time", index);
                    packet.ReadByte("Transport Seat", index);
                    packet.ReadXORBytes(transportGuid, 3, 1, 6);
                    if (hasTransportTime2)
                    {
                        packet.ReadUInt32("Transport Time 2", index);
                    }

                    packet.ReadXORByte(transportGuid, 5);
                    moveInfo.TransportOffset.O = packet.ReadSingle();
                    moveInfo.TransportOffset.X = packet.ReadSingle();
                    packet.ReadXORBytes(transportGuid, 2, 0, 7);
                    if (hasTransportTime3)
                    {
                        packet.ReadUInt32("Transport Time 3", index);
                    }

                    moveInfo.TransportGuid = new Guid(BitConverter.ToUInt64(transportGuid, 0));
                    packet.WriteLine("[{0}] Transport GUID {1}", index, moveInfo.TransportGuid);
                    packet.WriteLine("[{0}] Transport Position: {1}", index, moveInfo.TransportOffset);
                }

                packet.ReadXORBytes(guid1, 2, 1);
                packet.ReadSingle("SwimBack Speed", index);
                packet.ReadSingle("Turn Speed", index);
                packet.ReadXORBytes(guid1, 0, 3);
                packet.ReadSingle("RunBack Speed", index);
                if (hasFallData)
                {
                    if (hasFallDirection)
                    {
                        packet.ReadSingle("Float88", index);
                        packet.ReadSingle("Float8C", index);
                        packet.ReadSingle("Float84", index);
                    }
                    packet.ReadSingle("Fall Start Velocity", index);
                    packet.ReadUInt32("Time Fallen", index);
                }

                packet.ReadSingle("FlyBack Speed", index);
                packet.ReadXORByte(guid1, 5);
                moveInfo.Position.Z = packet.ReadSingle();
                if (hasOrientation)
                {
                    moveInfo.Orientation = packet.ReadSingle();
                }

                packet.ReadXORByte(guid1, 6);
                if (hasSplineElevation)
                {
                    packet.ReadSingle("Spline Elevation", index);
                }

                packet.ReadSingle("Pitch Speed", index);
                if (hasPitch)
                {
                    packet.ReadSingle("Pitch", index);
                }

                for (var i = 0; i < bits98; ++i)
                {
                    packet.ReadInt32("Int9C", index, i);
                }

                moveInfo.WalkSpeed = packet.ReadSingle("Walk Speed", index) / 2.5f;
                if (bitA8)
                {
                    packet.ReadInt32("IntA8", index);
                }

                moveInfo.Position.Y = packet.ReadSingle();
                packet.ReadSingle("Swim Speed", index);
                packet.ReadSingle("Fly Speed", index);
                packet.ReadXORByte(guid1, 7);
                moveInfo.RunSpeed   = packet.ReadSingle("Run Speed", index) / 7.0f;
                moveInfo.Position.X = packet.ReadSingle();
                packet.ReadXORByte(guid1, 4);

                packet.WriteGuid("GUID1", guid1, index);
                packet.WriteLine("[{0}] Position: {1}", index, moveInfo.Position);
                packet.WriteLine("[{0}] Orientation: {1}", index, moveInfo.Orientation);
            }

            if (bit310)
            {
                packet.WriteLine("Missing data for bit310", index);
            }

            if (hasGameObjectPosition)
            {
                packet.ReadUInt32("GO Transport Time", index);
                packet.ReadXORByte(goTransportGuid, 7);
                moveInfo.TransportOffset.Y = packet.ReadSingle();
                packet.ReadXORByte(goTransportGuid, 0);
                if (hasGOTransportTime3)
                {
                    packet.ReadUInt32("GO Transport Time 3", index);
                }

                packet.ReadXORByte(goTransportGuid, 3);
                packet.ReadSByte("GO Transport Seat", index);
                packet.ReadXORByte(goTransportGuid, 1);
                moveInfo.TransportOffset.Z = packet.ReadSingle();
                moveInfo.TransportOffset.O = packet.ReadSingle();
                if (hasGOTransportTime2)
                {
                    packet.ReadUInt32("GO Transport Time 2", index);
                }

                moveInfo.TransportOffset.X = packet.ReadSingle();
                packet.ReadXORBytes(goTransportGuid, 2, 4, 5, 6);

                moveInfo.TransportGuid = new Guid(BitConverter.ToUInt64(goTransportGuid, 0));
                packet.WriteLine("[{0}] GO Transport GUID {1}", index, moveInfo.TransportGuid);
                packet.WriteLine("[{0}] GO Transport Position: {1}", index, moveInfo.TransportOffset);
            }

            if (bit208)
            {
                if (bit21C)
                {
                    packet.ReadSingle("Float224", index);
                    packet.ReadSingle("Float220", index);
                }

                packet.ReadSingle("Float210", index);
                if (bit244)
                {
                    for (var i = 0; i < bits258; ++i)
                    {
                        packet.ReadSingle("Float25C+1", index);
                        packet.ReadSingle("Float25C+0", index);
                    }

                    for (var i = 0; i < bits248; ++i)
                    {
                        packet.ReadSingle("Float24C+0", index);
                        packet.ReadSingle("Float24C+1", index);
                    }

                    packet.ReadSingle("Float26C", index);
                    packet.ReadSingle("Float268", index);
                }

                if (bit228)
                {
                    packet.ReadSingle("Float22C", index);
                    packet.ReadSingle("Float230", index);
                    packet.ReadSingle("Float23C", index);
                    packet.ReadSingle("Float234", index);
                    packet.ReadSingle("Float238", index);
                    packet.ReadSingle("Float240", index);
                }

                if (bit270)
                {
                    for (var i = 0; i < bits274; ++i)
                    {
                        packet.ReadSingle("Float277+1", index);
                        packet.ReadSingle("Float277+0", index);
                        packet.ReadSingle("Float277+2", index);
                    }
                }

                packet.ReadSingle("Float214", index);
                packet.ReadInt32("Int20C", index);
            }

            if (hasVehicleData)
            {
                packet.ReadSingle("Vehicle Orientation", index);
                moveInfo.VehicleId = packet.ReadUInt32("Vehicle Id", index);
            }

            if (hasAttackingTarget)
            {
                packet.ParseBitStream(attackingTargetGuid, 7, 1, 4, 6, 0, 2, 5, 3);
                packet.WriteGuid("Attacking GUID", attackingTargetGuid, index);
            }

            if (bit1F8)
            {
                packet.ReadGuid("GUIDX", index);
            }

            if (hasAnimKits)
            {
                if (hasAnimKit2)
                {
                    packet.ReadUInt16("Anim Kit 2", index);
                }
                if (hasAnimKit1)
                {
                    packet.ReadUInt16("Anim Kit 1", index);
                }
                if (hasAnimKit3)
                {
                    packet.ReadUInt16("Anim Kit 3", index);
                }
            }

            if (bit28E)
            {
                var bytes = packet.ReadBytes((int)bits28F);
                packet.WriteLine("Bytes", bytes.ToString(), index);
            }

            if (hasStationaryPosition)
            {
                moveInfo.Position.X  = packet.ReadSingle();
                moveInfo.Position.Z  = packet.ReadSingle();
                moveInfo.Orientation = packet.ReadSingle("Stationary Orientation", index);
                moveInfo.Position.Y  = packet.ReadSingle();
                packet.WriteLine("[{0}] Stationary Position: {1}", index, moveInfo.Position);
            }

            if (bit1D8)
            {
                packet.ReadInt32("Int1DC", index);
            }

            if (bit3F0)
            {
                for (var i = 0; i < bits3F4; ++i)
                {
                    packet.ReadInt32("Int1DC", index, i);
                }
            }

            if (bit284)
            {
                packet.ReadInt32("Int288", index);
            }

            if (bit3E8)
            {
                packet.ReadInt32("Int3EC", index);
            }

            if (living && bitD8 && bitF0 && splineType == 3)
            {
                var guid8 = new byte[8];
                guid8 = packet.StartBitStream(2, 4, 6, 3, 1, 5, 6, 0);
                packet.ParseBitStream(guid8, 1, 3, 6, 7, 2, 4, 5, 0);
                packet.WriteGuid("Guid8 GUID", guid8, index);
            }

            return(moveInfo);
        }
        private static MovementInfo ReadMovementStatusData(Packet packet, MovementUpdate movementUpdate, object index)
        {
            var moveInfo = new MovementInfo();

            movementUpdate.Mover = packet.ReadPackedGuid128("MoverGUID", index);

            movementUpdate.MoveIndex   = (int)packet.ReadUInt32("MoveIndex", 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 int152 = packet.ReadInt32("Int152", index);

            packet.ReadInt32("Int168", index);

            for (var i = 0; i < int152; i++)
            {
                packet.ReadPackedGuid128("RemoveForcesIDs", index, i);
            }

            packet.ResetBitReader();

            moveInfo.Flags      = (MovementFlag)packet.ReadBitsE <Enums.MovementFlag>("Movement Flags", 30, index);
            moveInfo.FlagsExtra = packet.ReadBitsE <MovementFlagExtra>("Extra Movement Flags", ClientVersion.AddedInVersion(ClientVersionBuild.V6_2_0_20173) ? 16 : 15, 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)
            {
                var transport = movementUpdate.Transport = new();
                transport.TransportGuid = packet.ReadPackedGuid128("Transport Guid", index);
                transport.Position      = packet.ReadVector4("Transport Position", index);
                transport.Seat          = (uint)packet.ReadSByte("Transport Seat", index);
                transport.MoveTime      = (uint)packet.ReadInt32("Transport Time", index);

                packet.ResetBitReader();

                var hasPrevMoveTime = packet.ReadBit("HasPrevMoveTime", index);
                var hasVehicleRecID = packet.ReadBit("HasVehicleRecID", index);

                if (hasPrevMoveTime)
                {
                    transport.PrevMoveTime = packet.ReadUInt32("PrevMoveTime", index);
                }

                if (hasVehicleRecID)
                {
                    transport.VehicleId = (int)packet.ReadUInt32("VehicleRecID", index);
                }
            }

            if (hasFall)
            {
                movementUpdate.FallTime     = packet.ReadUInt32("Fall Time", index);
                movementUpdate.JumpVelocity = packet.ReadSingle("JumpVelocity", index);

                packet.ResetBitReader();
                var bit20 = packet.ReadBit("Has Fall Direction", index);
                if (bit20)
                {
                    packet.ReadVector2("Fall", index);
                    packet.ReadSingle("Horizontal Speed", index);
                }
            }

            return(moveInfo);
        }
        private static MovementInfo ReadMovementUpdateBlock(Packet packet, WowGuid guid, object index)
        {
            var moveInfo = new MovementInfo();

            var guid1               = new byte[8];
            var transportGuid       = new byte[8];
            var goTransportGuid     = new byte[8];
            var attackingTargetGuid = new byte[8];
            var guid5               = new byte[8];
            var guid6               = new byte[8];
            var guid7               = new byte[8];

            var bit160 = false;
            var bit528 = false;
            var bit600 = false;
            var bit544 = false;
            var bit526 = false;
            var bit552 = false;
            var bit524 = false;
            var bit572 = false;
            var bit525 = false;
            var bit664 = false;
            var bit527 = false;
            var bit536 = false;
            var bit644 = false;
            var bit560 = false;

            var hasAnimKit1                   = false;
            var hasAnimKit2                   = false;
            var hasAnimKit3                   = false;
            var hasFullSpline                 = false;
            var hasSplineStartTime            = false;
            var hasSplineVerticalAcceleration = false;
            var hasMovementFlags              = false;
            var hasMoveFlagsExtra             = false;
            var hasTimestamp                  = false;
            var hasOrientation                = false;
            var hasTransportData              = false;
            var hasTransportTime2             = false;
            var hasTransportTime3             = false;
            var hasGOTransportTime2           = false;
            var hasGOTransportTime3           = false;
            var hasPitch           = false;
            var hasFallData        = false;
            var hasFallDirection   = false;
            var hasSplineElevation = false;

            var bits168 = 0u;

            var splineCount = 0u;
            var bits138     = 0u;
            var bits98      = 0u;
            var bits25C     = 0u;
            var bits26C     = 0u;
            var bits288     = 0u;
            var bits418     = 0u;
            var bits2AA     = 0u;
            var splineType  = SplineType.Stop;

            var bit676      = packet.ReadBit("bit676", index);
            var hasAnimKits = packet.ReadBit("Has Anim Kits", index); // 498
            var isLiving    = packet.ReadBit("Is Living", index);     // 368
            var bit810      = packet.ReadBit("bit810", index);

            packet.ReadBit();                                                           //fake bit
            var transportFrames = packet.ReadBits("Transport Frames Count", 22, index); // 1068
            var hasVehicleData  = packet.ReadBit("Has Vehicle Data", index);            // 488
            var bit1044         = packet.ReadBit("bit1044", index);

            packet.ReadBit();                                                             //fake bit
            var bit476 = packet.ReadBit("bit476", index);
            var hasGameObjectRotation = packet.ReadBit("Has GameObject Rotation", index); // 512

            packet.ReadBit();                                                             //fake bit
            var bit680             = packet.ReadBit("bit680", index);
            var hasAttackingTarget = packet.ReadBit("Has Attacking Target", index);       // 464
            var hasSceneObjectData = packet.ReadBit("Has Scene Object Data", index);      // 1032
            var bit1064            = packet.ReadBit("bit1064", index);

            packet.ReadBit();                                                             //fake bit
            var bit668 = packet.ReadBit("bit668", index);
            var hasTransportPosition = packet.ReadBit("Has Transport Position", index);   // 424
            var bit681 = packet.ReadBit("bit681", index);
            var hasStationaryPosition = packet.ReadBit("Has Stationary Position", index); // 448

            if (isLiving)
            {
                guid1[2] = packet.ReadBit();
                var bit140 = packet.ReadBit();
                hasPitch         = !packet.ReadBit("Has Pitch", index);         //104
                hasTransportData = packet.ReadBit("Has Transport Data", index); //96
                packet.ReadBit();                                               // 164 fake bit

                if (hasTransportData)
                {
                    transportGuid[4]  = packet.ReadBit();
                    transportGuid[2]  = packet.ReadBit();
                    hasTransportTime3 = packet.ReadBit();
                    transportGuid[0]  = packet.ReadBit();
                    transportGuid[1]  = packet.ReadBit();
                    transportGuid[3]  = packet.ReadBit();
                    transportGuid[6]  = packet.ReadBit();
                    transportGuid[7]  = packet.ReadBit();
                    hasTransportTime2 = packet.ReadBit();
                    transportGuid[5]  = packet.ReadBit();
                }
                hasTimestamp     = !packet.ReadBit();
                guid1[6]         = packet.ReadBit();
                guid1[4]         = packet.ReadBit();
                guid1[3]         = packet.ReadBit();
                hasOrientation   = !packet.ReadBit(); //40
                bit160           = !packet.ReadBit();
                guid1[5]         = packet.ReadBit();
                bits98           = packet.ReadBits("bits98", 22, index); //144
                hasMovementFlags = !packet.ReadBit();
                bits168          = packet.ReadBits(19);                  //352

                /*var bits356 = new uint[bits168];
                 * for (var i = 0; i < bits168; ++i)
                 * {
                 *  bits356[i] = packet.ReadBits(2);
                 * }*/

                hasFallData = packet.ReadBit(); //132

                if (hasMovementFlags)
                {
                    moveInfo.Flags = packet.ReadEnum <MovementFlag>("Movement Flags", 30, index);
                }

                hasSplineElevation     = !packet.ReadBit("Has SplineElevation", index);//136
                moveInfo.HasSplineData = packet.ReadBit("Has SplineData", index);
                var bit141 = packet.ReadBit();
                guid1[0] = packet.ReadBit();
                guid1[7] = packet.ReadBit();
                guid1[1] = packet.ReadBit();

                if (moveInfo.HasSplineData)
                {
                    hasFullSpline = packet.ReadBit();
                    if (hasFullSpline)
                    {
                        hasSplineVerticalAcceleration = packet.ReadBit(); //260
                        hasSplineStartTime            = packet.ReadBit(); //252
                        var bit304 = packet.ReadBit();

                        splineCount = packet.ReadBits(20);
                        packet.ReadEnum <SplineMode>("Spline Mode", 2, index);
                        packet.ReadEnum <SplineFlag434>("Spline flags", 25, index);

                        if (bit304)
                        {
                            bits138 = packet.ReadBits(21);
                            packet.ReadBits(2);
                        }
                    }
                }

                hasMoveFlagsExtra = !packet.ReadBit(); //20

                if (hasFallData)
                {
                    hasFallDirection = packet.ReadBit(); //128
                }
                if (hasMoveFlagsExtra)
                {
                    moveInfo.FlagsExtra = packet.ReadEnum <MovementFlagExtra>("Extra Movement Flags", 13, index);
                }
            }

            /*if (hasSceneObjectData)
             * {
             *
             * }*/

            if (hasTransportPosition) //424
            {
                packet.StartBitStream(goTransportGuid, 4, 1, 0);
                hasGOTransportTime2 = packet.ReadBit(); // 420
                packet.StartBitStream(goTransportGuid, 6, 5, 3, 2, 7);
                hasGOTransportTime3 = packet.ReadBit(); // 412
            }

            if (bit668)
            {
                bit528 = packet.ReadBit();
                bit600 = packet.ReadBit();
                bit544 = packet.ReadBit();
                bit526 = packet.ReadBit();
                bit552 = packet.ReadBit();
                bit524 = packet.ReadBit();
                bit572 = packet.ReadBit();
                bit525 = packet.ReadBit();
                bit664 = packet.ReadBit();
                bit527 = packet.ReadBit();

                if (bit664)
                {
                    bits288 = packet.ReadBits(20);
                }

                bit536 = packet.ReadBit();
                bit644 = packet.ReadBit();
                bit560 = packet.ReadBit();

                if (bit664)
                {
                    bits25C = packet.ReadBits(21); //604
                    bits26C = packet.ReadBits(21); //624
                }
            }

            if (hasAnimKits)
            {
                hasAnimKit2 = !packet.ReadBit();
                hasAnimKit3 = !packet.ReadBit();
                hasAnimKit1 = !packet.ReadBit();
            }

            if (hasAttackingTarget)
            {
                attackingTargetGuid = packet.StartBitStream(4, 6, 5, 2, 0, 1, 3, 7);
            }

            if (bit1064)
            {
                bits418 = packet.ReadBits(22);
            }

            if (bit810)
            {
                bits2AA = packet.ReadBits(7);
            }

            packet.ResetBitReader();

            for (var i = 0; i < transportFrames; ++i)
            {
                packet.ReadInt32("Transport frame", index, i);
            }

            /*if (hasSceneObjectData)
             * {
             *  until if ( *(_BYTE *)(v3 + 668) )
             * }*/

            if (isLiving)
            {
                if (hasTransportData) //96
                {
                    packet.ReadXORByte(transportGuid, 7);
                    moveInfo.TransportOffset.X = packet.ReadSingle();

                    if (hasTransportTime3)
                    {
                        packet.ReadUInt32("Transport Time 3", index);
                    }

                    moveInfo.TransportOffset.O = packet.ReadSingle();
                    moveInfo.TransportOffset.Y = packet.ReadSingle();
                    packet.ReadXORByte(transportGuid, 4);
                    packet.ReadXORByte(transportGuid, 1);
                    packet.ReadXORByte(transportGuid, 3);
                    moveInfo.TransportOffset.Z = packet.ReadSingle();
                    packet.ReadXORByte(transportGuid, 5);

                    if (hasTransportTime2)
                    {
                        packet.ReadUInt32("Transport Time 2", index);
                    }

                    packet.ReadXORByte(transportGuid, 0);
                    var seat = packet.ReadSByte("Transport Seat", index); //72
                    packet.ReadXORByte(transportGuid, 6);
                    packet.ReadXORByte(transportGuid, 2);
                    packet.ReadUInt32("Transport Time", index); //76

                    moveInfo.TransportGuid = new WowGuid64(BitConverter.ToUInt64(transportGuid, 0));
                    packet.AddValue("Transport GUID", moveInfo.TransportGuid, index);
                    packet.AddValue("Transport Position", moveInfo.TransportOffset, index);

                    if (moveInfo.TransportGuid.HasEntry() && moveInfo.TransportGuid.GetHighType() == HighGuidType.Vehicle &&
                        guid.HasEntry() && guid.GetHighType() == HighGuidType.Creature)
                    {
                        var vehicleAccessory = new VehicleTemplateAccessory
                        {
                            AccessoryEntry = guid.GetEntry(),
                            SeatId         = seat
                        };

                        Storage.VehicleTemplateAccessorys.Add(moveInfo.TransportGuid.GetEntry(), vehicleAccessory, packet.TimeSpan);
                    }
                }

                packet.ReadXORByte(guid1, 4);

                /*for (var i = 0; i < 10; ++i)
                 *  packet.ReadSingle("unk float");
                 * if (bits98 > 0)
                 *  packet.ReadBits((int)bits98);*/
                //for (var i = 0; i < bits98; ++i)
                //    packet.ReadInt32("Int9C", index, i);

                if (moveInfo.HasSplineData)                            //344
                {
                    if (hasFullSpline)                                 //336
                    {
                        packet.ReadUInt32("Spline Time", index);       //232
                        packet.ReadSingle("Duration Mod Next", index); //244

                        //    NYI block here
                        packet.ReadSingle("Duration Mod", index); //240

                        for (uint i = 0; i < splineCount; i++)
                        {
                            Vector3 v = new Vector3();
                            v.X = packet.ReadSingle(); //0
                            v.Z = packet.ReadSingle(); //8
                            v.Y = packet.ReadSingle(); //4

                            packet.AddValue("Spline", v, index);
                        }

                        if (hasSplineStartTime)
                        {
                            packet.ReadUInt32("Spline Start time", index); //256
                        }
                        var type = packet.ReadByte();                      // 228

                        switch (type)
                        {
                        case 1:
                            splineType = SplineType.Normal;
                            break;

                        case 2:
                            splineType = SplineType.FacingSpot;
                            break;

                        case 3:
                            splineType = SplineType.FacingTarget;
                            break;

                        case 4:
                            splineType = SplineType.FacingAngle;
                            break;
                        }

                        if (splineType == SplineType.FacingAngle) // == 4
                        {
                            packet.ReadSingle("Facing Angle", index);
                        }

                        if (splineType == SplineType.FacingSpot) // == 2
                        {
                            packet.ReadVector3("Facing spot", index);
                        }

                        if (hasSplineVerticalAcceleration) //252
                        {
                            packet.ReadSingle("Spline Vertical Acceleration", index);
                        }

                        packet.ReadUInt32("Spline FULL Time", index); //236
                    }

                    moveInfo.Position.X = packet.ReadSingle(); //212
                    moveInfo.Position.Z = packet.ReadSingle(); //220
                    packet.ReadUInt32("Spline ID", index);     //208
                    moveInfo.Position.Y = packet.ReadSingle(); //216
                }
                packet.ReadSingle("Fly Speed", index);         //188

                if (bit160)
                {
                    packet.ReadUInt32("unk160");
                }

                packet.ReadXORByte(guid1, 2);

                if (hasFallData)                                    //132
                {
                    if (hasFallDirection)                           //128
                    {
                        packet.ReadSingle("Jump Sin Angle", index); //124
                        packet.ReadSingle("Jump XY Speed", index);  //116
                        packet.ReadSingle("Jump Cos Angle", index); //120
                    }
                    packet.ReadUInt32("Jump Fall Time", index);     //108
                    packet.ReadSingle("Jump Z Speed", index);       //112
                }
                packet.ReadXORByte(guid1, 1);
                packet.ReadSingle("Turn Speed", index);

                if (hasTimestamp)
                {
                    packet.ReadUInt32("Time?", index);
                }

                packet.ReadSingle("Swim Speed", index);           //176

                if (hasSplineElevation)                           //136
                {
                    packet.ReadSingle("Spline Elevation", index); //196
                }
                packet.ReadXORByte(guid1, 7);
                packet.ReadSingle("Pitch Speed", index); //200

                for (var i = 0; i < bits98; ++i)
                {
                    packet.ReadInt32("UNK counter", index, i);
                }

                moveInfo.Position.X = packet.ReadSingle(); //28

                if (hasPitch)
                {
                    packet.ReadSingle("Pitch", index); //104
                }
                if (hasOrientation)
                {
                    moveInfo.Orientation = packet.ReadSingle("Orientation", index);  //40
                }
                moveInfo.WalkSpeed  = packet.ReadSingle("Walk Speed", index) / 2.5f; // 168
                moveInfo.Position.Y = packet.ReadSingle();                           //32
                packet.ReadSingle("Fly Back Speed", index);                          //192
                packet.ReadXORByte(guid1, 3);
                packet.ReadXORByte(guid1, 5);
                packet.ReadXORByte(guid1, 6);
                packet.ReadXORByte(guid1, 0);
                packet.ReadSingle("Run Back Speed", index);                       //184
                moveInfo.RunSpeed = packet.ReadSingle("Run Speed", index) / 7.0f; //172
                packet.ReadSingle("Swim Back Speed", index);                      //180
                moveInfo.Position.Z = packet.ReadSingle();                        //36
            }

            packet.AddValue("Position", moveInfo.Position, index);

            if (bit668)
            {
                if (bit664)
                {
                    for (var i = 0; i < bits288; ++i)
                    {
                        packet.ReadSingle("Float652+4", index, i);
                        packet.ReadSingle("Float652", index, i);
                        packet.ReadSingle("Float652+8", index, i);
                    }
                }

                if (bit600)
                {
                    packet.ReadSingle("Float584", index);
                    packet.ReadSingle("Float580", index);
                    packet.ReadSingle("Float596", index);
                    packet.ReadSingle("Float592", index);
                    packet.ReadSingle("Float576", index);
                    packet.ReadSingle("Float588", index);
                }

                if (bit644)
                {
                    for (var i = 0; i < bits25C; ++i)
                    {
                        packet.ReadSingle("Float608", index, i);
                        packet.ReadSingle("Float608+4", index, i);
                    }

                    for (var i = 0; i < bits26C; ++i)
                    {
                        packet.ReadSingle("Float260+0", index, i);
                        packet.ReadSingle("Float260+1", index, i);
                    }

                    packet.ReadSingle("Float624", index);
                    packet.ReadSingle("Float624+4", index);
                }

                packet.ReadUInt32("unk520", index);

                if (bit544)
                {
                    packet.ReadUInt32("unk544", index);
                }

                if (bit552)
                {
                    packet.ReadUInt32("unk548", index);
                }

                if (bit536)
                {
                    packet.ReadUInt32("unk532", index);
                }

                if (bit560)
                {
                    packet.ReadUInt32("unk556", index);
                }

                if (bit572)
                {
                    packet.ReadSingle("Float564", index);
                    packet.ReadSingle("Float568", index);
                }
            }

            if (hasTransportPosition)
            {
                if (hasGOTransportTime2)
                {
                    packet.ReadUInt32("Transport Time 2", index);
                }

                moveInfo.TransportOffset.Y = packet.ReadSingle(); //388
                packet.ReadSByte("Transport Seat", index);        //400
                moveInfo.TransportOffset.X = packet.ReadSingle(); //384

                packet.ReadXORBytes(goTransportGuid, 2, 4, 1);

                if (hasGOTransportTime3)
                {
                    packet.ReadUInt32("Transport Time 3", index); //412
                }
                packet.ReadUInt32("Transport Time", index);       //404
                moveInfo.TransportOffset.O = packet.ReadSingle(); //396
                moveInfo.TransportOffset.Z = packet.ReadSingle(); //392

                packet.ReadXORBytes(goTransportGuid, 6, 0, 5, 3, 7);

                moveInfo.TransportGuid = new WowGuid64(BitConverter.ToUInt64(goTransportGuid, 0));
                packet.AddValue("Transport GUID", moveInfo.TransportGuid, index);
                packet.AddValue("Transport Position", moveInfo.TransportOffset, index);
            }

            if (hasAttackingTarget)
            {
                packet.ParseBitStream(attackingTargetGuid, 7, 1, 5, 2, 6, 3, 0, 4);
                packet.WriteGuid("Attacking Target GUID", attackingTargetGuid, index);
            }

            if (hasVehicleData)
            {
                moveInfo.VehicleId = packet.ReadUInt32("Vehicle Id", index);
                packet.ReadSingle("Vehicle Orientation", index);
            }

            if (hasStationaryPosition)
            {
                moveInfo.Position.Y  = packet.ReadSingle();
                moveInfo.Position.Z  = packet.ReadSingle();
                moveInfo.Orientation = packet.ReadSingle("Stationary Orientation", index);
                moveInfo.Position.X  = packet.ReadSingle();

                packet.AddValue("Stationary Position", moveInfo.Position, index);
            }

            if (bit676)
            {
                packet.ReadUInt32("unk672");
            }

            if (hasAnimKits)
            {
                if (hasAnimKit1)
                {
                    packet.ReadUInt16("Anim Kit 1", index);
                }
                if (hasAnimKit3)
                {
                    packet.ReadUInt16("Anim Kit 3", index);
                }
                if (hasAnimKit2)
                {
                    packet.ReadUInt16("Anim Kit 2", index);
                }
            }

            if (bit810)
            {
                packet.ReadBytes("Bytes", (int)bits2AA);
            }

            if (bit476)
            {
                packet.ReadUInt32("unk472");
            }

            if (bit1064)
            {
                for (var i = 0; i < bits418; ++i)
                {
                    packet.ReadInt32("unk1052+4", index, i);
                }
            }

            if (hasGameObjectRotation)
            {
                packet.ReadPackedQuaternion("GameObject Rotation", index);
            }

            if (bit1044)
            {
                packet.ReadInt32("unk1040", index);
            }

            if (isLiving && moveInfo.HasSplineData && hasFullSpline && splineType == SplineType.FacingTarget)
            {
                var facingTargetGuid = new byte[8];
                packet.StartBitStream(facingTargetGuid, 4, 7, 0, 5, 1, 2, 3, 6);
                packet.ParseBitStream(facingTargetGuid, 4, 2, 0, 5, 6, 3, 1, 7);
                packet.WriteGuid("Facing Target GUID", facingTargetGuid, index);
            }
            return(moveInfo);
        }
Exemple #31
0
    protected virtual MovementInfo ChooseMovement(ControlsScript self, ControlsScript opponent, float deltaTime)
    {
        // Find out if this AI is controlling the first or the second player.
        if (self != null && opponent != null){
            if (this.aiOutput != null){
                // Check if we want to use the best available move or the Weighted Random Selection in this decision step...
                float newRuleCompliance = (UFE.GetAIDifficulty() != null && UFE.GetAIDifficulty().overrideRuleCompliance) ?
                    UFE.GetAIDifficulty().ruleCompliance : this.ai.advancedOptions.ruleCompliance;

                bool useBestAvailableMove = UnityEngine.Random.Range(0f, 1f) < newRuleCompliance;

                // Then calculate the desirability of each possible movement...
                this.movements.Clear();

                float attackWeight = (UFE.GetAIDifficulty() != null && UFE.GetAIDifficulty().overrideAggressiveness) ?
                    UFE.GetAIDifficulty().aggressiveness : this.ai.advancedOptions.aggressiveness;

                if (self.currentMove != null && opponent.currentSubState == SubStates.Stunned) {
                    float newComboEfficiency = (UFE.GetAIDifficulty() != null && UFE.GetAIDifficulty().overrideAggressiveness) ?
                        UFE.GetAIDifficulty().comboEfficiency : this.ai.advancedOptions.comboEfficiency;

                    attackWeight = newComboEfficiency/2;
                }

                float basicMoveWeight =  1f - attackWeight;
                float weight;

                float newTimeBetweenDecisions = (UFE.GetAIDifficulty() != null && UFE.GetAIDifficulty().overrideTimeBetweenDecisions) ?
                    UFE.GetAIDifficulty().timeBetweenDecisions : this.ai.advancedOptions.timeBetweenDecisions;

                int frames = Mathf.FloorToInt(newTimeBetweenDecisions / deltaTime) + 1;

                int paddingBeforeJump = Mathf.Max(UFE.config.plinkingDelay + 1, Mathf.FloorToInt(self.myInfo.executionTiming / deltaTime) + 1);

                if (this.aiOutput.TryGetValue(AIReaction.Crouch, out weight) && this.ValidateReaction(AIReactionType.Crouch, self, opponent)){
                    this.movements.Add(new MovementInfo(AIReaction.Crouch, this.crouchSimulatedInput, weight * basicMoveWeight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.Idle, out weight) && this.ValidateReaction(AIReactionType.Idle, self, opponent)){
                    this.movements.Add(new MovementInfo(AIReaction.Idle, this.idleSimulatedInput, weight * basicMoveWeight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.JumpBackward, out weight) && this.ValidateReaction(AIReactionType.JumpBack, self, opponent)){
                    // We don't want to jump accidentally in the wrong direction, so we must have plinking into account
                    ButtonPress[][] jumpSimulatedInput = this.jumpBackwardSimulatedInput;

                    if (!Mathf.Approximately(this.inputBuffer[this.inputBuffer.Count - 1][this.horizontalAxis].axisRaw, 0f)){
                        List<ButtonPress[]> temp = new List<ButtonPress[]>();

                        for (int i = 0; i < paddingBeforeJump; ++i){
                            temp.Add(this.noButtonsPressed);
                        }

                        temp.AddRange(jumpSimulatedInput);
                        jumpSimulatedInput = temp.ToArray();
                    }

                    this.movements.Add(new MovementInfo(AIReaction.JumpBackward, jumpSimulatedInput.ToArray(), weight * basicMoveWeight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.JumpForward, out weight) && this.ValidateReaction(AIReactionType.JumpForward, self, opponent)){
                    // We don't want to jump accidentally in the wrong direction, so we must have plinking into account
                    ButtonPress[][] jumpSimulatedInput = this.jumpForwardSimulatedInput;

                    if (!Mathf.Approximately(this.inputBuffer[this.inputBuffer.Count - 1][this.horizontalAxis].axisRaw, 0f)){
                        List<ButtonPress[]> temp = new List<ButtonPress[]>();

                        for (int i = 0; i < paddingBeforeJump; ++i){
                            temp.Add(this.noButtonsPressed);
                        }

                        temp.AddRange(jumpSimulatedInput);
                        jumpSimulatedInput = temp.ToArray();
                    }

                    this.movements.Add(new MovementInfo(AIReaction.JumpForward, jumpSimulatedInput.ToArray(), weight * basicMoveWeight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.JumpStraight, out weight) && this.ValidateReaction(AIReactionType.JumpStraight, self, opponent)){
                    // We don't want to jump accidentally in the wrong direction, so we must have plinking into account
                    ButtonPress[][] jumpSimulatedInput = this.jumpBackwardSimulatedInput;

                    if (!Mathf.Approximately(this.inputBuffer[this.inputBuffer.Count - 1][this.horizontalAxis].axisRaw, 0f)){
                        List<ButtonPress[]> temp = new List<ButtonPress[]>();

                        for (int i = 0; i < paddingBeforeJump; ++i){
                            temp.Add(this.noButtonsPressed);
                        }

                        temp.AddRange(jumpSimulatedInput);
                        jumpSimulatedInput = temp.ToArray();
                    }

                    this.movements.Add(new MovementInfo(AIReaction.JumpStraight, jumpSimulatedInput.ToArray(), weight * basicMoveWeight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.MoveBackward, out weight) && this.ValidateReaction(AIReactionType.MoveBack, self, opponent)){
                    this.movements.Add(new MovementInfo(AIReaction.MoveBackward, this.moveBackwardSimulatedInput, weight * basicMoveWeight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.MoveForward, out weight) && this.ValidateReaction(AIReactionType.MoveForward, self, opponent)){
                    this.movements.Add(new MovementInfo(AIReaction.MoveForward, this.moveForwardSimulatedInput, weight * basicMoveWeight));
                }

                // Including blocks...
                if (this.aiOutput.TryGetValue(AIReaction.CrouchBlock, out weight) && this.ValidateReaction(AIReactionType.CrouchBlock, self, opponent)){
                    this.movements.Add(new MovementInfo(AIReaction.CrouchBlock, this.crouchBlockSimulatedInput, weight * basicMoveWeight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.JumpBlock, out weight) && this.ValidateReaction(AIReactionType.JumpBlock, self, opponent)){
                    this.movements.Add(new MovementInfo(AIReaction.JumpBlock, this.jumpBlockSimulatedInput, weight * basicMoveWeight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.StandBlock, out weight) && this.ValidateReaction(AIReactionType.StandBlock, self, opponent)){
                    this.movements.Add(new MovementInfo(AIReaction.StandBlock, this.standBlockSimulatedInput, weight * basicMoveWeight));
                }

                // Changing AI behaviours...
                if (this.aiOutput.TryGetValue(AIReaction.ChangeBehaviour_Aggressive, out weight)){
                    this.movements.Add(new MovementInfo(AIReaction.ChangeBehaviour_Aggressive, null, weight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.ChangeBehaviour_Any, out weight)){
                    this.movements.Add(new MovementInfo(AIReaction.ChangeBehaviour_Any, null, weight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.ChangeBehaviour_Balanced, out weight)){
                    this.movements.Add(new MovementInfo(AIReaction.ChangeBehaviour_Balanced, null, weight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.ChangeBehaviour_Defensive, out weight)){
                    this.movements.Add(new MovementInfo(AIReaction.ChangeBehaviour_Defensive, null, weight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.ChangeBehaviour_VeryAggressive, out weight)){
                    this.movements.Add(new MovementInfo(AIReaction.ChangeBehaviour_VeryAggressive, null, weight));
                }
                if (this.aiOutput.TryGetValue(AIReaction.ChangeBehaviour_VeryDefensive, out weight)){
                    this.movements.Add(new MovementInfo(AIReaction.ChangeBehaviour_VeryDefensive, null, weight));
                }

                // And attack movements...
                if(
                    this.aiOutput.ContainsKey(AIReaction.PlayMove_RandomAttack) &&
                    this.ValidateReaction(AIReactionType.PlayMove, self, opponent)
                    ){
                    this.AddValidMoves(
                        self,
                        opponent,
                        this.inferenceEngine.DefaultValue,
                        useBestAvailableMove,
                        deltaTime
                        );
                }

                // Check if the character can execute any movement...
                MovementInfo currentMovement;
                if (this.movements.Count > 0){
                    // Check if we want to select only the best available movement or if we want to choose
                    // a random movement giving higher chances to movements with higher desirability...
                    //
                    // If we want to select the best available movement, but there are several movements with
                    // the best weight, we choose one of those movements randomly.
                    this.movements.Sort(delegate(MovementInfo move1, MovementInfo move2) {
                        return move2.weight.CompareTo(move1.weight);
                    });

                    self.aiDebugger = "";
                    if (self.debugger != null && UFE.config.debugOptions.debugMode && ai.debugMode && ai.debug_ReactionWeight){
                        self.aiDebugger = "-----AI Reaction Weights-----\n";
                        StringBuilder sb = new StringBuilder();
                        sb.Append("Instruction Set: ").Append(ai.instructionsName).AppendLine();

                        foreach(MovementInfo mInfo in this.movements){
                            sb.Append(mInfo.name).Append(" = ").Append(mInfo.weight).AppendLine();
                        }

                        self.aiDebugger += sb.ToString();
                    }

                    if (useBestAvailableMove){
                        //---------------------------------------------------------------------------------------------
                        // If we want to use the best available move, find the move with the best weight and discard
                        // the rest of the moves. If there are several moves with the best weight, choose one of them
                        // randomly.
                        //---------------------------------------------------------------------------------------------
                        float maxWeight = 0f;

                        for (int i = 0; i < this.movements.Count; ++i){
                            currentMovement = this.movements[i];

                            //-----------------------------------------------------------------------------------------
                            // We know the moves are already sorted by its weight,
                            // but we want to check if the simulated input is null
                            // because those are special cases.
                            //-----------------------------------------------------------------------------------------
                            if (currentMovement != null && currentMovement.simulatedInput != null){
                                maxWeight = currentMovement.weight;
                                break;
                            }
                        }

                        for (int i = this.movements.Count - 1; i > 0; --i){
                            currentMovement = this.movements[i];

                            if (
                                currentMovement == null
                                ||
                                (
                                currentMovement.weight < maxWeight &&
                                !Mathf.Approximately(currentMovement.weight, maxWeight)
                                )
                                ){
                                this.movements.RemoveAt(i);
                            }
                        }
                    }

                    MovementInfo chosenMovement = null;
                    while (chosenMovement == null || chosenMovement.simulatedInput == null){
                        //---------------------------------------------------------------------------------------------
                        // Calculate the total weight of all possible moves
                        //---------------------------------------------------------------------------------------------

                        //---------------------------------------------------------------------------------------------
                        // It's look like the iOS AOT Compiler doesn't like this function, so I implement it myself.
                        //---------------------------------------------------------------------------------------------
                        //float totalWeight = this.movements.Sum((MovementInfo m) => m.weight);
                        float totalWeight = 0f;
                        foreach (MovementInfo movement in movements){
                            if (movement != null){
                                totalWeight += movement.weight;
                            }
                        }

                        if (totalWeight > 0f){
                            //-----------------------------------------------------------------------------------------
                            // If the total weight is greater than zero, choose a random movement
                            // (taking the weight of that movement into account)
                            //-----------------------------------------------------------------------------------------
                            float random = UnityEngine.Random.Range(0f, totalWeight);

                            int length = this.movements.Count;
                            float accumulatedWeight = 0f;
                            float currentWeight;

                            for (int i = 0; i < length - 1; ++i){
                                currentMovement = this.movements[i];

                                if (currentMovement != null){
                                    currentWeight = currentMovement.weight;

                                    if (currentWeight > 0f){
                                        accumulatedWeight += currentWeight;

                                        if (random < accumulatedWeight){
                                            chosenMovement = currentMovement;
                                            break;
                                        }
                                    }
                                }
                            }

                            if (chosenMovement == null && length > 0){
                                chosenMovement = this.movements[length - 1];
                            }

                            //-----------------------------------------------------------------------------------------
                            // If the chosen movement doesn't have a simulated input, it's a special case
                            //-----------------------------------------------------------------------------------------
                            if (chosenMovement != null && chosenMovement.simulatedInput.Length == 0){
                                if (AIReaction.ChangeBehaviour_Aggressive.Equals(chosenMovement.name)){
                                    foreach (AIInstructionsSet instructionsSet in self.myInfo.aiInstructionsSet){
                                        if (instructionsSet != null && instructionsSet.behavior == AIBehavior.Aggressive){
                                            this.SetAIInformation(instructionsSet.aiInfo);
                                            break;
                                        }
                                    }
                                }else if (AIReaction.ChangeBehaviour_Any.Equals(chosenMovement.name)){
                                    List<AIInstructionsSet> instructions = new List<AIInstructionsSet>(self.myInfo.aiInstructionsSet);
                                    AIInstructionsSet instructionsSet = null;

                                    while (instructionsSet == null && instructions.Count > 0){
                                        int r = UnityEngine.Random.Range(0, instructions.Count);
                                        instructionsSet = instructions[r];
                                        instructions.RemoveAt(r);
                                    }

                                    if (instructionsSet != null){
                                        this.SetAIInformation(instructionsSet.aiInfo);
                                    }

                                }else if (AIReaction.ChangeBehaviour_Balanced.Equals(chosenMovement.name)){
                                    foreach (AIInstructionsSet instructionsSet in self.myInfo.aiInstructionsSet){
                                        if (instructionsSet != null && instructionsSet.behavior == AIBehavior.Balanced){
                                            this.SetAIInformation(instructionsSet.aiInfo);
                                            break;
                                        }
                                    }
                                }else if (AIReaction.ChangeBehaviour_Defensive.Equals(chosenMovement.name)){
                                    foreach (AIInstructionsSet instructionsSet in self.myInfo.aiInstructionsSet){
                                        if (instructionsSet != null && instructionsSet.behavior == AIBehavior.Defensive){
                                            this.SetAIInformation(instructionsSet.aiInfo);
                                            break;
                                        }
                                    }
                                }else if (AIReaction.ChangeBehaviour_VeryAggressive.Equals(chosenMovement.name)){
                                    foreach (AIInstructionsSet instructionsSet in self.myInfo.aiInstructionsSet){
                                        if (instructionsSet != null && instructionsSet.behavior == AIBehavior.VeryAggressive){
                                            this.SetAIInformation(instructionsSet.aiInfo);
                                            break;
                                        }
                                    }
                                }else if (AIReaction.ChangeBehaviour_VeryDefensive.Equals(chosenMovement.name)){
                                    foreach (AIInstructionsSet instructionsSet in self.myInfo.aiInstructionsSet){
                                        if (instructionsSet != null && instructionsSet.behavior == AIBehavior.VeryDefensive){
                                            this.SetAIInformation(instructionsSet.aiInfo);
                                            break;
                                        }
                                    }
                                }

                                //-------------------------------------------------------------------------------------
                                // As soon as the special case is processed,
                                // remove it from the list and choose another movement
                                //-------------------------------------------------------------------------------------
                                this.movements.Remove (chosenMovement);
                            }
                        }else{
                            break;
                        }
                    }

                    if (chosenMovement == null){
                        chosenMovement = new MovementInfo(AIReaction.Idle, this.Repeat(this.noButtonsPressed, frames), 1f);
                    }

                    return chosenMovement;
                }
            }
        }

        return null;
    }
Exemple #32
0
 public static Bar GenerateBeatBar(MovementInfo movement)
 {
     return(new Bar());
 }