From ebf030b1928f794aed2969f61f487161268accee Mon Sep 17 00:00:00 2001 From: Big Pappa Date: Sun, 14 Jun 2026 15:54:33 -0500 Subject: [PATCH] Per-world Creeper settings complete - Added per-world Block Damage settings - Added per-world Entity Damage settings - Added creeper_settings database support - Added world-specific Creeper menus - Added automatic world registration/default inheritance - Split Creeper listeners - Updated Creeper behavior to use world settings - Removed obsolete global Creeper indicators - Adopted logger-based error reporting standard --- .../serveradmin/RSServerAdmin.java | 45 ++- .../creeper/CreeperSettingsDAO.java | 213 ++++++++++ .../serveradmin/database/DatabaseManager.java | 10 + .../gui/CreeperBlockDamageMenu.java | 270 +++++++++++++ .../gui/CreeperEntityDamageMenu.java | 270 +++++++++++++ .../serveradmin/gui/CreeperMenu.java | 16 - .../serveradmin/gui/KeepInventoryMenu.java | 72 +++- .../serveradmin/gui/MenuLayoutUtils.java | 70 ++++ ...r.java => CreeperBlockDamageListener.java} | 24 +- .../CreeperEntityDamageListener.java | 26 +- .../listeners/InventoryListener.java | 369 ++++++++++++++++-- .../listeners/WorldLoadListener.java | 19 + 12 files changed, 1318 insertions(+), 86 deletions(-) create mode 100644 src/main/java/com/rsscripting/serveradmin/creeper/CreeperSettingsDAO.java create mode 100644 src/main/java/com/rsscripting/serveradmin/gui/CreeperBlockDamageMenu.java create mode 100644 src/main/java/com/rsscripting/serveradmin/gui/CreeperEntityDamageMenu.java create mode 100644 src/main/java/com/rsscripting/serveradmin/gui/MenuLayoutUtils.java rename src/main/java/com/rsscripting/serveradmin/listeners/{CreeperListener.java => CreeperBlockDamageListener.java} (52%) diff --git a/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java b/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java index d5133c8..b658000 100644 --- a/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java +++ b/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java @@ -4,12 +4,13 @@ import com.rsscripting.serveradmin.database.DatabaseManager; import com.rsscripting.serveradmin.database.SettingsDAO; import com.rsscripting.serveradmin.commands.RSAdminCommand; import com.rsscripting.serveradmin.keepinventory.KeepInventoryDAO; -import com.rsscripting.serveradmin.listeners.CreeperListener; +import com.rsscripting.serveradmin.listeners.CreeperBlockDamageListener; import com.rsscripting.serveradmin.security.SecurityManager; import com.rsscripting.serveradmin.listeners.InventoryListener; import com.rsscripting.serveradmin.listeners.CreeperEntityDamageListener; import com.rsscripting.serveradmin.update.GitHubUpdateChecker; import com.rsscripting.serveradmin.listeners.WorldLoadListener; +import com.rsscripting.serveradmin.creeper.CreeperSettingsDAO; import com.rsscripting.serveradmin.settings.SettingKey; import com.rsscripting.serveradmin.worlds.WorldsDAO; @@ -27,6 +28,7 @@ public class RSServerAdmin extends JavaPlugin { private SettingsDAO settingsDAO; private SecurityManager securityManager; private WorldsDAO worldsDAO; + private CreeperSettingsDAO creeperSettingsDAO; @Override public void onEnable() { @@ -41,13 +43,24 @@ public class RSServerAdmin extends JavaPlugin { databaseManager.connect(); - settingsDAO = new SettingsDAO(databaseManager); + settingsDAO = new SettingsDAO( + databaseManager + ); settingsDAO.initializeDefaults(); - keepInventoryDAO = new KeepInventoryDAO(databaseManager); + keepInventoryDAO = new KeepInventoryDAO( + databaseManager + ); - worldsDAO = new WorldsDAO(databaseManager); + worldsDAO = new WorldsDAO( + databaseManager + ); + + creeperSettingsDAO = + new CreeperSettingsDAO( + databaseManager + ); securityManager = new SecurityManager(this); @@ -67,6 +80,22 @@ public class RSServerAdmin extends JavaPlugin { keepInventoryDefault ); + boolean blockDamageDefault = + settingsDAO.getDefault( + SettingKey.CREEPER_BLOCK_DAMAGE + ); + + boolean entityDamageDefault = + settingsDAO.getDefault( + SettingKey.CREEPER_ENTITY_DAMAGE + ); + + creeperSettingsDAO.ensureWorldExists( + world.getName(), + blockDamageDefault, + entityDamageDefault + ); + } if (getCommand("rsadmin") != null) { @@ -89,7 +118,7 @@ public class RSServerAdmin extends JavaPlugin { ); getServer().getPluginManager().registerEvents( - new CreeperListener(), + new CreeperBlockDamageListener(), this ); @@ -149,10 +178,14 @@ public class RSServerAdmin extends JavaPlugin { return settingsDAO; } public WorldsDAO getWorldsDAO() { - return worldsDAO;} + return worldsDAO; + } public SecurityManager getSecurityManager() { return securityManager; } + public CreeperSettingsDAO getCreeperSettingsDAO() { + return creeperSettingsDAO; + } } \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/creeper/CreeperSettingsDAO.java b/src/main/java/com/rsscripting/serveradmin/creeper/CreeperSettingsDAO.java new file mode 100644 index 0000000..b62f174 --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/creeper/CreeperSettingsDAO.java @@ -0,0 +1,213 @@ +package com.rsscripting.serveradmin.creeper; + +import com.rsscripting.serveradmin.database.DatabaseManager; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CreeperSettingsDAO { + + private final DatabaseManager databaseManager; + + public CreeperSettingsDAO( + DatabaseManager databaseManager + ) { + + this.databaseManager = + databaseManager; + + } + + public void ensureWorldExists( + String worldName, + boolean blockDamage, + boolean entityDamage + ) throws SQLException { + + Connection connection = + databaseManager.getConnection(); + + try (PreparedStatement statement = + connection.prepareStatement( + """ + INSERT OR IGNORE INTO + creeper_settings + ( + world_name, + block_damage, + entity_damage + ) + VALUES (?, ?, ?) + """ + )) { + + statement.setString( + 1, + worldName + ); + + statement.setInt( + 2, + blockDamage ? 1 : 0 + ); + + statement.setInt( + 3, + entityDamage ? 1 : 0 + ); + + statement.executeUpdate(); + + } + + } + + public boolean getBlockDamage( + String worldName + ) throws SQLException { + + Connection connection = + databaseManager.getConnection(); + + try (PreparedStatement statement = + connection.prepareStatement( + """ + SELECT block_damage + FROM creeper_settings + WHERE world_name = ? + """ + )) { + + statement.setString( + 1, + worldName + ); + + try (ResultSet rs = + statement.executeQuery()) { + + if (rs.next()) { + + return rs.getInt( + "block_damage" + ) == 1; + + } + + } + + } + + return false; + + } + + public void setBlockDamage( + String worldName, + boolean value + ) throws SQLException { + + Connection connection = + databaseManager.getConnection(); + + try (PreparedStatement statement = + connection.prepareStatement( + """ + UPDATE creeper_settings + SET block_damage = ? + WHERE world_name = ? + """ + )) { + + statement.setInt( + 1, + value ? 1 : 0 + ); + + statement.setString( + 2, + worldName + ); + + statement.executeUpdate(); + + } + + } + + public boolean getEntityDamage( + String worldName + ) throws SQLException { + + Connection connection = + databaseManager.getConnection(); + + try (PreparedStatement statement = + connection.prepareStatement( + """ + SELECT entity_damage + FROM creeper_settings + WHERE world_name = ? + """ + )) { + + statement.setString( + 1, + worldName + ); + + try (ResultSet rs = + statement.executeQuery()) { + + if (rs.next()) { + + return rs.getInt( + "entity_damage" + ) == 1; + + } + + } + + } + + return false; + + } + + public void setEntityDamage( + String worldName, + boolean value + ) throws SQLException { + + Connection connection = + databaseManager.getConnection(); + + try (PreparedStatement statement = + connection.prepareStatement( + """ + UPDATE creeper_settings + SET entity_damage = ? + WHERE world_name = ? + """ + )) { + + statement.setInt( + 1, + value ? 1 : 0 + ); + + statement.setString( + 2, + worldName + ); + + statement.executeUpdate(); + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java b/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java index 33aa8f2..cebc840 100644 --- a/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java +++ b/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java @@ -76,6 +76,16 @@ public class DatabaseManager { """ ); + statement.execute( + """ + CREATE TABLE IF NOT EXISTS creeper_settings ( + world_name TEXT PRIMARY KEY, + block_damage INTEGER NOT NULL, + entity_damage INTEGER NOT NULL + ) + """ + ); + } } diff --git a/src/main/java/com/rsscripting/serveradmin/gui/CreeperBlockDamageMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/CreeperBlockDamageMenu.java new file mode 100644 index 0000000..7b43ca1 --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/gui/CreeperBlockDamageMenu.java @@ -0,0 +1,270 @@ +package com.rsscripting.serveradmin.gui; + +import com.rsscripting.serveradmin.RSServerAdmin; +import com.rsscripting.serveradmin.creeper.CreeperSettingsDAO; +import com.rsscripting.serveradmin.settings.SettingKey; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; + +import java.sql.SQLException; +import java.util.List; + +public class CreeperBlockDamageMenu { + + private static final int WORLDS_PER_PAGE = 45; + + public static Inventory create( + int page + ) throws SQLException { + + RSMenuHolder holder = + new RSMenuHolder( + "CREEPER_BLOCK_DAMAGE" + ); + + holder.setPage( + page + ); + + Inventory inventory = + Bukkit.createInventory( + holder, + 54, + "Block Damage" + ); + + GUIUtils.fillEmptySlots( + inventory + ); + + createBackButton( + inventory + ); + + createDefaultButton( + inventory + ); + + populateWorlds( + inventory, + page + ); + + return inventory; + + } + + private static void createBackButton( + Inventory inventory + ) { + + ItemStack item = + new ItemStack( + Material.ARROW + ); + + ItemMeta meta = + item.getItemMeta(); + + if (meta != null) { + + meta.setDisplayName( + "§cBack" + ); + + item.setItemMeta( + meta + ); + + } + + inventory.setItem( + 3, + item + ); + + } + + private static void createDefaultButton( + Inventory inventory + ) throws SQLException { + + boolean enabled = + RSServerAdmin.getInstance() + .getSettingsDAO() + .getDefault( + SettingKey.CREEPER_BLOCK_DAMAGE + ); + + ItemStack item = + new ItemStack( + enabled + ? Material.ENDER_CHEST + : Material.CHEST + ); + + ItemMeta meta = + item.getItemMeta(); + + if (meta != null) { + + meta.setDisplayName( + "§eDefault For New Worlds" + ); + + meta.setLore( + List.of( + "§7Controls newly detected worlds", + "", + enabled + ? "§aCurrent: New worlds allow creeper block damage" + : "§cCurrent: New worlds block creeper block damage" + ) + ); + + item.setItemMeta( + meta + ); + + } + + inventory.setItem( + 5, + item + ); + + } + + private static void populateWorlds( + Inventory inventory, + int page + ) throws SQLException { + + CreeperSettingsDAO dao = + RSServerAdmin.getInstance() + .getCreeperSettingsDAO(); + + List worlds = + RSServerAdmin.getInstance() + .getWorldsDAO() + .getAllWorlds(); + + int start = + (page - 1) * WORLDS_PER_PAGE; + + int end = + Math.min( + start + WORLDS_PER_PAGE, + worlds.size() + ); + + int worldCount = + end - start; + + for (int i = start; + i < end; + i++) { + + String worldName = + worlds.get(i); + + boolean enabled = + dao.getBlockDamage( + worldName + ); + + ItemStack item = + new ItemStack( + enabled + ? Material.LIME_SHULKER_BOX + : Material.RED_SHULKER_BOX + ); + + ItemMeta meta = + item.getItemMeta(); + + if (meta != null) { + + meta.setDisplayName( + "§e" + worldName + ); + + meta.getPersistentDataContainer() + .set( + new NamespacedKey( + RSServerAdmin.getInstance(), + "world_name" + ), + PersistentDataType.STRING, + worldName + ); + + meta.setLore( + List.of( + "§7Creeper Block Damage", + "", + enabled + ? "§aCurrent: Creepers damage blocks" + : "§cCurrent: Creepers do not damage blocks" + ) + ); + + item.setItemMeta( + meta + ); + + } + + int relativeIndex = + i - start; + + int row = + relativeIndex / 9; + + int indexInRow = + relativeIndex % 9; + + int itemsRemaining = + worldCount - (row * 9); + + boolean lastPartialRow = + itemsRemaining < 9; + + int slot; + + if (lastPartialRow) { + + List rowSlots = + MenuLayoutUtils.getCenteredSlots( + itemsRemaining + ); + + slot = + 9 + + (row * 9) + + rowSlots.get( + indexInRow + ); + + } else { + + slot = + 9 + + (row * 9) + + indexInRow; + + } + + inventory.setItem( + slot, + item + ); + + } + } +} diff --git a/src/main/java/com/rsscripting/serveradmin/gui/CreeperEntityDamageMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/CreeperEntityDamageMenu.java new file mode 100644 index 0000000..5f9672d --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/gui/CreeperEntityDamageMenu.java @@ -0,0 +1,270 @@ +package com.rsscripting.serveradmin.gui; + +import com.rsscripting.serveradmin.RSServerAdmin; +import com.rsscripting.serveradmin.creeper.CreeperSettingsDAO; +import com.rsscripting.serveradmin.settings.SettingKey; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; + +import java.sql.SQLException; +import java.util.List; + +public class CreeperEntityDamageMenu { + + private static final int WORLDS_PER_PAGE = 45; + + public static Inventory create( + int page + ) throws SQLException { + + RSMenuHolder holder = + new RSMenuHolder( + "CREEPER_ENTITY_DAMAGE" + ); + + holder.setPage( + page + ); + + Inventory inventory = + Bukkit.createInventory( + holder, + 54, + "Entity Damage" + ); + + GUIUtils.fillEmptySlots( + inventory + ); + + createBackButton( + inventory + ); + + createDefaultButton( + inventory + ); + + populateWorlds( + inventory, + page + ); + + return inventory; + + } + + private static void createBackButton( + Inventory inventory + ) { + + ItemStack item = + new ItemStack( + Material.ARROW + ); + + ItemMeta meta = + item.getItemMeta(); + + if (meta != null) { + + meta.setDisplayName( + "§cBack" + ); + + item.setItemMeta( + meta + ); + + } + + inventory.setItem( + 3, + item + ); + + } + + private static void createDefaultButton( + Inventory inventory + ) throws SQLException { + + boolean enabled = + RSServerAdmin.getInstance() + .getSettingsDAO() + .getDefault( + SettingKey.CREEPER_ENTITY_DAMAGE + ); + + ItemStack item = + new ItemStack( + enabled + ? Material.ENDER_CHEST + : Material.CHEST + ); + + ItemMeta meta = + item.getItemMeta(); + + if (meta != null) { + + meta.setDisplayName( + "§eDefault For New Worlds" + ); + + meta.setLore( + List.of( + "§7Controls newly detected worlds", + "", + enabled + ? "§aCurrent: New worlds allow creeper entity damage" + : "§cCurrent: New worlds block creeper entity damage" + ) + ); + + item.setItemMeta( + meta + ); + + } + + inventory.setItem( + 5, + item + ); + + } + + private static void populateWorlds( + Inventory inventory, + int page + ) throws SQLException { + + CreeperSettingsDAO dao = + RSServerAdmin.getInstance() + .getCreeperSettingsDAO(); + + List worlds = + RSServerAdmin.getInstance() + .getWorldsDAO() + .getAllWorlds(); + + int start = + (page - 1) * WORLDS_PER_PAGE; + + int end = + Math.min( + start + WORLDS_PER_PAGE, + worlds.size() + ); + + int worldCount = + end - start; + + for (int i = start; + i < end; + i++) { + + String worldName = + worlds.get(i); + + boolean enabled = + dao.getEntityDamage( + worldName + ); + + ItemStack item = + new ItemStack( + enabled + ? Material.LIME_SHULKER_BOX + : Material.RED_SHULKER_BOX + ); + + ItemMeta meta = + item.getItemMeta(); + + if (meta != null) { + + meta.setDisplayName( + "§e" + worldName + ); + + meta.getPersistentDataContainer() + .set( + new NamespacedKey( + RSServerAdmin.getInstance(), + "world_name" + ), + PersistentDataType.STRING, + worldName + ); + + meta.setLore( + List.of( + "§7Creeper Entity Damage", + "", + enabled + ? "§aCurrent: Creepers damage entities" + : "§cCurrent: Creepers do not damage entities" + ) + ); + + item.setItemMeta( + meta + ); + + } + + int relativeIndex = + i - start; + + int row = + relativeIndex / 9; + + int indexInRow = + relativeIndex % 9; + + int itemsRemaining = + worldCount - (row * 9); + + boolean lastPartialRow = + itemsRemaining < 9; + + int slot; + + if (lastPartialRow) { + + List rowSlots = + MenuLayoutUtils.getCenteredSlots( + itemsRemaining + ); + + slot = + 9 + + (row * 9) + + rowSlots.get( + indexInRow + ); + + } else { + + slot = + 9 + + (row * 9) + + indexInRow; + + } + + inventory.setItem( + slot, + item + ); + + } + } +} diff --git a/src/main/java/com/rsscripting/serveradmin/gui/CreeperMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/CreeperMenu.java index c560ad9..df23aa7 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/CreeperMenu.java +++ b/src/main/java/com/rsscripting/serveradmin/gui/CreeperMenu.java @@ -62,14 +62,6 @@ public class CreeperMenu { } - if (disableBlockDamage) { - - GUIUtils.addGlow( - blockDamage - ); - - } - inventory.setItem( 11, blockDamage @@ -112,14 +104,6 @@ public class CreeperMenu { } - if (disableEntityDamage) { - - GUIUtils.addGlow( - entityDamage - ); - - } - inventory.setItem( 15, entityDamage diff --git a/src/main/java/com/rsscripting/serveradmin/gui/KeepInventoryMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/KeepInventoryMenu.java index 07168be..f7dd71a 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/KeepInventoryMenu.java +++ b/src/main/java/com/rsscripting/serveradmin/gui/KeepInventoryMenu.java @@ -2,13 +2,15 @@ package com.rsscripting.serveradmin.gui; import com.rsscripting.serveradmin.RSServerAdmin; import com.rsscripting.serveradmin.keepinventory.KeepInventoryDAO; -import com.rsscripting.serveradmin.worlds.WorldsDAO; import com.rsscripting.serveradmin.settings.SettingKey; + import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.NamespacedKey; +import org.bukkit.persistence.PersistentDataType; import java.sql.SQLException; import java.util.List; @@ -164,11 +166,17 @@ public class KeepInventoryMenu { int start = (page - 1) * WORLDS_PER_PAGE; - int slot = - 9; + int end = + Math.min( + start + WORLDS_PER_PAGE, + worlds.size() + ); + + int worldCount = + end - start; for (int i = start; - i < worlds.size() && slot < 54; + i < end; i++) { String worldName = @@ -195,6 +203,16 @@ public class KeepInventoryMenu { "§e" + worldName ); + meta.getPersistentDataContainer() + .set( + new NamespacedKey( + RSServerAdmin.getInstance(), + "world_name" + ), + PersistentDataType.STRING, + worldName + ); + meta.setLore( List.of( "§7Keep Inventory", @@ -211,15 +229,51 @@ public class KeepInventoryMenu { } + int relativeIndex = + i - start; + + int row = + relativeIndex / 9; + + int indexInRow = + relativeIndex % 9; + + int itemsRemaining = + worldCount - (row * 9); + + boolean lastPartialRow = + itemsRemaining < 9; + + int slot; + + if (lastPartialRow) { + + List rowSlots = + MenuLayoutUtils.getCenteredSlots( + itemsRemaining + ); + + slot = + 9 + + (row * 9) + + rowSlots.get( + indexInRow + ); + + } else { + + slot = + 9 + + (row * 9) + + indexInRow; + + } + inventory.setItem( slot, item ); - slot++; - } - } - -} \ No newline at end of file +} diff --git a/src/main/java/com/rsscripting/serveradmin/gui/MenuLayoutUtils.java b/src/main/java/com/rsscripting/serveradmin/gui/MenuLayoutUtils.java new file mode 100644 index 0000000..e861ddf --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/gui/MenuLayoutUtils.java @@ -0,0 +1,70 @@ +package com.rsscripting.serveradmin.gui; + +import java.util.ArrayList; +import java.util.List; + +public class MenuLayoutUtils { + + public static List getCenteredSlots( + int itemCount + ) { + + List rowSlots = + new ArrayList<>(); + + if (itemCount <= 0) { + return rowSlots; + } + + if (itemCount >= 9) { + + for (int i = 0; i < 9; i++) { + rowSlots.add(i); + } + + return rowSlots; + + } + + if (itemCount % 2 == 0) { + + switch (itemCount) { + + case 2 -> rowSlots = List.of( + 3, 5 + ); + + case 4 -> rowSlots = List.of( + 2, 3, 5, 6 + ); + + case 6 -> rowSlots = List.of( + 1, 2, 3, 5, 6, 7 + ); + + case 8 -> rowSlots = List.of( + 0, 1, 2, 3, 5, 6, 7, 8 + ); + + } + + } else { + + int startSlot = + (9 - itemCount) / 2; + + for (int i = 0; i < itemCount; i++) { + + rowSlots.add( + startSlot + i + ); + + } + + } + + return rowSlots; + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/CreeperListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/CreeperBlockDamageListener.java similarity index 52% rename from src/main/java/com/rsscripting/serveradmin/listeners/CreeperListener.java rename to src/main/java/com/rsscripting/serveradmin/listeners/CreeperBlockDamageListener.java index 51dfae1..3dae33d 100644 --- a/src/main/java/com/rsscripting/serveradmin/listeners/CreeperListener.java +++ b/src/main/java/com/rsscripting/serveradmin/listeners/CreeperBlockDamageListener.java @@ -7,7 +7,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityExplodeEvent; -public class CreeperListener implements Listener { +public class CreeperBlockDamageListener implements Listener { @EventHandler public void onEntityExplode( @@ -20,14 +20,19 @@ public class CreeperListener implements Listener { try { - boolean disableBlockDamage = + String worldName = + event.getLocation() + .getWorld() + .getName(); + + boolean blockDamageEnabled = RSServerAdmin.getInstance() - .getSettingsDAO() - .getDefault( - SettingKey.CREEPER_BLOCK_DAMAGE + .getCreeperSettingsDAO() + .getBlockDamage( + worldName ); - if (!disableBlockDamage) { + if (blockDamageEnabled) { return; } @@ -36,7 +41,12 @@ public class CreeperListener implements Listener { } catch (Exception ex) { - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to process Creeper block damage: " + + ex.getMessage() + ); } diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/CreeperEntityDamageListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/CreeperEntityDamageListener.java index bb917de..032370b 100644 --- a/src/main/java/com/rsscripting/serveradmin/listeners/CreeperEntityDamageListener.java +++ b/src/main/java/com/rsscripting/serveradmin/listeners/CreeperEntityDamageListener.java @@ -20,22 +20,34 @@ public class CreeperEntityDamageListener implements Listener { try { - boolean disableEntityDamage = + String worldName = + event.getEntity() + .getWorld() + .getName(); + + boolean entityDamageEnabled = RSServerAdmin.getInstance() - .getSettingsDAO() - .getDefault( - SettingKey.CREEPER_ENTITY_DAMAGE + .getCreeperSettingsDAO() + .getEntityDamage( + worldName ); - if (!disableEntityDamage) { + if (entityDamageEnabled) { return; } - event.setCancelled(true); + event.setCancelled( + true + ); } catch (Exception ex) { - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to process Creeper entity damage: " + + ex.getMessage() + ); } diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java index cc86a66..07e5fd7 100644 --- a/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java +++ b/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java @@ -1,8 +1,6 @@ package com.rsscripting.serveradmin.listeners; -import com.rsscripting.serveradmin.gui.KeepInventoryMenu; -import com.rsscripting.serveradmin.gui.RSMenuHolder; -import com.rsscripting.serveradmin.gui.CreeperMenu; +import com.rsscripting.serveradmin.gui.*; import com.rsscripting.serveradmin.RSServerAdmin; import com.rsscripting.serveradmin.settings.SettingKey; import com.rsscripting.serveradmin.keepinventory.KeepInventoryDAO; @@ -14,6 +12,9 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.Bukkit; import org.bukkit.GameRule; import org.bukkit.World; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.NamespacedKey; +import org.bukkit.persistence.PersistentDataType; public class InventoryListener implements Listener { @@ -139,54 +140,56 @@ public class InventoryListener implements Listener { switch (event.getSlot()) { + case 4 -> player.openInventory( + com.rsscripting.serveradmin.gui.MainMenu.create() + ); + case 11 -> { try { - RSServerAdmin.getInstance() - .getSettingsDAO() - .toggleDefault( - SettingKey.CREEPER_BLOCK_DAMAGE - ); + player.openInventory( + CreeperBlockDamageMenu.create( + 1 + ) + ); } catch (Exception ex) { - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to open Creeper Block Damage menu: " + + ex.getMessage() + ); } - player.openInventory( - CreeperMenu.create() - ); - } case 15 -> { try { - RSServerAdmin.getInstance() - .getSettingsDAO() - .toggleDefault( - SettingKey.CREEPER_ENTITY_DAMAGE - ); + player.openInventory( + CreeperEntityDamageMenu.create( + 1 + ) + ); } catch (Exception ex) { - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to open Creeper Entity Damage menu: " + + ex.getMessage() + ); } - player.openInventory( - CreeperMenu.create() - ); - } - case 4 -> player.openInventory( - com.rsscripting.serveradmin.gui.MainMenu.create() - ); - } } @@ -243,27 +246,39 @@ public class InventoryListener implements Listener { RSServerAdmin.getInstance() .getKeepInventoryDAO(); - java.util.List worlds = - RSServerAdmin.getInstance() - .getWorldsDAO() - .getAllWorlds(); + if (event.getCurrentItem() == null) { + return; + } - int worldIndex = - ((holder.getPage() - 1) * 45) - + (event.getSlot() - 9); + if (!event.getCurrentItem().hasItemMeta()) { + return; + } - if (worldIndex < 0 - || worldIndex >= worlds.size()) { + ItemMeta meta = + event.getCurrentItem() + .getItemMeta(); + + if (meta == null) { + return; + } + + String worldName = + meta.getPersistentDataContainer() + .get( + new NamespacedKey( + RSServerAdmin.getInstance(), + "world_name" + ), + PersistentDataType.STRING + ); + + if (worldName == null + || worldName.isBlank()) { return; } - String worldName = - worlds.get( - worldIndex - ); - boolean enabled = dao.getWorldSetting( worldName @@ -306,6 +321,278 @@ public class InventoryListener implements Listener { } + case "CREEPER_BLOCK_DAMAGE" -> { + + if (!(event.getWhoClicked() instanceof Player player)) { + return; + } + + switch (event.getSlot()) { + + case 3 -> { + + try { + + player.openInventory( + CreeperMenu.create() + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to open Creeper menu: " + + ex.getMessage() + ); + + } + + } + + case 5 -> { + + try { + + RSServerAdmin.getInstance() + .getSettingsDAO() + .toggleDefault( + SettingKey.CREEPER_BLOCK_DAMAGE + ); + + player.openInventory( + CreeperBlockDamageMenu.create( + holder.getPage() + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to toggle Creeper Block Damage default: " + + ex.getMessage() + ); + + } + + } + + default -> { + + if (event.getSlot() < 9) { + return; + } + + try { + + if (event.getCurrentItem() == null) { + return; + } + + if (!event.getCurrentItem().hasItemMeta()) { + return; + } + + ItemMeta meta = + event.getCurrentItem() + .getItemMeta(); + + if (meta == null) { + return; + } + + String worldName = + meta.getPersistentDataContainer() + .get( + new NamespacedKey( + RSServerAdmin.getInstance(), + "world_name" + ), + PersistentDataType.STRING + ); + + if (worldName == null + || worldName.isBlank()) { + + return; + + } + + boolean enabled = + RSServerAdmin.getInstance() + .getCreeperSettingsDAO() + .getBlockDamage( + worldName + ); + + RSServerAdmin.getInstance() + .getCreeperSettingsDAO() + .setBlockDamage( + worldName, + !enabled + ); + + player.openInventory( + CreeperBlockDamageMenu.create( + holder.getPage() + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to update Creeper Block Damage setting: " + + ex.getMessage() + ); + + } + + } + + } + + } + + case "CREEPER_ENTITY_DAMAGE" -> { + + if (!(event.getWhoClicked() instanceof Player player)) { + return; + } + + switch (event.getSlot()) { + + case 3 -> { + + try { + + player.openInventory( + CreeperMenu.create() + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to open Creeper menu: " + + ex.getMessage() + ); + + } + + } + + case 5 -> { + + try { + + RSServerAdmin.getInstance() + .getSettingsDAO() + .toggleDefault( + SettingKey.CREEPER_ENTITY_DAMAGE + ); + + player.openInventory( + CreeperEntityDamageMenu.create( + holder.getPage() + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to toggle Creeper Entity Damage default: " + + ex.getMessage() + ); + + } + + } + + default -> { + + if (event.getSlot() < 9) { + return; + } + + try { + + if (event.getCurrentItem() == null) { + return; + } + + if (!event.getCurrentItem().hasItemMeta()) { + return; + } + + ItemMeta meta = + event.getCurrentItem() + .getItemMeta(); + + if (meta == null) { + return; + } + + String worldName = + meta.getPersistentDataContainer() + .get( + new NamespacedKey( + RSServerAdmin.getInstance(), + "world_name" + ), + PersistentDataType.STRING + ); + + if (worldName == null + || worldName.isBlank()) { + + return; + + } + + boolean enabled = + RSServerAdmin.getInstance() + .getCreeperSettingsDAO() + .getEntityDamage( + worldName + ); + + RSServerAdmin.getInstance() + .getCreeperSettingsDAO() + .setEntityDamage( + worldName, + !enabled + ); + + player.openInventory( + CreeperEntityDamageMenu.create( + holder.getPage() + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to update Creeper Entity Damage setting: " + + ex.getMessage() + ); + + } + + } + + } + + } + } } diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java index dd3e9dc..c9f9117 100644 --- a/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java +++ b/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java @@ -36,6 +36,25 @@ public class WorldLoadListener implements Listener { keepInventoryDefault ); + boolean blockDamageDefault = + plugin.getSettingsDAO() + .getDefault( + SettingKey.CREEPER_BLOCK_DAMAGE + ); + + boolean entityDamageDefault = + plugin.getSettingsDAO() + .getDefault( + SettingKey.CREEPER_ENTITY_DAMAGE + ); + + plugin.getCreeperSettingsDAO() + .ensureWorldExists( + event.getWorld().getName(), + blockDamageDefault, + entityDamageDefault + ); + boolean keepInventoryEnabled = plugin.getKeepInventoryDAO() .getWorldSetting(