public InterpretedMotionState(MovementData data)
        {
            MovementData = data;
            CurrentStyle = data.CurrentStyle;

            Flags = BuildMovementFlags();
        }
Beispiel #2
0
        public override byte[] GetPayload(WorldObject animationTarget)
        {
            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);

            writer.Write((byte)MovementTypes.General); // movement_type
            MotionFlags flags = MotionFlags.None;

            if (HasTarget)
            {
                flags |= MotionFlags.HasTarget;
            }
            if (Jumping)
            {
                flags |= MotionFlags.Jumping;
            }

            writer.Write((byte)flags);    // these can be or and has sticky object | is long jump mode |
            writer.Write((ushort)Stance); // called command in the client
            MovementStateFlag generalFlags = MovementData.MovementStateFlag;

            generalFlags += (uint)Commands.Count << 7;
            writer.Write((uint)generalFlags);

            MovementData.Serialize(writer);

            foreach (var item in Commands)
            {
                writer.Write((ushort)item.Motion);
                writer.Write(animationTarget.Sequences.GetNextSequence(Sequence.SequenceType.Motion));
                writer.Write(item.Speed);
            }
            return(stream.ToArray());
        }
        public InterpretedMotionState(MovementData data, Motion motion)
        {
            MovementData = data;
            CurrentStyle = data.CurrentStyle;

            var state = motion.MotionState;

            ForwardCommand  = state.ForwardCommand;
            SidestepCommand = state.SidestepCommand;
            TurnCommand     = state.TurnCommand;

            ForwardSpeed  = state.ForwardSpeed;
            SidestepSpeed = state.SidestepSpeed;
            TurnSpeed     = state.TurnSpeed;

            Commands = state.Commands;

            Flags = BuildMovementFlags();
        }
        public InterpretedMotionState(InterpretedMotionState state)
        {
            // copy constructor
            Flags           = state.Flags;
            MovementData    = state.MovementData;
            CurrentStyle    = state.CurrentStyle;
            ForwardCommand  = state.ForwardCommand;
            SidestepCommand = state.SidestepCommand;
            TurnCommand     = state.TurnCommand;
            ForwardSpeed    = state.ForwardSpeed;
            SidestepSpeed   = state.SidestepSpeed;
            TurnSpeed       = state.TurnSpeed;

            if (state.Commands != null)
            {
                Commands = new List <MotionItem>();
                foreach (var command in state.Commands)
                {
                    Commands.Add(new MotionItem(command));
                }
            }
        }
Beispiel #5
0
        public void SetMovementStateFlag()
        {
            movementStateFlag = MovementStateFlag.NoMotionState;

            if (CurrentStyle != 0)
            {
                movementStateFlag |= MovementStateFlag.CurrentStyle;
            }
            if (ForwardCommand != 0)
            {
                movementStateFlag |= MovementStateFlag.ForwardCommand;
            }
            if (SideStepCommand != 0)
            {
                movementStateFlag |= MovementStateFlag.SideStepCommand;
            }
            if (TurnCommand != 0)
            {
                movementStateFlag |= MovementStateFlag.TurnCommand;
            }
            // Floating point compare
            if (Math.Abs(ForwardSpeed) > 0.01)
            {
                movementStateFlag |= MovementStateFlag.ForwardSpeed;
            }
            // Floating point compare
            if (Math.Abs(SideStepSpeed) > 0.01)
            {
                movementStateFlag |= MovementStateFlag.SideStepSpeed;
            }
            // Floating point compare
            if (Math.Abs(TurnSpeed) > 0.01)
            {
                movementStateFlag |= MovementStateFlag.TurnSpeed;
            }
        }
Beispiel #6
0
        public override byte[] GetPayload(WorldObject animationTarget, float distanceFromObject = 0.6f)
        {
            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);

            writer.Write((byte)MovementTypes);
            MotionFlags flags = MotionFlags.None;

            if (HasTarget)
            {
                flags |= MotionFlags.HasTarget;
            }
            if (Jumping)
            {
                flags |= MotionFlags.Jumping;
            }

            writer.Write((byte)flags);    // these can be or and has sticky object | is long jump mode |
            writer.Write((ushort)Stance); // called command in the client
            switch (MovementTypes)
            {
            case MovementTypes.General:
            {
                MovementStateFlag generalFlags = MovementData.MovementStateFlag;

                generalFlags += (uint)Commands.Count << 7;
                writer.Write((uint)generalFlags);

                MovementData.Serialize(writer);

                foreach (var item in Commands)
                {
                    writer.Write((ushort)item.Motion);
                    writer.Write(animationTarget.Sequences.GetNextSequence(Sequence.SequenceType.Motion));
                    writer.Write(item.Speed);
                }
                break;
            }

            case MovementTypes.MoveToObject:
            {
                // 4320783 = EE0F
                // 4320847 = EE4F
                // 4321264 = EFF0
                // 4321136 = EF70
                // 4319823 = EA4F
                // EE9F -? fail distance 100
                writer.Write(animationTarget.Guid.Full);
                Position.Serialize(writer, false);
                // TODO: Og Fix to real numbers
                writer.Write(Flag);
                writer.Write(distanceFromObject);
                writer.Write((float)0);
                writer.Write(float.MaxValue);
                writer.Write((float)1);
                writer.Write((float)15);
                writer.Write((float)0);
                writer.Write(1.0f);
                break;
            }

            case MovementTypes.MoveToPosition:
            {
                try
                {
                    Position.Serialize(writer, false);
                    // TODO: Og Fix to real numbers
                    writer.Write(Flag);
                    writer.Write(distanceFromObject);
                    writer.Write((float)0);
                    writer.Write(float.MaxValue);
                    writer.Write((float)1);
                    writer.Write((float)15);
                    writer.Write((float)0);
                    writer.Write(1.0f);
                }
                catch (Exception)
                {
                    // Do nothing

                    // TODO: This prevents a crash in Kryst and possibly other locations, Please investigate and fix if possible.
                }
                break;
            }
            }

            return(stream.ToArray());
        }
