From 225f527b93095af00984a8fd12595c9041f46343 Mon Sep 17 00:00:00 2001 From: Mergu Date: Sat, 10 Nov 2018 18:10:20 -0500 Subject: [PATCH] Implement client-side world borders --- .../denizen/nms/interfaces/PacketHelper.java | 4 ++ .../commands/BukkitCommandRegistry.java | 10 ++-- .../commands/world/WorldBorderCommand.java | 51 +++++++++++++++++-- .../nms/helpers/PacketHelper_v1_10_R1.java | 25 +++++++++ .../nms/helpers/PacketHelper_v1_11_R1.java | 25 +++++++++ .../nms/helpers/PacketHelper_v1_12_R1.java | 25 +++++++++ .../nms/helpers/PacketHelper_v1_13_R2.java | 26 +++++++++- .../nms/helpers/PacketHelper_v1_8_R3.java | 25 +++++++++ .../nms/helpers/PacketHelper_v1_9_R2.java | 25 +++++++++ 9 files changed, 209 insertions(+), 7 deletions(-) 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 65ba7a792f..330023413b 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 @@ -15,6 +15,10 @@ public interface PacketHelper { + void resetWorldBorder(Player player); + + void setWorldBorder(Player player, Location center, double size, double currSize, long time, int warningDistance, int warningTime); + void setSlot(Player player, int slot, ItemStack itemStack, boolean playerOnly); void setFieldOfView(Player player, float fov); diff --git a/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java b/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java index 95b72080c1..08763d906c 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java @@ -4410,7 +4410,7 @@ public void registerCoreMembers() { // <--[command] // @Name WorldBorder - // @Syntax worldborder [] (center:) (size:<#.#>) (damage:<#.#>) (damagebuffer:<#.#>) (warningdistance:<#>) (warningtime:) (duration:) (reset) + // @Syntax worldborder [/|...] (center:) (size:<#.#>) (curr_size:<#.#>) (damage:<#.#>) (damagebuffer:<#.#>) (warningdistance:<#>) (warningtime:) (duration:) (reset) // @Required 2 // @Stable stable // @Short Modifies a world border. @@ -4418,7 +4418,7 @@ public void registerCoreMembers() { // @Group world // // @Description - // Modifies the world border of a specified world. + // Modifies the world border of a specified world or a list of players. // Optionally, you can specify a duration with the size to change // the size over the course of the duration. // @@ -4438,9 +4438,13 @@ public void registerCoreMembers() { // @Usage // Use to update a world border's center, and then the size over the course of 10 seconds. // - worldborder center: size:100 duration:10s + // + // @Usage + // Use to show a client-side world border to the attached player. + // - worldborder center: size:10 // --> registerCoreMember(WorldBorderCommand.class, - "WORLDBORDER", "worldborder [] (center:) (size:<#.#>) (damage:<#.#>) (damagebuffer:<#.#>) (warningdistance:<#>) (warningtime:) (duration:)", 2); + "WORLDBORDER", "worldborder [/|...] (center:) (size:<#.#>) (curr_size:<#.#>) (damage:<#.#>) (damagebuffer:<#.#>) (warningdistance:<#>) (warningtime:) (duration:) (reset)", 2); // <--[command] diff --git a/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/world/WorldBorderCommand.java b/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/world/WorldBorderCommand.java index 6514e60c5e..ea462a82fe 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/world/WorldBorderCommand.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/world/WorldBorderCommand.java @@ -1,6 +1,8 @@ package net.aufdemrand.denizen.scripts.commands.world; +import net.aufdemrand.denizen.nms.NMSHandler; import net.aufdemrand.denizen.objects.dLocation; +import net.aufdemrand.denizen.objects.dPlayer; import net.aufdemrand.denizen.objects.dWorld; import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizencore.exceptions.CommandExecutionException; @@ -8,10 +10,13 @@ import net.aufdemrand.denizencore.objects.Duration; import net.aufdemrand.denizencore.objects.Element; import net.aufdemrand.denizencore.objects.aH; +import net.aufdemrand.denizencore.objects.dList; import net.aufdemrand.denizencore.scripts.ScriptEntry; import net.aufdemrand.denizencore.scripts.commands.AbstractCommand; import org.bukkit.WorldBorder; +import java.util.List; + public class WorldBorderCommand extends AbstractCommand { @Override @@ -39,6 +44,11 @@ else if (!scriptEntry.hasObject("size") && arg.matchesPrefix("size")) { scriptEntry.addObject("size", arg.asElement()); } + else if (!scriptEntry.hasObject("curr_size") + && arg.matchesPrimitive(aH.PrimitiveType.Double) + && arg.matchesPrefix("curr_size")) { + scriptEntry.addObject("curr_size", arg.asElement()); + } else if (!scriptEntry.hasObject("duration") && arg.matchesArgumentType(Duration.class) && arg.matchesPrefix("duration")) { @@ -58,6 +68,10 @@ else if (!scriptEntry.hasObject("world") && arg.matchesArgumentType(dWorld.class)) { scriptEntry.addObject("world", arg.asType(dWorld.class)); } + else if (!scriptEntry.hasObject("players") + && arg.matchesArgumentList(dPlayer.class)) { + scriptEntry.addObject("players", arg.asType(dList.class).filter(dPlayer.class)); + } else if (!scriptEntry.hasObject("reset") && arg.matches("reset")) { scriptEntry.addObject("reset", new Element("true")); @@ -69,8 +83,8 @@ else if (!scriptEntry.hasObject("reset") // Check to make sure required arguments have been filled - if (!scriptEntry.hasObject("world")) { - throw new InvalidArgumentsException("Must specify a world!"); + if (!scriptEntry.hasObject("world") && !scriptEntry.hasObject("players") ) { + throw new InvalidArgumentsException("Must specify a world or players!"); } if (!scriptEntry.hasObject("center") && !scriptEntry.hasObject("size") @@ -90,8 +104,10 @@ else if (!scriptEntry.hasObject("reset") public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { dWorld world = (dWorld) scriptEntry.getObject("world"); + List players = (List) scriptEntry.getObject("players"); dLocation center = (dLocation) scriptEntry.getObject("center"); Element size = scriptEntry.getElement("size"); + Element currSize = scriptEntry.getElement("curr_size"); Element damage = scriptEntry.getElement("damage"); Element damagebuffer = scriptEntry.getElement("damagebuffer"); Duration duration = scriptEntry.getdObject("duration"); @@ -101,9 +117,11 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { if (scriptEntry.dbCallShouldDebug()) { - dB.report(scriptEntry, getName(), world.debug() + dB.report(scriptEntry, getName(), (world != null ? world.debug() : "") + + (players != null ? aH.debugList("Player(s)", players) : "") + (center != null ? center.debug() : "") + (size != null ? size.debug() : "") + + (currSize != null ? currSize.debug() : "") + (damage != null ? damage.debug() : "") + (damagebuffer != null ? damagebuffer.debug() : "") + (warningdistance != null ? warningdistance.debug() : "") @@ -112,6 +130,30 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { } + // Handle client-side world borders + if (players != null) { + if (reset.asBoolean()) { + for (dPlayer player : players) { + NMSHandler.getInstance().getPacketHelper().resetWorldBorder(player.getPlayerEntity()); + } + return; + } + + WorldBorder wb; + for (dPlayer player : players) { + wb = player.getWorld().getWorldBorder(); + NMSHandler.getInstance().getPacketHelper().setWorldBorder( + player.getPlayerEntity(), + (center != null ? center : wb.getCenter()), + (size != null ? size.asDouble() : wb.getSize()), + (currSize != null ? currSize.asDouble() : wb.getSize()), + duration.getMillis(), + (warningdistance != null ? warningdistance.asInt() : wb.getWarningDistance()), + (warningtime != null ? warningtime.getSecondsAsInt() : wb.getWarningTime())); + } + return; + } + WorldBorder worldborder = world.getWorld().getWorldBorder(); if (reset.asBoolean()) { @@ -124,6 +166,9 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { } if (size != null) { + if (currSize != null) { + worldborder.setSize(currSize.asDouble()); + } worldborder.setSize(size.asDouble(), duration.getSecondsAsInt()); } 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 05ea13c91c..4d584728f7 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 @@ -33,6 +33,31 @@ public class PacketHelper_v1_10_R1 implements PacketHelper { + @Override + public void resetWorldBorder(Player player) { + WorldBorder wb = ((CraftWorld) player.getWorld()).getHandle().getWorldBorder(); + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + + @Override + public void setWorldBorder(Player player, Location center, double size, double currSize, long time, int warningDistance, int warningTime) { + WorldBorder wb = new WorldBorder(); + + wb.world = ((CraftWorld) player.getWorld()).getHandle(); + wb.setCenter(center.getX(), center.getZ()); + wb.setWarningDistance(warningDistance); + wb.setWarningTime(warningTime); + + if (time > 0) { + wb.transitionSizeBetween(currSize, size, time); + } + else { + wb.setSize(size); + } + + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + @Override public void setSlot(Player player, int slot, ItemStack itemStack, boolean playerOnly) { int windowId = playerOnly ? 0 : ((CraftPlayer) player).getHandle().activeContainer.windowId; 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 4c580d47e9..bc05fad7f8 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 @@ -33,6 +33,31 @@ public class PacketHelper_v1_11_R1 implements PacketHelper { + @Override + public void resetWorldBorder(Player player) { + WorldBorder wb = ((CraftWorld) player.getWorld()).getHandle().getWorldBorder(); + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + + @Override + public void setWorldBorder(Player player, Location center, double size, double currSize, long time, int warningDistance, int warningTime) { + WorldBorder wb = new WorldBorder(); + + wb.world = ((CraftWorld) player.getWorld()).getHandle(); + wb.setCenter(center.getX(), center.getZ()); + wb.setWarningDistance(warningDistance); + wb.setWarningTime(warningTime); + + if (time > 0) { + wb.transitionSizeBetween(currSize, size, time); + } + else { + wb.setSize(size); + } + + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + @Override public void setSlot(Player player, int slot, ItemStack itemStack, boolean playerOnly) { int windowId = playerOnly ? 0 : ((CraftPlayer) player).getHandle().activeContainer.windowId; 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 1fbe2431fc..9ca664ac3f 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 @@ -33,6 +33,31 @@ public class PacketHelper_v1_12_R1 implements PacketHelper { + @Override + public void resetWorldBorder(Player player) { + WorldBorder wb = ((CraftWorld) player.getWorld()).getHandle().getWorldBorder(); + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + + @Override + public void setWorldBorder(Player player, Location center, double size, double currSize, long time, int warningDistance, int warningTime) { + WorldBorder wb = new WorldBorder(); + + wb.world = ((CraftWorld) player.getWorld()).getHandle(); + wb.setCenter(center.getX(), center.getZ()); + wb.setWarningDistance(warningDistance); + wb.setWarningTime(warningTime); + + if (time > 0) { + wb.transitionSizeBetween(currSize, size, time); + } + else { + wb.setSize(size); + } + + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + @Override public void setSlot(Player player, int slot, ItemStack itemStack, boolean playerOnly) { int windowId = playerOnly ? 0 : ((CraftPlayer) player).getHandle().activeContainer.windowId; diff --git a/v1_13_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_13_R2.java b/v1_13_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_13_R2.java index 50b034e343..1ed0c31533 100644 --- a/v1_13_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_13_R2.java +++ b/v1_13_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_13_R2.java @@ -4,7 +4,6 @@ import net.aufdemrand.denizen.nms.NMSHandler; import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_13_R2; import net.aufdemrand.denizen.nms.interfaces.PacketHelper; -import net.aufdemrand.denizen.nms.util.ReflectionHelper; import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag; import net.aufdemrand.denizen.nms.util.jnbt.ListTag; import net.aufdemrand.denizen.nms.util.jnbt.Tag; @@ -35,6 +34,31 @@ public class PacketHelper_v1_13_R2 implements PacketHelper { + @Override + public void resetWorldBorder(Player player) { + WorldBorder wb = ((CraftWorld) player.getWorld()).getHandle().getWorldBorder(); + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + + @Override + public void setWorldBorder(Player player, Location center, double size, double currSize, long time, int warningDistance, int warningTime) { + WorldBorder wb = new WorldBorder(); + + wb.world = ((CraftWorld) player.getWorld()).getHandle(); + wb.setCenter(center.getX(), center.getZ()); + wb.setWarningDistance(warningDistance); + wb.setWarningTime(warningTime); + + if (time > 0) { + wb.transitionSizeBetween(currSize, size, time); + } + else { + wb.setSize(size); + } + + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + @Override public void setSlot(Player player, int slot, ItemStack itemStack, boolean playerOnly) { int windowId = playerOnly ? 0 : ((CraftPlayer) player).getHandle().activeContainer.windowId; 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 a3922f86e1..d5db37e2e5 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 @@ -33,6 +33,31 @@ public class PacketHelper_v1_8_R3 implements PacketHelper { + @Override + public void resetWorldBorder(Player player) { + WorldBorder wb = ((CraftWorld) player.getWorld()).getHandle().getWorldBorder(); + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + + @Override + public void setWorldBorder(Player player, Location center, double size, double currSize, long time, int warningDistance, int warningTime) { + WorldBorder wb = new WorldBorder(); + + wb.world = ((CraftWorld) player.getWorld()).getHandle(); + wb.setCenter(center.getX(), center.getZ()); + wb.setWarningDistance(warningDistance); + wb.setWarningTime(warningTime); + + if (time > 0) { + wb.transitionSizeBetween(currSize, size, time); + } + else { + wb.setSize(size); + } + + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + @Override public void setSlot(Player player, int slot, ItemStack itemStack, boolean playerOnly) { int windowId = playerOnly ? 0 : ((CraftPlayer) player).getHandle().activeContainer.windowId; 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 37ace7ebc0..820c01ccfd 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 @@ -35,6 +35,31 @@ public class PacketHelper_v1_9_R2 implements PacketHelper { + @Override + public void resetWorldBorder(Player player) { + WorldBorder wb = ((CraftWorld) player.getWorld()).getHandle().getWorldBorder(); + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + + @Override + public void setWorldBorder(Player player, Location center, double size, double currSize, long time, int warningDistance, int warningTime) { + WorldBorder wb = new WorldBorder(); + + wb.world = ((CraftWorld) player.getWorld()).getHandle(); + wb.setCenter(center.getX(), center.getZ()); + wb.setWarningDistance(warningDistance); + wb.setWarningTime(warningTime); + + if (time > 0) { + wb.transitionSizeBetween(currSize, size, time); + } + else { + wb.setSize(size); + } + + sendPacket(player, new PacketPlayOutWorldBorder(wb, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } + @Override public void setSlot(Player player, int slot, ItemStack itemStack, boolean playerOnly) { int windowId = playerOnly ? 0 : ((CraftPlayer) player).getHandle().activeContainer.windowId;