Ejemplo n.º 1
0
        public static void ParseLiving(this MovementBlock block)
        {
            block.MovementFlags  = (MovementFlags)block.Update.ReadUInt();
            block.MovementFlags2 = (MovementFlags2)block.Update.ReadUShort();
            block.Timestamp      = block.Update.ReadUInt();

            block.ParseStationaryObject();

            // Console.WriteLine("\tParsing Movement for {0}", block.UpdateFlags);

            // Client checks for 0x200
            if (block.MovementFlags.HasFlag(MovementFlags.OnTransport))
            {
                block.TransporterId         = block.Update.ReadPackedEntityId();
                block.TransporterPosition   = block.Update.ReadVector4();
                block.TransporterTime       = block.Update.ReadUInt();
                block.TransportSeatPosition = block.Update.ReadByte();
            }

            // Client checks for 0x2200000
            if (block.MovementFlags.HasAnyFlag(MovementFlags.Swimming | MovementFlags.Flying) ||
                block.MovementFlags2.HasFlag(MovementFlags2.AlwaysAllowPitching))
            {
                block.Pitch = block.Update.ReadFloat();
            }

            block.FallTime = block.Update.ReadUInt();

            // Client checks for 0x1000
            if (block.MovementFlags.HasFlag(MovementFlags.Falling))
            {
                // no idea
                block.FallFloat1 = block.Update.ReadFloat();
                block.FallFloat2 = block.Update.ReadFloat();
                block.FallFloat3 = block.Update.ReadFloat();
                block.FallFloat4 = block.Update.ReadFloat();
            }

            // Client checks for 0x4000000
            if (block.MovementFlags.HasFlag(MovementFlags.SplineElevation))
            {
                block.Spline0x4000000 = block.Update.ReadFloat();
            }

            // read speeds
            block.Speeds = new Speeds
            {
                Walk     = block.Update.ReadFloat(),
                Run      = block.Update.ReadFloat(),
                RunBack  = block.Update.ReadFloat(),
                Swim     = block.Update.ReadFloat(),
                SwimBack = block.Update.ReadFloat(),
                Fly      = block.Update.ReadFloat(),
                FlyBack  = block.Update.ReadFloat(),
                Turn     = block.Update.ReadFloat(),
                Pitch    = block.Update.ReadFloat()
            };


            if (block.MovementFlags.HasFlag(MovementFlags.SplineEnabled))
            {
                block.SplineFlags = (SplineFlags)block.Update.ReadUInt();

                if (block.SplineFlags.HasFlag(SplineFlags.FinalFaceAngle))
                {
                    block.SplinePosition.W = block.Update.ReadFloat();
                }
                else if (block.SplineFlags.HasFlag(SplineFlags.FinalFaceTarget))
                {
                    block.SplineId = block.Update.ReadEntityId();
                }
                else if (block.SplineFlags.HasFlag(SplineFlags.FinalFacePoint))
                {
                    block.SplinePosition = block.Update.ReadVector4NoO();
                }

                block.SplineMsTimeUnk = block.Update.ReadUInt();
                block.SplineUnkInt1   = block.Update.ReadUInt();
                block.SplineUnkInt2   = block.Update.ReadUInt();

                block.SplineVectorUnk = block.Update.ReadVector3();
                block.SplineUnkInt3   = block.Update.ReadUInt();

                block.SplineCount = block.Update.ReadUInt();
                if (block.SplineCount > 0)
                {
                    block.SplineNodes = new Vector3[block.SplineCount];
                    for (int i = 0; i < block.SplineCount; i++)
                    {
                        block.SplineNodes[i] = block.Update.ReadVector3();
                    }
                }
                block.SplineUnkByte = block.Update.ReadByte();

                block.SplineFinalNode = block.Update.ReadVector3();
            }
        }