From a3136e4d00a7b71ad71872cc78c4a9b2b2544cb8 Mon Sep 17 00:00:00 2001 From: JitseB Date: Wed, 25 Apr 2018 16:58:32 +0200 Subject: [PATCH] Created teleportation method for V1_12_R1. --- src/net/jitse/npclib/api/NPC.java | 9 +++++++ .../npclib/nms/v1_12_R1/NPC_V1_12_R1.java | 14 ++++++++--- .../PacketPlayOutEntityTeleportWrapper.java | 25 +++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/net/jitse/npclib/api/NPC.java b/src/net/jitse/npclib/api/NPC.java index ca7b90b..de88353 100644 --- a/src/net/jitse/npclib/api/NPC.java +++ b/src/net/jitse/npclib/api/NPC.java @@ -162,4 +162,13 @@ public abstract class NPC { // Internal method. protected abstract void sendHidePackets(Player player); + + public void teleport(Player player, Location location) { + this.location = location; + + sendTeleportationPackets(player); + } + + // Internal method. + public abstract void sendTeleportationPackets(Player player); } diff --git a/src/net/jitse/npclib/nms/v1_12_R1/NPC_V1_12_R1.java b/src/net/jitse/npclib/nms/v1_12_R1/NPC_V1_12_R1.java index 154b40c..3c61459 100644 --- a/src/net/jitse/npclib/nms/v1_12_R1/NPC_V1_12_R1.java +++ b/src/net/jitse/npclib/nms/v1_12_R1/NPC_V1_12_R1.java @@ -6,10 +6,7 @@ package net.jitse.npclib.nms.v1_12_R1; import net.jitse.npclib.api.NPC; import net.jitse.npclib.nms.holograms.Hologram; -import net.jitse.npclib.nms.v1_12_R1.packets.PacketPlayOutEntityHeadRotationWrapper; -import net.jitse.npclib.nms.v1_12_R1.packets.PacketPlayOutNamedEntitySpawnWrapper; -import net.jitse.npclib.nms.v1_12_R1.packets.PacketPlayOutPlayerInfoWrapper; -import net.jitse.npclib.nms.v1_12_R1.packets.PacketPlayOutScoreboardTeamWrapper; +import net.jitse.npclib.nms.v1_12_R1.packets.*; import net.jitse.npclib.skin.Skin; import net.minecraft.server.v1_12_R1.*; import org.bukkit.Bukkit; @@ -100,4 +97,13 @@ public class NPC_V1_12_R1 extends NPC { Bukkit.getScheduler().runTaskLater(plugin, () -> playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); } + + @Override + public void sendTeleportationPackets(Player player) { + PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; + + PacketPlayOutEntityTeleport packetPlayOutEntityTeleport = new PacketPlayOutEntityTeleportWrapper().create(entityId, location); + + playerConnection.sendPacket(packetPlayOutEntityTeleport); + } } diff --git a/src/net/jitse/npclib/nms/v1_12_R1/packets/PacketPlayOutEntityTeleportWrapper.java b/src/net/jitse/npclib/nms/v1_12_R1/packets/PacketPlayOutEntityTeleportWrapper.java index 7624b2e..a1eeba3 100644 --- a/src/net/jitse/npclib/nms/v1_12_R1/packets/PacketPlayOutEntityTeleportWrapper.java +++ b/src/net/jitse/npclib/nms/v1_12_R1/packets/PacketPlayOutEntityTeleportWrapper.java @@ -4,10 +4,35 @@ package net.jitse.npclib.nms.v1_12_R1.packets; +import com.comphenix.tinyprotocol.Reflection; +import net.minecraft.server.v1_12_R1.PacketPlayOutEntityTeleport; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; + /** * @author Jitse Boonstra */ public class PacketPlayOutEntityTeleportWrapper { + public PacketPlayOutEntityTeleport create(int entityId, Location location) { + PacketPlayOutEntityTeleport packetPlayOutEntityTeleport = new PacketPlayOutEntityTeleport(); + Reflection.getField(packetPlayOutEntityTeleport.getClass(), "a", int.class) + .set(packetPlayOutEntityTeleport, entityId); + Reflection.getField(packetPlayOutEntityTeleport.getClass(), "b", double.class) + .set(packetPlayOutEntityTeleport, location.getX()); + Reflection.getField(packetPlayOutEntityTeleport.getClass(), "c", double.class) + .set(packetPlayOutEntityTeleport, location.getY()); + Reflection.getField(packetPlayOutEntityTeleport.getClass(), "d", double.class) + .set(packetPlayOutEntityTeleport, location.getZ()); + Reflection.getField(packetPlayOutEntityTeleport.getClass(), "e", byte.class) + .set(packetPlayOutEntityTeleport, (byte) ((int) (location.getYaw() * 256.0F / 360.0F))); + Reflection.getField(packetPlayOutEntityTeleport.getClass(), "f", byte.class) + .set(packetPlayOutEntityTeleport, (byte) ((int) (location.getPitch() * 256.0F / 360.0F))); + Reflection.getField(packetPlayOutEntityTeleport.getClass(), "g", boolean.class) + .set(packetPlayOutEntityTeleport, location.getBlock().getRelative(BlockFace.DOWN).getType() != Material.AIR); + + return packetPlayOutEntityTeleport; + } }