public void moveTo(Location location) { double distanceX = location.getX() - this.location.getX(); double distanceY = location.getY() - this.location.getY(); double distanceZ = location.getZ() - this.location.getZ(); if (Math.abs(distanceX) > 8 || Math.abs(distanceY) > 8 || Math.abs(distanceZ) > 8) { teleport(location); } else { moveRelTo(location); } } public void moveRelTo(Location location) { double deltaX = (this.location.getX() * 32 - location.getX() * 32) * 128; double deltaY = (this.location.getY() * 32 - location.getY() * 32) * 128; double deltaZ = (this.location.getZ() * 32 - location.getZ() * 32) * 128; this.location = location; PacketContainer movementPacket = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE); movementPacket.getIntegers().write(0, entityId); movementPacket.getShorts().writeSafely(0, (short) deltaX); movementPacket.getShorts().writeSafely(1, (short) deltaY); movementPacket.getShorts().writeSafely(2, (short) deltaZ); movementPacket.getBooleans().writeSafely(0, false); sendPacketToAllViewers(movementPacket); } public void teleport(Location location) { this.location = location; PacketContainer teleportPacket = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); teleportPacket.getIntegers().write(0, entityId); teleportPacket.getDoubles().writeSafely(0, location.getX()); teleportPacket.getDoubles().writeSafely(1, location.getY()); teleportPacket.getDoubles().writeSafely(2, location.getZ()); teleportPacket.getBytes().writeSafely(0, (byte) (location.getYaw() * 256.0F / 360.0F)); teleportPacket.getBytes().writeSafely(1, (byte) (location.getPitch() * 256.0F / 360.0F)); teleportPacket.getBooleans().writeSafely(0, false); // is on ground sendPacketToAllViewers(teleportPacket); }