Пример #1
0
        private static MovementData DeserializeMovement(BinaryReader reader, MotionStateFlag flags)
        {
            MovementData ret = new MovementData();

            if ((flags & MotionStateFlag.CurrentStyle) != 0)
            {
                ret.CurrentStyle = (ushort)reader.ReadUInt32();
            }

            if ((flags & MotionStateFlag.ForwardCommand) != 0)
            {
                ret.ForwardCommand = (ushort)reader.ReadUInt32();
            }

            // FIXME(ddevec): Holdkey?
            if ((flags & MotionStateFlag.ForwardHoldKey) != 0)
            {
                reader.ReadUInt32();
            }

            if ((flags & MotionStateFlag.ForwardSpeed) != 0)
            {
                ret.ForwardSpeed = (ushort)reader.ReadSingle();
            }

            if ((flags & MotionStateFlag.SideStepCommand) != 0)
            {
                ret.SideStepCommand = (ushort)reader.ReadUInt32();
            }

            // FIXME(ddevec): Holdkey?
            if ((flags & MotionStateFlag.SideStepHoldKey) != 0)
            {
                reader.ReadUInt32();
            }

            if ((flags & MotionStateFlag.SideStepSpeed) != 0)
            {
                ret.SideStepSpeed = (ushort)reader.ReadSingle();
            }

            if ((flags & MotionStateFlag.TurnCommand) != 0)
            {
                ret.TurnCommand = (ushort)reader.ReadUInt32();
            }

            // FIXME(ddevec): Holdkey?
            if ((flags & MotionStateFlag.TurnHoldKey) != 0)
            {
                reader.ReadUInt32();
            }

            if ((flags & MotionStateFlag.TurnSpeed) != 0)
            {
                ret.TurnSpeed = (ushort)reader.ReadSingle();
            }

            return(ret);
        }
Пример #2
0
        public static void Handle(ClientMessage message, Session session)
        {
            uint   currentHoldkey = 0;
            ushort instanceTimestamp;
            ushort serverControlTimestamp;
            ushort teleportTimestamp;
            ushort forcePositionTimestamp;

            /*bool contact;
             * bool longJump;*/

            MotionStateFlag flags = (MotionStateFlag)message.Payload.ReadUInt32();

            if ((flags & MotionStateFlag.CurrentHoldKey) != 0)
            {
                currentHoldkey = message.Payload.ReadUInt32();
            }

            MovementData md = DeserializeMovement(message.Payload, flags);

            uint numAnimations = (uint)flags >> 11;

            MotionItem[] commands = new MotionItem[numAnimations];
            for (int i = 0; i < numAnimations; i++)
            {
                ushort motionCommand = message.Payload.ReadUInt16();
                ushort sequence      = message.Payload.ReadUInt16();
                float  speed         = message.Payload.ReadSingle();
                commands[i] = new MotionItem((MotionCommand)motionCommand, speed);
            }

            var position = new Position(message.Payload);

            position.LandblockId = new LandblockId(position.Cell);

            instanceTimestamp      = message.Payload.ReadUInt16();
            serverControlTimestamp = message.Payload.ReadUInt16();
            teleportTimestamp      = message.Payload.ReadUInt16();
            forcePositionTimestamp = message.Payload.ReadUInt16();
            message.Payload.ReadByte();
            // FIXME(ddevec): If speed values in the motion need to be updated by the player, this will likely need to be adjusted
            // Send the motion to the player

            session.Player.RequestUpdateMotion(currentHoldkey, md, commands);

            session.Player.RequestUpdatePosition(position);
        }
Пример #3
0
        public override void Read()
        {
            MotionStateFlag flags = (MotionStateFlag)Fragment.Payload.ReadUInt32();

            if ((flags & MotionStateFlag.CurrentHoldKey) != 0)
            {
                currentHoldkey = Fragment.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.CurrentStyle) != 0)
            {
                currentStyle = Fragment.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.ForwardCommand) != 0)
            {
                forward.Command = Fragment.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.ForwardHoldKey) != 0)
            {
                forward.HoldKey = Fragment.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.ForwardSpeed) != 0)
            {
                forward.Speed = Fragment.Payload.ReadSingle();
            }

            if ((flags & MotionStateFlag.SideStepCommand) != 0)
            {
                sideStep.Command = Fragment.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.SideStepHoldKey) != 0)
            {
                sideStep.HoldKey = Fragment.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.SideStepSpeed) != 0)
            {
                sideStep.Speed = Fragment.Payload.ReadSingle();
            }

            if ((flags & MotionStateFlag.TurnCommand) != 0)
            {
                turn.Command = Fragment.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.TurnHoldKey) != 0)
            {
                turn.HoldKey = Fragment.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.TurnSpeed) != 0)
            {
                turn.Speed = Fragment.Payload.ReadSingle();
            }

            position               = new Position(Fragment.Payload);
            instanceTimestamp      = Fragment.Payload.ReadUInt16();
            serverControlTimestamp = Fragment.Payload.ReadUInt16();
            teleportTimestamp      = Fragment.Payload.ReadUInt16();
            forcePositionTimestamp = Fragment.Payload.ReadUInt16();
            Fragment.Payload.ReadByte();
        }
Пример #4
0
        public static void Handle(ClientMessage message, Session session)
        {
            Position             position;
            uint                 currentHoldkey;
            uint                 currentStyle;
            MotionStateDirection forward  = new MotionStateDirection();
            MotionStateDirection sideStep = new MotionStateDirection();
            MotionStateDirection turn     = new MotionStateDirection();
            ushort               instanceTimestamp;
            ushort               serverControlTimestamp;
            ushort               teleportTimestamp;
            ushort               forcePositionTimestamp;

            /*bool contact;
             * bool longJump;*/

            MotionStateFlag flags = (MotionStateFlag)message.Payload.ReadUInt32();

            if ((flags & MotionStateFlag.CurrentHoldKey) != 0)
            {
                currentHoldkey = message.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.CurrentStyle) != 0)
            {
                currentStyle = message.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.ForwardCommand) != 0)
            {
                forward.Command = message.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.ForwardHoldKey) != 0)
            {
                forward.HoldKey = message.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.ForwardSpeed) != 0)
            {
                forward.Speed = message.Payload.ReadSingle();
            }

            if ((flags & MotionStateFlag.SideStepCommand) != 0)
            {
                sideStep.Command = message.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.SideStepHoldKey) != 0)
            {
                sideStep.HoldKey = message.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.SideStepSpeed) != 0)
            {
                sideStep.Speed = message.Payload.ReadSingle();
            }

            if ((flags & MotionStateFlag.TurnCommand) != 0)
            {
                turn.Command = message.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.TurnHoldKey) != 0)
            {
                turn.HoldKey = message.Payload.ReadUInt32();
            }

            if ((flags & MotionStateFlag.TurnSpeed) != 0)
            {
                turn.Speed = message.Payload.ReadSingle();
            }

            position              = new Position(message.Payload);
            position.CharacterId  = session.Player.Guid.Low;
            position.PositionType = Entity.Enum.PositionType.Location;
            position.LandblockId  = new LandblockId(position.Cell);

            instanceTimestamp      = message.Payload.ReadUInt16();
            serverControlTimestamp = message.Payload.ReadUInt16();
            teleportTimestamp      = message.Payload.ReadUInt16();
            forcePositionTimestamp = message.Payload.ReadUInt16();
            message.Payload.ReadByte();

            session.Player.UpdatePosition(position);
        }