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