Esempio n. 1
0
        /// <inheritdoc/>
        public void ObjectMoved(ILocateable obj, MoveType type)
        {
            var objectId = obj.GetId(this.player);

            if (type == MoveType.Instant)
            {
                this.connection.Send(new byte[] { 0xC1, 0x08, (byte)PacketType.Teleport, objectId.GetHighByte(), objectId.GetLowByte(), obj.X, obj.Y, 0 });
            }
            else
            {
                IList <Direction> steps = null;
                var       x             = obj.X;
                var       y             = obj.Y;
                Direction rotation      = Direction.Undefined;
                if (obj is ISupportWalk supportWalk)
                {
                    if (this.SendWalkDirections)
                    {
                        steps = supportWalk.NextDirections.Select(d => d.Direction).ToList();

                        // The last one is the rotation
                        rotation = steps.LastOrDefault();
                        steps.RemoveAt(steps.Count - 1);
                    }

                    if (obj is IRotateable rotateable)
                    {
                        rotation = rotateable.Rotation.RotateLeft();
                    }

                    x = supportWalk.WalkTarget.X;
                    y = supportWalk.WalkTarget.Y;
                }

                var    stepsSize  = (steps?.Count / 2) + 2 ?? 1;
                byte[] walkPacket = new byte[7 + stepsSize];
                walkPacket.SetValues <byte>(0xC1, (byte)walkPacket.Length, (byte)PacketType.Walk, objectId.GetHighByte(), objectId.GetLowByte(), x, y, (byte)((steps?.Count ?? 0) | ((byte)rotation) << 4));
                if (steps != null)
                {
                    walkPacket[7] = (byte)((int)steps.First() << 4 | (int)steps.Count);
                    for (int i = 0; i < steps.Count; i += 2)
                    {
                        var index      = 8 + (i / 2);
                        var firstStep  = steps[i];
                        var secondStep = steps.Count > i + 2 ? steps[i + 2] : Direction.Undefined;
                        walkPacket[index] = (byte)((int)firstStep << 4 | (int)secondStep);
                    }
                }

                this.connection.Send(walkPacket);
            }
        }
Esempio n. 2
0
        /// <inheritdoc/>
        public void ObjectMoved(ILocateable obj, MoveType type)
        {
            var objectId = obj.GetId(this.player);

            if (type == MoveType.Instant)
            {
                using (var writer = this.connection.StartSafeWrite(0xC1, 0x08))
                {
                    var packet = writer.Span;
                    packet[2] = (byte)PacketType.Teleport;
                    packet[3] = objectId.GetHighByte();
                    packet[4] = objectId.GetLowByte();
                    packet[5] = obj.X;
                    packet[6] = obj.Y;
                    writer.Commit();
                }
            }
            else
            {
                IList <Direction> steps = null;
                var       x             = obj.X;
                var       y             = obj.Y;
                Direction rotation      = Direction.Undefined;
                if (obj is ISupportWalk supportWalk)
                {
                    if (this.SendWalkDirections)
                    {
                        steps = supportWalk.NextDirections.Select(d => d.Direction).ToList();

                        // The last one is the rotation
                        rotation = steps.LastOrDefault();
                        steps.RemoveAt(steps.Count - 1);
                    }

                    if (obj is IRotateable rotateable)
                    {
                        rotation = rotateable.Rotation.RotateLeft();
                    }

                    x = supportWalk.WalkTarget.X;
                    y = supportWalk.WalkTarget.Y;
                }

                var stepsSize = (steps?.Count / 2) + 2 ?? 1;
                using (var writer = this.connection.StartSafeWrite(0xC1, 7 + stepsSize))
                {
                    var walkPacket = writer.Span;
                    walkPacket[2] = (byte)PacketType.Walk;
                    walkPacket[3] = objectId.GetHighByte();
                    walkPacket[4] = objectId.GetLowByte();
                    walkPacket[5] = x;
                    walkPacket[6] = y;
                    walkPacket[7] = (byte)((steps?.Count ?? 0) | ((byte)rotation) << 4);
                    if (steps != null)
                    {
                        walkPacket[7] = (byte)((int)steps.First() << 4 | (int)steps.Count);
                        for (int i = 0; i < steps.Count; i += 2)
                        {
                            var index      = 8 + (i / 2);
                            var firstStep  = steps[i];
                            var secondStep = steps.Count > i + 2 ? steps[i + 2] : Direction.Undefined;
                            walkPacket[index] = (byte)((int)firstStep << 4 | (int)secondStep);
                        }
                    }

                    writer.Commit();
                }
            }
        }
Esempio n. 3
0
        /// <inheritdoc/>
        public void ObjectMoved(ILocateable obj, MoveType type)
        {
            var objectId = obj.GetId(this.player);

            if (type == MoveType.Instant)
            {
                using (var writer = this.connection.StartSafeWrite(0xC1, 0x08))
                {
                    var packet = writer.Span;
                    packet[2] = (byte)PacketType.Teleport;
                    packet[3] = objectId.GetHighByte();
                    packet[4] = objectId.GetLowByte();
                    packet[5] = obj.Position.X;
                    packet[6] = obj.Position.Y;
                    writer.Commit();
                }
            }
            else
            {
                Span <Direction> steps = this.SendWalkDirections ? stackalloc Direction[16] : null;
                var       stepsLength  = 0;
                var       point        = obj.Position;
                Direction rotation     = Direction.Undefined;
                if (obj is ISupportWalk supportWalk)
                {
                    if (this.SendWalkDirections)
                    {
                        stepsLength = supportWalk.GetDirections(steps);
                        if (stepsLength > 0)
                        {
                            // The last one is the rotation
                            rotation = steps[stepsLength - 1];
                            steps    = steps.Slice(0, stepsLength - 1);
                            stepsLength--;
                        }
                    }

                    if (obj is IRotatable rotatable)
                    {
                        rotation = rotatable.Rotation;
                    }

                    point = supportWalk.WalkTarget;
                }

                var stepsSize = steps == null ? 1 : (steps.Length / 2) + 2;
                using (var writer = this.connection.StartSafeWrite(0xC1, 7 + stepsSize))
                {
                    var walkPacket = writer.Span;
                    walkPacket[2] = (byte)PacketType.Walk;
                    walkPacket[3] = objectId.GetHighByte();
                    walkPacket[4] = objectId.GetLowByte();
                    walkPacket[5] = point.X;
                    walkPacket[6] = point.Y;
                    walkPacket[7] = (byte)(stepsLength | rotation.ToPacketByte() << 4);
                    if (steps != null)
                    {
                        walkPacket[7] = (byte)(steps[0].ToPacketByte() << 4 | stepsSize);
                        for (int i = 0; i < stepsSize; i += 2)
                        {
                            var index      = 8 + (i / 2);
                            var firstStep  = steps[i].ToPacketByte();
                            var secondStep = stepsSize > i + 2 ? steps[i + 2].ToPacketByte() : 0;
                            walkPacket[index] = (byte)(firstStep << 4 | secondStep);
                        }
                    }

                    writer.Commit();
                }
            }
        }