Beispiel #7
0
        public UniversalMotion(byte[] currentMotionState)
        {
            MemoryStream stream = new MemoryStream(currentMotionState);
            BinaryReader reader = new BinaryReader(stream);

            MovementTypes = (MovementTypes)reader.ReadByte();   // movement_type

            MotionFlags flags = (MotionFlags)reader.ReadByte(); // these can be or and has sticky object | is long jump mode |

            if ((flags & MotionFlags.HasTarget) != 0)
            {
                HasTarget = true;
            }
            if ((flags & MotionFlags.Jumping) != 0)
            {
                Jumping = true;
            }

            Stance = (MotionStance)reader.ReadUInt16(); // called command in the client

            MovementStateFlag generalFlags = (MovementStateFlag)reader.ReadUInt32();

            MovementData = new MovementData();

            if ((generalFlags & MovementStateFlag.CurrentStyle) != 0)
            {
                try
                {
                    MovementData.CurrentStyle = (ushort)reader.ReadUInt32();
                }
                catch (Exception)
                {
                    MovementData.CurrentStyle = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.ForwardCommand) != 0)
            {
                try
                {
                    MovementData.ForwardCommand = (ushort)reader.ReadUInt32();
                }
                catch (Exception)
                {
                    MovementData.ForwardCommand = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.ForwardSpeed) != 0)
            {
                try
                {
                    MovementData.ForwardSpeed = (ushort)reader.ReadSingle();
                }
                catch (Exception)
                {
                    MovementData.ForwardSpeed = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.SideStepCommand) != 0)
            {
                try
                {
                    MovementData.SideStepCommand = (ushort)reader.ReadUInt32();
                }
                catch (Exception)
                {
                    MovementData.SideStepCommand = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.SideStepSpeed) != 0)
            {
                try
                {
                    MovementData.SideStepSpeed = (ushort)reader.ReadSingle();
                }
                catch (Exception)
                {
                    MovementData.SideStepSpeed = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.TurnCommand) != 0)
            {
                try
                {
                    MovementData.TurnCommand = (ushort)reader.ReadUInt32();
                }
                catch (Exception)
                {
                    MovementData.TurnCommand = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.TurnSpeed) != 0)
            {
                try
                {
                    MovementData.TurnSpeed = (ushort)reader.ReadSingle();
                }
                catch (Exception)
                {
                    MovementData.TurnSpeed = 0;
                }
            }

            // foreach (var item in Commands)
            // {
            //    writer.Write((ushort)item.Motion);
            //    writer.Write(animationTarget.Sequences.GetNextSequence(Sequence.SequenceType.Motion));
            //    writer.Write(item.Speed);
            // }

            // if ((generalFlags & MovementStateFlag.ForwardCommand) != 0)
            // {
            //    MotionItem item = new MotionItem();
            //    item.Motion = (MotionCommand)reader.ReadUInt16();
            //    item.Speed = reader.ReadSingle();
            //    Commands.Add(item);
            // }
            // if ((generalFlags & MovementStateFlag.SideStepCommand) != 0)
            // {
            //    MotionItem item = new MotionItem();
            //    item.Motion = (MotionCommand)reader.ReadUInt16();
            //    item.Speed = reader.ReadSingle();
            //    Commands.Add(item);
            // }
            // if ((generalFlags & MovementStateFlag.TurnCommand) != 0)
            // {
            //    MotionItem item = new MotionItem();
            //    item.Motion = (MotionCommand)reader.ReadUInt16();
            //    item.Speed = reader.ReadSingle();
            //    Commands.Add(item);
            // }

            // return stream.ToArray();
        }
