From 6a241d8bd741858e735609a99835385f99b51ede Mon Sep 17 00:00:00 2001 From: mergu Date: Sun, 8 Jul 2018 00:24:11 -0400 Subject: [PATCH] Add respawn and vision player mecs (#144) --- .../denizen/nms/interfaces/PacketHelper.java | 5 +++ .../aufdemrand/denizen/objects/dPlayer.java | 29 +++++++++++++++++ .../nms/helpers/PacketHelper_v1_10_R1.java | 31 ++++++++++++++++++ .../nms/helpers/PacketHelper_v1_11_R1.java | 31 ++++++++++++++++++ .../nms/helpers/PacketHelper_v1_12_R1.java | 32 +++++++++++++++++++ .../nms/helpers/PacketHelper_v1_8_R3.java | 32 +++++++++++++++++++ .../nms/helpers/PacketHelper_v1_9_R2.java | 32 +++++++++++++++++++ 7 files changed, 192 insertions(+) diff --git a/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/PacketHelper.java b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/PacketHelper.java index 4d44401494..65ba7a792f 100644 --- a/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/PacketHelper.java +++ b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/PacketHelper.java @@ -5,6 +5,7 @@ import org.bukkit.Location; import org.bukkit.block.banner.Pattern; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.EquipmentSlot; @@ -18,6 +19,10 @@ public interface PacketHelper { void setFieldOfView(Player player, float fov); + void respawn(Player player); + + void setVision(Player player, EntityType entityType); + void showDemoScreen(Player player); void showBlockAction(Player player, Location location, int action, int state); diff --git a/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java b/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java index 4450c16464..be2972345f 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java @@ -2201,6 +2201,35 @@ public void adjust(Mechanism mechanism) { Element value = mechanism.getValue(); + // <--[mechanism] + // @object dPlayer + // @name respawn + // @input None + // @description + // Forces the player to respawn if they are on the death screen. + // --> + if (mechanism.matches("respawn")) { + NMSHandler.getInstance().getPacketHelper().respawn(getPlayerEntity()); + } + + // <--[mechanism] + // @object dPlayer + // @name vision + // @input Element + // @description + // Changes the player's vision to the provided entity type. Valid types: + // ENDERMAN, CAVE_SPIDER, SPIDER, CREEPER + // Provide no value to reset the player's vision. + // --> + if (mechanism.matches("vision")) { + if (mechanism.hasValue() && mechanism.requireEnum(false, EntityType.values())) { + NMSHandler.getInstance().getPacketHelper().setVision(getPlayerEntity(), EntityType.valueOf(value.asString().toUpperCase())); + } + else { + NMSHandler.getInstance().getPacketHelper().forceSpectate(getPlayerEntity(), getPlayerEntity()); + } + } + // <--[mechanism] // @object dPlayer // @name level diff --git a/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_10_R1.java b/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_10_R1.java index bb8dd0bf90..05ea13c91c 100644 --- a/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_10_R1.java +++ b/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_10_R1.java @@ -11,10 +11,12 @@ import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; import net.minecraft.server.v1_10_R1.*; +import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.block.banner.Pattern; import org.bukkit.craftbukkit.v1_10_R1.CraftEquipmentSlot; +import org.bukkit.craftbukkit.v1_10_R1.CraftServer; import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; import org.bukkit.craftbukkit.v1_10_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; @@ -46,6 +48,35 @@ public void setFieldOfView(Player player, float fov) { sendPacket(player, packet); } + @Override + public void respawn(Player player) { + ((CraftPlayer) player).getHandle().playerConnection.a(new PacketPlayInClientCommand(PacketPlayInClientCommand.EnumClientCommand.PERFORM_RESPAWN)); + } + + @Override + public void setVision(Player player, EntityType entityType) { + final EntityLiving entity; + if (entityType == EntityType.CREEPER) { + entity = new EntityCreeper(((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.SPIDER || entityType == EntityType.CAVE_SPIDER) { + entity = new EntitySpider(((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.ENDERMAN) { + entity = new EntityEnderman(((CraftWorld) player.getWorld()).getHandle()); + } + else { + return; + } + + // Spectating an entity then immediately respawning the player prevents a client shader update, + // allowing the player to retain whatever vision the mob they spectated had. + sendPacket(player, new PacketPlayOutSpawnEntityLiving(entity)); + sendPacket(player, new PacketPlayOutCamera(entity)); + ((CraftServer) Bukkit.getServer()).getHandle().moveToWorld(((CraftPlayer) player).getHandle(), + ((CraftWorld) player.getWorld()).getHandle().dimension, true, player.getLocation(), false); + } + @Override public void showDemoScreen(Player player) { sendPacket(player, new PacketPlayOutGameStateChange(5, 0.0F)); diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_11_R1.java index 6f8d2cb604..4c580d47e9 100644 --- a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_11_R1.java +++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_11_R1.java @@ -11,10 +11,12 @@ import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; import net.minecraft.server.v1_11_R1.*; +import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.block.banner.Pattern; import org.bukkit.craftbukkit.v1_11_R1.CraftEquipmentSlot; +import org.bukkit.craftbukkit.v1_11_R1.CraftServer; import org.bukkit.craftbukkit.v1_11_R1.CraftWorld; import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; @@ -46,6 +48,35 @@ public void setFieldOfView(Player player, float fov) { sendPacket(player, packet); } + @Override + public void respawn(Player player) { + ((CraftPlayer) player).getHandle().playerConnection.a(new PacketPlayInClientCommand(PacketPlayInClientCommand.EnumClientCommand.PERFORM_RESPAWN)); + } + + @Override + public void setVision(Player player, EntityType entityType) { + final EntityLiving entity; + if (entityType == EntityType.CREEPER) { + entity = new EntityCreeper(((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.SPIDER || entityType == EntityType.CAVE_SPIDER) { + entity = new EntitySpider(((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.ENDERMAN) { + entity = new EntityEnderman(((CraftWorld) player.getWorld()).getHandle()); + } + else { + return; + } + + // Spectating an entity then immediately respawning the player prevents a client shader update, + // allowing the player to retain whatever vision the mob they spectated had. + sendPacket(player, new PacketPlayOutSpawnEntityLiving(entity)); + sendPacket(player, new PacketPlayOutCamera(entity)); + ((CraftServer) Bukkit.getServer()).getHandle().moveToWorld(((CraftPlayer) player).getHandle(), + ((CraftWorld) player.getWorld()).getHandle().dimension, true, player.getLocation(), false); + } + @Override public void showDemoScreen(Player player) { sendPacket(player, new PacketPlayOutGameStateChange(5, 0.0F)); diff --git a/v1_12_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_12_R1.java b/v1_12_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_12_R1.java index 410a561021..1fbe2431fc 100644 --- a/v1_12_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_12_R1.java +++ b/v1_12_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_12_R1.java @@ -11,10 +11,12 @@ import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; import net.minecraft.server.v1_12_R1.*; +import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.block.banner.Pattern; import org.bukkit.craftbukkit.v1_12_R1.CraftEquipmentSlot; +import org.bukkit.craftbukkit.v1_12_R1.CraftServer; import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; @@ -46,6 +48,36 @@ public void setFieldOfView(Player player, float fov) { sendPacket(player, packet); } + @Override + public void respawn(Player player) { + ((CraftPlayer) player).getHandle().playerConnection.a( + new PacketPlayInClientCommand(PacketPlayInClientCommand.EnumClientCommand.PERFORM_RESPAWN)); + } + + @Override + public void setVision(Player player, EntityType entityType) { + final EntityLiving entity; + if (entityType == EntityType.CREEPER) { + entity = new EntityCreeper(((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.SPIDER || entityType == EntityType.CAVE_SPIDER) { + entity = new EntitySpider(((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.ENDERMAN) { + entity = new EntityEnderman(((CraftWorld) player.getWorld()).getHandle()); + } + else { + return; + } + + // Spectating an entity then immediately respawning the player prevents a client shader update, + // allowing the player to retain whatever vision the mob they spectated had. + sendPacket(player, new PacketPlayOutSpawnEntityLiving(entity)); + sendPacket(player, new PacketPlayOutCamera(entity)); + ((CraftServer) Bukkit.getServer()).getHandle().moveToWorld(((CraftPlayer) player).getHandle(), + ((CraftWorld) player.getWorld()).getHandle().dimension, true, player.getLocation(), false); + } + @Override public void showDemoScreen(Player player) { sendPacket(player, new PacketPlayOutGameStateChange(5, 0.0F)); diff --git a/v1_8_R3/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_8_R3.java b/v1_8_R3/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_8_R3.java index 540a8434d3..a3922f86e1 100644 --- a/v1_8_R3/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_8_R3.java +++ b/v1_8_R3/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_8_R3.java @@ -9,15 +9,18 @@ import net.aufdemrand.denizen.nms.util.jnbt.ListTag; import net.aufdemrand.denizen.nms.util.jnbt.Tag; import net.minecraft.server.v1_8_R3.*; +import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.block.banner.Pattern; import org.bukkit.craftbukkit.v1_8_R3.CraftEquipmentSlot; +import org.bukkit.craftbukkit.v1_8_R3.CraftServer; import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.EntityEquipment; @@ -45,6 +48,35 @@ public void setFieldOfView(Player player, float fov) { sendPacket(player, packet); } + @Override + public void respawn(Player player) { + ((CraftPlayer) player).getHandle().playerConnection.a(new PacketPlayInClientCommand(PacketPlayInClientCommand.EnumClientCommand.PERFORM_RESPAWN)); + } + + @Override + public void setVision(Player player, EntityType entityType) { + final EntityLiving entity; + if (entityType == EntityType.CREEPER) { + entity = new EntityCreeper(((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.SPIDER || entityType == EntityType.CAVE_SPIDER) { + entity = new EntitySpider(((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.ENDERMAN) { + entity = new EntityEnderman(((CraftWorld) player.getWorld()).getHandle()); + } + else { + return; + } + + // Spectating an entity then immediately respawning the player prevents a client shader update, + // allowing the player to retain whatever vision the mob they spectated had. + sendPacket(player, new PacketPlayOutSpawnEntityLiving(entity)); + sendPacket(player, new PacketPlayOutCamera(entity)); + ((CraftServer) Bukkit.getServer()).getHandle().moveToWorld(((CraftPlayer) player).getHandle(), + ((CraftWorld) player.getWorld()).getHandle().dimension, true, player.getLocation(), false); + } + @Override public void showDemoScreen(Player player) { sendPacket(player, new PacketPlayOutGameStateChange(5, 0.0F)); diff --git a/v1_9_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_9_R2.java b/v1_9_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_9_R2.java index 741dbb08c9..37ace7ebc0 100644 --- a/v1_9_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_9_R2.java +++ b/v1_9_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_9_R2.java @@ -11,15 +11,18 @@ import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; import net.minecraft.server.v1_9_R2.*; +import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.block.banner.Pattern; import org.bukkit.craftbukkit.v1_9_R2.CraftEquipmentSlot; +import org.bukkit.craftbukkit.v1_9_R2.CraftServer; import org.bukkit.craftbukkit.v1_9_R2.CraftWorld; import org.bukkit.craftbukkit.v1_9_R2.entity.CraftEntity; import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftItemStack; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.EntityEquipment; @@ -47,6 +50,35 @@ public void setFieldOfView(Player player, float fov) { sendPacket(player, packet); } + @Override + public void respawn(Player player) { + ((CraftPlayer) player).getHandle().playerConnection.a(new PacketPlayInClientCommand(PacketPlayInClientCommand.EnumClientCommand.PERFORM_RESPAWN)); + } + + @Override + public void setVision(Player player, EntityType entityType) { + final EntityLiving entity; + if (entityType == EntityType.CREEPER) { + entity = new EntityCreeper(((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.SPIDER || entityType == EntityType.CAVE_SPIDER) { + entity = new EntitySpider(((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.ENDERMAN) { + entity = new EntityEnderman(((CraftWorld) player.getWorld()).getHandle()); + } + else { + return; + } + + // Spectating an entity then immediately respawning the player prevents a client shader update, + // allowing the player to retain whatever vision the mob they spectated had. + sendPacket(player, new PacketPlayOutSpawnEntityLiving(entity)); + sendPacket(player, new PacketPlayOutCamera(entity)); + ((CraftServer) Bukkit.getServer()).getHandle().moveToWorld(((CraftPlayer) player).getHandle(), + ((CraftWorld) player.getWorld()).getHandle().dimension, true, player.getLocation(), false); + } + @Override public void showDemoScreen(Player player) { sendPacket(player, new PacketPlayOutGameStateChange(5, 0.0F));