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