Beispiel #8
0
        public UniversalMotion(byte[] currentMotionState)
        {
            MemoryStream stream = new MemoryStream(currentMotionState);
            BinaryReader reader = new BinaryReader(stream);

            MovementTypes = (MovementTypes)reader.ReadByte();   // movement_type

            MotionFlags flags = (MotionFlags)reader.ReadByte(); // these can be or and has sticky object | is long jump mode |

            if ((flags & MotionFlags.HasTarget) != 0)
            {
                HasTarget = true;
            }
            if ((flags & MotionFlags.Jumping) != 0)
            {
                Jumping = true;
            }

            Stance = (MotionStance)reader.ReadUInt16(); // called command in the client

            MovementStateFlag generalFlags = (MovementStateFlag)reader.ReadUInt32();

            MovementData = new MovementData();

            if ((generalFlags & MovementStateFlag.CurrentStyle) != 0)
            {
                try
                {
                    MovementData.CurrentStyle = (ushort)reader.ReadUInt32();
                }
                catch (Exception)
                {
                    MovementData.CurrentStyle = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.ForwardCommand) != 0)
            {
                try
                {
                    MovementData.ForwardCommand = (ushort)reader.ReadUInt32();
                }
                catch (Exception)
                {
                    MovementData.ForwardCommand = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.ForwardSpeed) != 0)
            {
                try
                {
                    MovementData.ForwardSpeed = (ushort)reader.ReadSingle();
                }
                catch (Exception)
                {
                    MovementData.ForwardSpeed = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.SideStepCommand) != 0)
            {
                try
                {
                    MovementData.SideStepCommand = (ushort)reader.ReadUInt32();
                }
                catch (Exception)
                {
                    MovementData.SideStepCommand = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.SideStepSpeed) != 0)
            {
                try
                {
                    MovementData.SideStepSpeed = (ushort)reader.ReadSingle();
                }
                catch (Exception)
                {
                    MovementData.SideStepSpeed = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.TurnCommand) != 0)
            {
                try
                {
                    MovementData.TurnCommand = (ushort)reader.ReadUInt32();
                }
                catch (Exception)
                {
                    MovementData.TurnCommand = 0;
                }
            }

            if ((generalFlags & MovementStateFlag.TurnSpeed) != 0)
            {
                try
                {
                    MovementData.TurnSpeed = (ushort)reader.ReadSingle();
                }
                catch (Exception)
                {
                    MovementData.TurnSpeed = 0;
                }
            }
        }
Beispiel #9
0
        public override byte[] GetPayload(ObjectGuid animationTargetGuid, SequenceManager sequence)
        {
            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);

            writer.Write((byte)MovementTypes);
            MotionFlags flags = MotionFlags.None;

            if (HasTarget)
            {
                flags |= MotionFlags.HasTarget;
            }
            if (Jumping)
            {
                flags |= MotionFlags.Jumping;
            }

            writer.Write((byte)flags);    // these can be or and has sticky object | is long jump mode |
            writer.Write((ushort)Stance); // called command in the client
            switch (MovementTypes)
            {
            case MovementTypes.General:
            {
                MovementData.SetMovementStateFlag();
                MovementStateFlag generalFlags = MovementData.MovementStateFlag;

                generalFlags += (uint)Commands.Count << 7;
                writer.Write((uint)generalFlags);

                MovementData.Serialize(writer);
                // Must be aligned for correct alignment. - sigh Og II
                writer.Align();

                foreach (var item in Commands)
                {
                    writer.Write((ushort)item.Motion);
                    writer.Write(sequence.GetNextSequence(SequenceType.Motion));
                    writer.Write(item.Speed);
                }
                break;
            }

            case MovementTypes.MoveToPosition:
            case MovementTypes.MoveToObject:
            {
                try
                {
                    if (MovementTypes == MovementTypes.MoveToObject)
                    {
                        writer.Write(TargetGuid.Full);
                    }

                    Position.Serialize(writer, false);
                    writer.Write(Flag);
                    writer.Write(DistanceFrom);
                    writer.Write(MinimumDistance);
                    writer.Write(FailDistance);
                    writer.Write(Speed);
                    writer.Write(WalkRunThreshold);
                    writer.Write(Heading);
                    writer.Write(RunRate);
                }
                catch (Exception)
                {
                    // Do nothing
                    // TODO: This prevents a crash in Kryst and possibly other locations, Please investigate and fix if possible.
                }
                break;
            }

            case MovementTypes.TurnToObject:
            {
                // This had the wrong value being passed.   We had never used this
                // movement type yet - coded it up but had not used or tested.
                writer.Write(TargetGuid.Full);
                writer.Write(Heading);
                writer.Write(Flag);
                writer.Write(Speed);
                writer.Write(DesiredHeading);         // always 0.0 in every pcap of this type.
                break;
            }

            case MovementTypes.TurnToHeading:
            {
                writer.Write(Flag);
                writer.Write(Speed);
                writer.Write(Heading);
                break;
            }
            }

            return(stream.ToArray());
        }