From 4d77d514fdcd6929503f042198f0dc3640c63bdc Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Thu, 19 May 2022 16:11:45 -0500 Subject: [PATCH] Begin work on toggles --- server/src/main/java/dev/plex/Plex.java | 3 + .../java/dev/plex/command/impl/ToggleCMD.java | 67 +++++++++ .../dev/plex/command/impl/ToggleDropsCMD.java | 26 ---- .../dev/plex/listener/impl/DropListener.java | 2 +- .../{SpawnListener.java => MobListener.java} | 2 +- .../plex/listener/impl/TogglesListener.java | 37 +++++ .../main/java/dev/plex/menu/ToggleMenu.java | 128 ++++++++++++++++++ server/src/main/resources/config.yml | 3 - server/src/main/resources/messages.yml | 2 - server/src/main/resources/toggles.yml | 10 ++ 10 files changed, 247 insertions(+), 33 deletions(-) create mode 100644 server/src/main/java/dev/plex/command/impl/ToggleCMD.java delete mode 100644 server/src/main/java/dev/plex/command/impl/ToggleDropsCMD.java rename server/src/main/java/dev/plex/listener/impl/{SpawnListener.java => MobListener.java} (99%) create mode 100644 server/src/main/java/dev/plex/listener/impl/TogglesListener.java create mode 100644 server/src/main/java/dev/plex/menu/ToggleMenu.java create mode 100644 server/src/main/resources/toggles.yml diff --git a/server/src/main/java/dev/plex/Plex.java b/server/src/main/java/dev/plex/Plex.java index 2fe3f10..6f68f02 100644 --- a/server/src/main/java/dev/plex/Plex.java +++ b/server/src/main/java/dev/plex/Plex.java @@ -50,6 +50,7 @@ public class Plex extends PlexPlugin implements PlexApiProvider public Config messages; public Config indefBans; public Config commands; + public Config toggles; private PlexProvider provider; @@ -95,6 +96,7 @@ public class Plex extends PlexPlugin implements PlexApiProvider messages = new Config(this, "messages.yml"); indefBans = new Config(this, "indefbans.yml"); commands = new Config(this, "commands.yml"); + toggles = new Config(this, "toggles.yml"); build.load(this); modulesFolder = new File(this.getDataFolder() + File.separator + "modules"); @@ -116,6 +118,7 @@ public class Plex extends PlexPlugin implements PlexApiProvider { config.load(); messages.load(); + toggles.load(); // Don't add default entries to indefinite ban file indefBans.load(false); diff --git a/server/src/main/java/dev/plex/command/impl/ToggleCMD.java b/server/src/main/java/dev/plex/command/impl/ToggleCMD.java new file mode 100644 index 0000000..66bb98c --- /dev/null +++ b/server/src/main/java/dev/plex/command/impl/ToggleCMD.java @@ -0,0 +1,67 @@ +package dev.plex.command.impl; + +import com.google.common.collect.ImmutableList; +import dev.plex.command.PlexCommand; +import dev.plex.command.annotation.CommandParameters; +import dev.plex.command.annotation.CommandPermissions; +import dev.plex.command.source.RequiredCommandSource; +import dev.plex.menu.ToggleMenu; +import dev.plex.rank.enums.Rank; +import dev.plex.util.PlexUtils; +import java.util.List; +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@CommandParameters(name = "toggle", usage = "/", description = "Allows toggling various server aspects through a GUI") +@CommandPermissions(level = Rank.ADMIN, permission = "plex.toggle", source = RequiredCommandSource.ANY) +public class ToggleCMD extends PlexCommand +{ + @Override + protected Component execute(@NotNull CommandSender sender, @Nullable Player playerSender, String[] args) + { + if (isConsole(sender) || playerSender == null) + { + sender.sendMessage(PlexUtils.mmDeserialize("Available toggles:")); + sender.sendMessage(PlexUtils.mmDeserialize(" - Explosions " + status("explosions"))); + sender.sendMessage(PlexUtils.mmDeserialize(" - Fluidspread " + status("fluidspread"))); + sender.sendMessage(PlexUtils.mmDeserialize(" - Drops " + status("drops"))); + switch (args[0].toLowerCase()) + { + case "explosions": + { + toggle("explosions"); + } + case "fluidspread": + { + toggle("fluidspread"); + } + case "drops": + { + toggle("drops"); + } + } + return null; + } + new ToggleMenu().openInv(playerSender, 0); + return null; + } + + @Override + public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException + { + return args.length == 1 ? PlexUtils.getPlayerNameList() : ImmutableList.of(); + } + + private String status(String toggle) + { + return plugin.toggles.getBoolean(toggle) ? "(enabled)" : "(disabled)"; + } + + private void toggle(String toggle) + { + plugin.toggles.set(toggle, !plugin.getToggles().getBoolean(toggle)); + } +} diff --git a/server/src/main/java/dev/plex/command/impl/ToggleDropsCMD.java b/server/src/main/java/dev/plex/command/impl/ToggleDropsCMD.java deleted file mode 100644 index 67e51f2..0000000 --- a/server/src/main/java/dev/plex/command/impl/ToggleDropsCMD.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.plex.command.impl; - -import dev.plex.command.PlexCommand; -import dev.plex.command.annotation.CommandParameters; -import dev.plex.command.annotation.CommandPermissions; -import dev.plex.command.source.RequiredCommandSource; -import dev.plex.rank.enums.Rank; -import net.kyori.adventure.text.Component; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -@CommandPermissions(level = Rank.ADMIN, permission = "plex.toggledrops", source = RequiredCommandSource.ANY) -@CommandParameters(name = "toggledrops", description = "Toggle immediately removing drops.", usage = "/", aliases = "td") -public class ToggleDropsCMD extends PlexCommand -{ - @Override - protected Component execute(@NotNull CommandSender sender, @Nullable Player playerSender, @NotNull String[] args) - { - plugin.config.set("allowdrops", !plugin.config.getBoolean("allowdrops")); - plugin.config.save(); - send(sender, plugin.config.getBoolean("allowdrops") ? messageComponent("allowDropsEnabled") : messageComponent("allowDropsDisabled")); - return null; - } -} \ No newline at end of file diff --git a/server/src/main/java/dev/plex/listener/impl/DropListener.java b/server/src/main/java/dev/plex/listener/impl/DropListener.java index 732fb65..bb9a49d 100644 --- a/server/src/main/java/dev/plex/listener/impl/DropListener.java +++ b/server/src/main/java/dev/plex/listener/impl/DropListener.java @@ -9,7 +9,7 @@ public class DropListener extends PlexListener @EventHandler public void onPlayerDropItem(PlayerDropItemEvent event) { - if (!plugin.config.getBoolean("allowdrops")) + if (!plugin.toggles.getBoolean("drops")) { event.setCancelled(true); } diff --git a/server/src/main/java/dev/plex/listener/impl/SpawnListener.java b/server/src/main/java/dev/plex/listener/impl/MobListener.java similarity index 99% rename from server/src/main/java/dev/plex/listener/impl/SpawnListener.java rename to server/src/main/java/dev/plex/listener/impl/MobListener.java index eb19014..f452a3c 100644 --- a/server/src/main/java/dev/plex/listener/impl/SpawnListener.java +++ b/server/src/main/java/dev/plex/listener/impl/MobListener.java @@ -24,7 +24,7 @@ import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; -public class SpawnListener extends PlexListener +public class MobListener extends PlexListener { private static final List SPAWN_EGGS = Arrays.stream(Material.values()).filter((mat) -> mat.name().endsWith("_SPAWN_EGG")).toList(); diff --git a/server/src/main/java/dev/plex/listener/impl/TogglesListener.java b/server/src/main/java/dev/plex/listener/impl/TogglesListener.java new file mode 100644 index 0000000..b212336 --- /dev/null +++ b/server/src/main/java/dev/plex/listener/impl/TogglesListener.java @@ -0,0 +1,37 @@ +package dev.plex.listener.impl; + +import dev.plex.listener.PlexListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.player.PlayerDropItemEvent; + +public class TogglesListener extends PlexListener +{ + @EventHandler + public void onEntityExplode(ExplosionPrimeEvent event) + { + if (!plugin.toggles.getBoolean("explosions")) + { + event.setCancelled(true); + } + } + + @EventHandler + public void onFluidSpread(BlockFromToEvent event) + { + if (!plugin.toggles.getBoolean("fluidspread")) + { + event.setCancelled(true); + } + } + + @EventHandler + public void onFluidSpread(PlayerDropItemEvent event) + { + if (!plugin.toggles.getBoolean("drops")) + { + event.setCancelled(true); + } + } +} diff --git a/server/src/main/java/dev/plex/menu/ToggleMenu.java b/server/src/main/java/dev/plex/menu/ToggleMenu.java new file mode 100644 index 0000000..b6d23b4 --- /dev/null +++ b/server/src/main/java/dev/plex/menu/ToggleMenu.java @@ -0,0 +1,128 @@ +package dev.plex.menu; + +import com.google.common.collect.Lists; +import dev.plex.PlexBase; +import dev.plex.util.PlexUtils; +import dev.plex.util.menu.AbstractMenu; +import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class ToggleMenu extends AbstractMenu implements PlexBase +{ + private final List inventories = Lists.newArrayList(); + + public ToggleMenu() + { + super("§a§lToggles"); + Inventory inventory = Bukkit.createInventory(null, 54, PlexUtils.mmDeserialize("Toggles")); + resetExplosionItem(inventory); + resetFluidspreadItem(inventory); + resetDropsItem(inventory); + inventories.add(inventory); + } + + public void openInv(Player player, int index) + { + player.openInventory(inventories.get(index)); + } + + @EventHandler + public void onClick(InventoryClickEvent event) + { + if (event.getClickedInventory() == null) + { + return; + } + Inventory inv = event.getClickedInventory(); + if (!isValidInventory(inv)) + { + return; + } + if (event.getCurrentItem() == null) + { + return; + } + if (!event.getCurrentItem().hasItemMeta()) + { + return; + } + if (!event.getCurrentItem().getItemMeta().hasDisplayName()) + { + return; + } + ItemStack item = event.getCurrentItem(); + event.setCancelled(true); + if (item.getType() == Material.TNT) + { + plugin.toggles.set("explosions", !plugin.toggles.getBoolean("explosions")); + resetExplosionItem(inv); + event.getWhoClicked().sendMessage(PlexUtils.mmDeserialize("Toggled explosions.")); + } + if (item.getType() == Material.WATER_BUCKET) + { + plugin.toggles.set("fluidspread", !plugin.toggles.getBoolean("fluidspread")); + resetFluidspreadItem(inv); + event.getWhoClicked().sendMessage(PlexUtils.mmDeserialize("Toggled fluid spread.")); + } + if (item.getType() == Material.FEATHER) + { + plugin.toggles.set("drops", !plugin.toggles.getBoolean("drops")); + resetDropsItem(inv); + event.getWhoClicked().sendMessage(PlexUtils.mmDeserialize("Toggled drops.")); + } + } + + public int getCurrentInventoryIndex(Inventory inventory) + { + for (int i = 0; i <= inventories.size() - 1; i++) + { + if (inventories.get(i).hashCode() == inventory.hashCode()) + { + return i; + } + } + return 0; + } + + private boolean isValidInventory(Inventory inventory) + { + return inventories.contains(inventory); + } + + private void resetExplosionItem(Inventory inventory) + { + ItemStack explosions = new ItemStack(Material.TNT); + ItemMeta explosionsItemMeta = explosions.getItemMeta(); + explosionsItemMeta.displayName(PlexUtils.mmDeserialize("Toggle explosions")); + explosionsItemMeta.lore(List.of(PlexUtils.mmDeserialize("Explosions are " + (plugin.toggles.getBoolean("explosions") ? "enabled" : "disabled")))); + explosions.setItemMeta(explosionsItemMeta); + inventory.setItem(0, explosions); + } + + private void resetFluidspreadItem(Inventory inventory) + { + ItemStack water = new ItemStack(Material.WATER_BUCKET); + ItemMeta waterItemMeta = water.getItemMeta(); + waterItemMeta.displayName(PlexUtils.mmDeserialize("Toggle fluid spread")); + waterItemMeta.lore(List.of(PlexUtils.mmDeserialize("Fluid spread is " + (plugin.toggles.getBoolean("fluidspread") ? "enabled" : "disabled")))); + water.setItemMeta(waterItemMeta); + inventory.setItem(1, water); + } + + private void resetDropsItem(Inventory inventory) + { + ItemStack feather = new ItemStack(Material.FEATHER); + ItemMeta featherItemMeta = feather.getItemMeta(); + featherItemMeta.displayName(PlexUtils.mmDeserialize("Toggle drops")); + featherItemMeta.lore(List.of(PlexUtils.mmDeserialize("Drops are " + (plugin.toggles.getBoolean("drops") ? "enabled" : "disabled")))); + feather.setItemMeta(featherItemMeta); + inventory.setItem(2, feather); + } +} diff --git a/server/src/main/resources/config.yml b/server/src/main/resources/config.yml index d0ade40..62f68f8 100644 --- a/server/src/main/resources/config.yml +++ b/server/src/main/resources/config.yml @@ -137,9 +137,6 @@ autowipe: entities: - "DROPPED_ITEM" -# Should we allow drops from players? -allowdrops: true - # What blocks should be blocked? blocked_blocks: - "SPAWNER" diff --git a/server/src/main/resources/messages.yml b/server/src/main/resources/messages.yml index 6d017ab..2130c8d 100644 --- a/server/src/main/resources/messages.yml +++ b/server/src/main/resources/messages.yml @@ -165,8 +165,6 @@ noRemovedEntities: "No entities were removed." # 1 - Number of mobs removed removedMobs: "{0} - Removed {1} mobs" autoWipeDisabled: "Item wiping is currently disabled in the config!" -allowDropsDisabled: "No longer allowing drops from players." -allowDropsEnabled: "Now allowing drops from players." commandBlocked: "That command is blocked." # 0 - The command sender # 1 - The message being said diff --git a/server/src/main/resources/toggles.yml b/server/src/main/resources/toggles.yml new file mode 100644 index 0000000..89ddf1f --- /dev/null +++ b/server/src/main/resources/toggles.yml @@ -0,0 +1,10 @@ +# Plex Toggles + +# Should explosions be enabled? +explosions: false + +# Should fluid spread be enabled? +fluidspread: true + +# Should drops be enabled? +drops: true \ No newline at end of file