summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMinenash <minenash@protonmail.com>2019-01-02 21:53:08 -0500
committerMinenash <minenash@protonmail.com>2019-01-02 21:53:08 -0500
commit1898429cdcd704a32916ea0cbbf6a66fb13b26c0 (patch)
tree67c21a3daa80fef61303af44edb3f39d24a4a090
parentb677e21b61d1c45b184d2c2da83d6bba28a9e43f (diff)
Added World Border Module. Prevents players from going so far.
-rw-r--r--src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd16
-rw-r--r--src/main/java/com/redstoner/modules/worldborder/WorldBorder.java196
-rw-r--r--src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java46
-rw-r--r--src/main/java/com/redstoner/modules/worldborder/module.info3
4 files changed, 261 insertions, 0 deletions
diff --git a/src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd
new file mode 100644
index 0000000..f8f981d
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd
@@ -0,0 +1,16 @@
+command worldborder {
+ alias wb;
+ perm utils.worldborder;
+ get [string:world] {
+ run getwb world;
+ help Gets the current info about the given world's worder.;
+ }
+ set [string:world] [int:cx] [int:cz] [int:r] {
+ run setwb world cx cz r;
+ help Sets the world border with the given center (cx,cz) and a given radius (r).;
+ }
+ remove [string:world] {
+ run remwb world;
+ help Removes the World Border from the given world.;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/worldborder/WorldBorder.java b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.java
new file mode 100644
index 0000000..15ad90f
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.java
@@ -0,0 +1,196 @@
+package com.redstoner.modules.worldborder;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.player.PlayerPortalEvent;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.event.vehicle.VehicleMoveEvent;
+import org.json.simple.JSONObject;
+
+import com.nemez.cmdmgr.Command;
+import com.redstoner.annotations.AutoRegisterListener;
+import com.redstoner.annotations.Commands;
+import com.redstoner.annotations.Version;
+import com.redstoner.misc.CommandHolderType;
+import com.redstoner.misc.JsonManager;
+import com.redstoner.misc.Main;
+import com.redstoner.modules.Module;
+
+import net.nemez.chatapi.ChatAPI;
+
+@AutoRegisterListener
+@Commands(CommandHolderType.File)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class WorldBorder implements Module, Listener {
+
+ Map<String, WorldBorderInfo> borderInfos = new HashMap<>();
+
+ @Command(hook = "getwb")
+ public void getWorldBorder(CommandSender sender, String world) {
+ if (Bukkit.getWorld(world) == null) {
+ getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist.");
+ return;
+ }
+
+ WorldBorderInfo info = borderInfos.get(world);
+ if (info == null)
+ getLogger().message(sender, true, "The world, &e" + world +"&7, hasn't been configured yet.");
+ else
+ getLogger().message(sender, "&e" + world + "&7's World Border is " + info.getMessage());
+ }
+
+ @Command(hook = "setwb")
+ public void setWorldBorder(CommandSender sender, String world, int cx, int cz, int r) {
+ if (Bukkit.getWorld(world) == null) {
+ getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist.");
+ return;
+ }
+
+ WorldBorderInfo info = new WorldBorderInfo(cx, cz, r);
+ borderInfos.put(world, info);
+ save();
+ getLogger().message(sender, "World Border for &e" + world + "&7 is now " + info.getMessage());
+ }
+
+ @Command(hook = "remwb")
+ public void removeWorldBorder(CommandSender sender, String world) {
+ if (Bukkit.getWorld(world) == null) {
+ getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist.");
+ return;
+ }
+
+ WorldBorderInfo info = borderInfos.remove(world);
+ if (info == null) {
+ getLogger().message(sender, true, "The world, &e" + world +"&7, hasn't been configured yet.");
+ return;
+ }
+ save();
+ getLogger().message(sender, "World Border for &e" + world + "&7 has been removed.");
+ }
+
+ @SuppressWarnings("unchecked")
+ private void save() {
+ File file = new File(Main.plugin.getDataFolder(), "WorldBorder.json");
+ JSONObject j = new JSONObject();
+
+ for(String world : borderInfos.keySet())
+ j.put(world, borderInfos.get(world).toJSONObject());
+ JsonManager.save(j, file);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void postEnable() {
+ File file = new File(Main.plugin.getDataFolder(), "WorldBorder.json");
+
+ if (!file.exists()) {
+ JSONObject j = new JSONObject();
+ j.put("placeholder", new WorldBorderInfo(0, 0, 0).toJSONObject());
+ JsonManager.save(j, file);
+ return;
+ }
+
+ JSONObject j = JsonManager.getObject(file);
+
+ if (j.get("placeholder") != null) {
+ j.remove("placeholder");
+ getLogger().warn("Detected placeholder in config, ignoring!");
+ }
+
+ for (Object o : j.keySet()) {
+ String world = (String) o;
+ WorldBorderInfo info = WorldBorderInfo.fromJSONObject((JSONObject) j.get(world));
+ borderInfos.put(world, info);
+ getLogger().info("Loaded world, " + world + ", with the boarder " + info.getMessage());
+ }
+ }
+
+
+ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent event) {
+
+ Location loc = event.getBlockPlaced().getLocation();
+ if (loc == null)
+ return;
+
+ World world = loc.getWorld();
+ if (world == null)
+ return;
+ WorldBorderInfo info = borderInfos.get(world.getName());
+ if (info == null)
+ return;
+
+ if (!info.isCordanateWithinBounds(loc.getBlockX(), loc.getBlockZ()))
+ event.setCancelled(true);
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
+ public void onVehicleMove(VehicleMoveEvent event) {
+ Location to = event.getTo();
+ WorldBorderInfo info = borderInfos.get(to.getWorld().getName());
+ if (!info.isCordanateWithinBounds(to.getBlockX(), to.getBlockZ()))
+ event.getVehicle().remove();
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
+ public void onPlayerMove(PlayerMoveEvent event) {
+ getLogger().info("PlayerMoveEvent");
+
+ Player p = event.getPlayer();
+
+ Location loc = getFinalLocation(p, event.getFrom(),
+ event.getTo(), "&cYou've Reached the WorldBorder!");
+ if (loc == null)
+ event.setCancelled(true);
+ else
+ event.setTo(loc);
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
+ public void onPlayerTeleport(PlayerTeleportEvent event) {
+ getLogger().info("PlayerTeleportEvent");
+ Location loc = getFinalLocation(event.getPlayer(), event.getFrom(),
+ event.getTo(), "&cYou've Teleported to an Invalid Location, returning!");
+ if (loc == null)
+ event.setCancelled(true);
+ else
+ event.setTo(loc);
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
+ public void onPlayerPortal(PlayerPortalEvent event) {
+ getLogger().info("PlayerPortalEvent");
+ Location loc = getFinalLocation(event.getPlayer(), event.getFrom(),
+ event.getTo(), "&cYou've Reached an Invalid Location, returning!");
+ if (loc == null)
+ event.setCancelled(true);
+ else
+ event.setTo(loc);
+ }
+
+
+ private Location getFinalLocation(Player p, Location from, Location to, String message) {
+ WorldBorderInfo info = borderInfos.get(to.getWorld().getName());
+
+ if (info == null || info.isCordanateWithinBounds(to.getBlockX(), to.getBlockZ()))
+ return to;
+ else {
+ System.out.println(p.isInsideVehicle());
+ if (p.isInsideVehicle())
+ p.getVehicle().remove();
+ ChatAPI.sendActionBar(p, message);
+ return from;
+ }
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java b/src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java
new file mode 100644
index 0000000..7ff4430
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java
@@ -0,0 +1,46 @@
+package com.redstoner.modules.worldborder;
+
+import org.json.simple.JSONObject;
+
+public class WorldBorderInfo {
+
+ private final String message;
+ private final int cx, cz, r;
+ private final int maxX, minX, maxZ, minZ;
+
+ public WorldBorderInfo(int cx, int cz, int r) {
+ this.cx = cx;
+ this.cz = cz;
+ this.r = r;
+ this.maxX = cx + r;
+ this.minX = cx - r;
+ this.maxZ = cz + r;
+ this.minZ = cz - r;
+ this.message = "&7centered at &e(" + cx + "," + cz + ")&7 with a radius of &e" + r + "&7.";
+ }
+
+ public boolean isCordanateWithinBounds(int x, int z) {
+ return x > minX && x < maxX && z > minZ && z < maxZ;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ @SuppressWarnings("unchecked")
+ public JSONObject toJSONObject() {
+ JSONObject j = new JSONObject();
+
+ j.put("cx", cx);
+ j.put("cz", cz);
+ j.put("r", r);
+
+ return j;
+ }
+
+ public static WorldBorderInfo fromJSONObject(JSONObject j) {
+ return new WorldBorderInfo(((Long)j.get("cx")).intValue(),
+ ((Long)j.get("cz")).intValue(), ((Long)j.get("r")).intValue());
+ }
+
+}
diff --git a/src/main/java/com/redstoner/modules/worldborder/module.info b/src/main/java/com/redstoner/modules/worldborder/module.info
new file mode 100644
index 0000000..707e522
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/worldborder/module.info
@@ -0,0 +1,3 @@
+displayName: WorldBorder
+category: Other
+description: prevents player from going too far, and prevents blocks from being placed there \ No newline at end of file