diff --git a/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java b/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java index 93bd66b..0a37738 100644 --- a/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java +++ b/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java @@ -3,12 +3,9 @@ package com.rsscripting.serveradmin; import com.rsscripting.serveradmin.dao.*; import com.rsscripting.serveradmin.database.DatabaseManager; import com.rsscripting.serveradmin.commands.RSAdminCommand; -import com.rsscripting.serveradmin.listeners.CreeperBlockDamageListener; +import com.rsscripting.serveradmin.listeners.*; 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.settings.SettingKey; import org.bukkit.plugin.java.JavaPlugin; @@ -26,7 +23,7 @@ public class RSServerAdmin extends JavaPlugin { private SecurityManager securityManager; private WorldsDAO worldsDAO; private CreeperSettingsDAO creeperSettingsDAO; - private EquipmentDropSettingsDAO equipmentDropSettingsDAO; + private MobEquipmentDropSettingsDAO equipmentDropSettingsDAO; @Override public void onEnable() { @@ -61,7 +58,7 @@ public class RSServerAdmin extends JavaPlugin { ); equipmentDropSettingsDAO = - new EquipmentDropSettingsDAO( + new MobEquipmentDropSettingsDAO( databaseManager ); @@ -120,7 +117,7 @@ public class RSServerAdmin extends JavaPlugin { } getServer().getPluginManager().registerEvents( - new InventoryListener(), + new MainMenuListener(), this ); @@ -139,6 +136,25 @@ public class RSServerAdmin extends JavaPlugin { this ); + getServer().getPluginManager().registerEvents( + new KeepInventoryListener(), + this + ); + + getServer().getPluginManager().registerEvents( + new CreeperMenuListener(), + this + ); + + getServer().getPluginManager().registerEvents( + new MobEquipmentMenuListener(), + this + ); + + getServer().getPluginManager().registerEvents( + new MobEquipmentDropListener(), + this + ); } catch (Exception ex) { @@ -195,7 +211,7 @@ public class RSServerAdmin extends JavaPlugin { return creeperSettingsDAO; } - public EquipmentDropSettingsDAO + public MobEquipmentDropSettingsDAO getEquipmentDropSettingsDAO() { return equipmentDropSettingsDAO; diff --git a/src/main/java/com/rsscripting/serveradmin/commands/RSAdminCommand.java b/src/main/java/com/rsscripting/serveradmin/commands/RSAdminCommand.java index c199c6a..28e473c 100644 --- a/src/main/java/com/rsscripting/serveradmin/commands/RSAdminCommand.java +++ b/src/main/java/com/rsscripting/serveradmin/commands/RSAdminCommand.java @@ -2,6 +2,7 @@ package com.rsscripting.serveradmin.commands; import com.rsscripting.serveradmin.RSServerAdmin; import com.rsscripting.serveradmin.security.UserRole; +import com.rsscripting.serveradmin.utils.WorldSyncUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -42,6 +43,19 @@ public class RSAdminCommand implements CommandExecutor { return true; } + try { + + WorldSyncUtils.synchronizeWorlds(); + + } catch (Exception ex) { + + plugin.getLogger().warning( + "World synchronization failed: " + + ex.getMessage() + ); + + } + player.openInventory( com.rsscripting.serveradmin.gui.MainMenu.create() ); diff --git a/src/main/java/com/rsscripting/serveradmin/dao/EquipmentDropSettingsDAO.java b/src/main/java/com/rsscripting/serveradmin/dao/MobEquipmentDropSettingsDAO.java similarity index 98% rename from src/main/java/com/rsscripting/serveradmin/dao/EquipmentDropSettingsDAO.java rename to src/main/java/com/rsscripting/serveradmin/dao/MobEquipmentDropSettingsDAO.java index c0c8669..55a1530 100644 --- a/src/main/java/com/rsscripting/serveradmin/dao/EquipmentDropSettingsDAO.java +++ b/src/main/java/com/rsscripting/serveradmin/dao/MobEquipmentDropSettingsDAO.java @@ -7,11 +7,11 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -public class EquipmentDropSettingsDAO { +public class MobEquipmentDropSettingsDAO { private final DatabaseManager databaseManager; - public EquipmentDropSettingsDAO( + public MobEquipmentDropSettingsDAO( DatabaseManager databaseManager ) { diff --git a/src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java b/src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java index c0b3341..72bb025 100644 --- a/src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java +++ b/src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java @@ -1,6 +1,7 @@ package com.rsscripting.serveradmin.dao; import com.rsscripting.serveradmin.database.DatabaseManager; +import com.rsscripting.serveradmin.RSServerAdmin; import java.sql.Connection; import java.sql.PreparedStatement; @@ -90,4 +91,81 @@ public class WorldsDAO { } + public void deleteWorldEverywhere( + String worldName + ) throws SQLException { + + Connection connection = + databaseManager.getConnection(); + + try (PreparedStatement statement = + connection.prepareStatement( + """ + DELETE FROM worlds + WHERE world_name = ? + """ + )) { + + statement.setString( + 1, + worldName + ); + + statement.executeUpdate(); + + } + + try (PreparedStatement statement = + connection.prepareStatement( + """ + DELETE FROM keep_inventory + WHERE world_name = ? + """ + )) { + + statement.setString( + 1, + worldName + ); + + statement.executeUpdate(); + + } + + try (PreparedStatement statement = + connection.prepareStatement( + """ + DELETE FROM creeper_settings + WHERE world_name = ? + """ + )) { + + statement.setString( + 1, + worldName + ); + + statement.executeUpdate(); + + } + + try (PreparedStatement statement = + connection.prepareStatement( + """ + DELETE FROM equipment_drop_settings + WHERE world_name = ? + """ + )) { + + statement.setString( + 1, + worldName + ); + + statement.executeUpdate(); + + } + + } + } \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentSettingsMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentSettingsMenu.java index dcb015f..7994ca5 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentSettingsMenu.java +++ b/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentSettingsMenu.java @@ -7,6 +7,7 @@ import com.rsscripting.serveradmin.utils.GUIUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -93,7 +94,7 @@ public class MobEquipmentSettingsMenu { Bukkit.createInventory( holder, 54, - "Equipment: " + worldName + "Mob Drops: " + worldName ); GUIUtils.fillEmptySlots( @@ -138,6 +139,37 @@ public class MobEquipmentSettingsMenu { Material.LEATHER_HELMET ); + ItemMeta helmetMeta = + helmet.getItemMeta(); + + helmetMeta.addItemFlags( + ItemFlag.HIDE_ATTRIBUTES + ); + + if (helmetMeta != null) { + + helmetMeta.setDisplayName( + "§eHelmet" + ); + + helmetMeta.setLore( + java.util.List.of( + helmetEnabled + ? "§aCurrent: Mobs will drop helmet if equipped." + : "§cCurrent: Mobs will not drop helmet if equipped.", + "", + helmetEnabled + ? "§7Click to Disable" + : "§7Click to Enable" + ) + ); + + helmet.setItemMeta( + helmetMeta + ); + + } + if (helmetEnabled) { GUIUtils.addGlow( @@ -147,7 +179,7 @@ public class MobEquipmentSettingsMenu { } inventory.setItem( - 13, + 22, helmet ); @@ -160,16 +192,47 @@ public class MobEquipmentSettingsMenu { Material.SHIELD ); + ItemMeta offHandMeta = + offHand.getItemMeta(); + + offHandMeta.addItemFlags( + ItemFlag.HIDE_ATTRIBUTES + ); + + if (offHandMeta != null) { + + offHandMeta.setDisplayName( + "§eOff Hand" + ); + + offHandMeta.setLore( + java.util.List.of( + offHandEnabled + ? "§aCurrent: Mobs will drop held item." + : "§cCurrent: Mobs will not drop held item.", + "", + offHandEnabled + ? "§7Click to Disable" + : "§7Click to Enable" + ) + ); + + offHand.setItemMeta( + offHandMeta + ); + + } + if (offHandEnabled) { GUIUtils.addGlow( - offHand + offHand ); } inventory.setItem( - 20, + 30, offHand ); @@ -182,6 +245,37 @@ public class MobEquipmentSettingsMenu { Material.LEATHER_CHESTPLATE ); + ItemMeta chestplateMeta = + chestplate.getItemMeta(); + + chestplateMeta.addItemFlags( + ItemFlag.HIDE_ATTRIBUTES + ); + + if (chestplateMeta != null) { + + chestplateMeta.setDisplayName( + "§eChestplate" + ); + + chestplateMeta.setLore( + java.util.List.of( + chestplateEnabled + ? "§aCurrent: Mobs will drop chestplate if equipped." + : "§cCurrent: Mobs will not drop chestplate if equipped.", + "", + chestplateEnabled + ? "§7Click to Disable" + : "§7Click to Enable" + ) + ); + + chestplate.setItemMeta( + chestplateMeta + ); + + } + if (chestplateEnabled) { GUIUtils.addGlow( @@ -191,7 +285,7 @@ public class MobEquipmentSettingsMenu { } inventory.setItem( - 21, + 31, chestplate ); @@ -204,6 +298,38 @@ public class MobEquipmentSettingsMenu { Material.IRON_SWORD ); + ItemMeta mainHandMeta = + mainHand.getItemMeta(); + + mainHandMeta.addItemFlags( + ItemFlag.HIDE_ATTRIBUTES + ); + + + if (mainHandMeta != null) { + + mainHandMeta.setDisplayName( + "§eMain Hand" + ); + + mainHandMeta.setLore( + java.util.List.of( + mainHandEnabled + ? "§aCurrent: Mobs will drop held item if equipped." + : "§cCurrent: Mobs will not drop held item if equipped.", + "", + mainHandEnabled + ? "§7Click to Disable" + : "§7Click to Enable" + ) + ); + + mainHand.setItemMeta( + mainHandMeta + ); + + } + if (mainHandEnabled) { GUIUtils.addGlow( @@ -213,7 +339,7 @@ public class MobEquipmentSettingsMenu { } inventory.setItem( - 22, + 32, mainHand ); @@ -226,6 +352,38 @@ public class MobEquipmentSettingsMenu { Material.LEATHER_LEGGINGS ); + ItemMeta leggingsMeta = + leggings.getItemMeta(); + + leggingsMeta.addItemFlags( + ItemFlag.HIDE_ATTRIBUTES + ); + + + if (mainHandMeta != null) { + + leggingsMeta.setDisplayName( + "§eLeggings" + ); + + leggingsMeta.setLore( + java.util.List.of( + leggingsEnabled + ? "§aCurrent: Mobs will drop leggings if equipped." + : "§cCurrent: Mobs will not drop leggings if equipped.", + "", + leggingsEnabled + ? "§7Click to Disable" + : "§7Click to Enable" + ) + ); + + leggings.setItemMeta( + leggingsMeta + ); + + } + if (leggingsEnabled) { GUIUtils.addGlow( @@ -235,7 +393,7 @@ public class MobEquipmentSettingsMenu { } inventory.setItem( - 29, + 40, leggings ); @@ -248,6 +406,38 @@ public class MobEquipmentSettingsMenu { Material.LEATHER_BOOTS ); + ItemMeta bootsMeta = + boots.getItemMeta(); + + bootsMeta.addItemFlags( + ItemFlag.HIDE_ATTRIBUTES + ); + + + if (bootsMeta != null) { + + bootsMeta.setDisplayName( + "§eBoots" + ); + + bootsMeta.setLore( + java.util.List.of( + bootsEnabled + ? "§aCurrent: Mobs will drop boots if equipped." + : "§cCurrent: Mobs will not drop boots if equipped.", + "", + bootsEnabled + ? "§7Click to Disable" + : "§7Click to Enable" + ) + ); + + boots.setItemMeta( + bootsMeta + ); + + } + if (bootsEnabled) { GUIUtils.addGlow( @@ -257,7 +447,7 @@ public class MobEquipmentSettingsMenu { } inventory.setItem( - 37, + 49, boots ); diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/CreeperMenuListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/CreeperMenuListener.java new file mode 100644 index 0000000..f0ae8b9 --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/listeners/CreeperMenuListener.java @@ -0,0 +1,388 @@ +package com.rsscripting.serveradmin.listeners; + +import com.rsscripting.serveradmin.RSServerAdmin; +import com.rsscripting.serveradmin.gui.CreeperBlockDamageMenu; +import com.rsscripting.serveradmin.gui.CreeperEntityDamageMenu; +import com.rsscripting.serveradmin.gui.CreeperMenu; +import com.rsscripting.serveradmin.gui.MainMenu; +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; +import com.rsscripting.serveradmin.settings.SettingKey; + +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; + +public class CreeperMenuListener implements Listener { + + @EventHandler + public void onInventoryClick( + InventoryClickEvent event + ) { + + if (!(event.getInventory().getHolder() + instanceof RSMenuHolder holder)) { + + return; + + } + + if (event.getClickedInventory() == null) { + return; + } + + if (event.getClickedInventory() + != event.getView().getTopInventory()) { + + return; + + } + + event.setCancelled( + true + ); + + switch (holder.getMenuId()) { + + case "creeper" -> { + + if (!(event.getWhoClicked() instanceof Player player)) { + return; + } + + switch (event.getSlot()) { + + case 4 -> player.openInventory( + com.rsscripting.serveradmin.gui.MainMenu.create() + ); + + case 11 -> { + + try { + + player.openInventory( + CreeperBlockDamageMenu.create( + 1 + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to open Creeper Block Damage menu: " + + ex.getMessage() + ); + + } + + } + + case 15 -> { + + try { + + player.openInventory( + CreeperEntityDamageMenu.create( + 1 + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to open Creeper Entity Damage menu: " + + ex.getMessage() + ); + + } + + } + + } + + } + + 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() + ); + + } + + } + + } + + } + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java deleted file mode 100644 index 73df360..0000000 --- a/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java +++ /dev/null @@ -1,792 +0,0 @@ -package com.rsscripting.serveradmin.listeners; - -import com.rsscripting.serveradmin.gui.*; -import com.rsscripting.serveradmin.RSServerAdmin; -import com.rsscripting.serveradmin.menuholder.RSMenuHolder; -import com.rsscripting.serveradmin.settings.SettingKey; -import com.rsscripting.serveradmin.dao.KeepInventoryDAO; -import com.rsscripting.serveradmin.gui.MobEquipmentWorldMenu; -import com.rsscripting.serveradmin.gui.MobEquipmentSettingsMenu; - -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -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 { - - @EventHandler - public void onInventoryClick(InventoryClickEvent event) { - - if (!(event.getInventory().getHolder() instanceof RSMenuHolder holder)) { - return; - } - - if (event.getClickedInventory() == null) { - return; - } - - if (event.getClickedInventory() != event.getView().getTopInventory()) { - return; - } - - event.setCancelled(true); - - switch (holder.getMenuId()) { - - case "main" -> { - - if (!(event.getWhoClicked() instanceof Player player)) { - return; - } - - switch (event.getSlot()) { - - /* - | Rescan for new worlds - */ - - case 4 -> { - - try { - - boolean keepInventoryDefault = - RSServerAdmin.getInstance() - .getSettingsDAO() - .getDefault( - SettingKey.KEEP_INVENTORY_NEW_WORLD - ); - - boolean blockDamageDefault = - RSServerAdmin.getInstance() - .getSettingsDAO() - .getDefault( - SettingKey.CREEPER_BLOCK_DAMAGE - ); - - boolean entityDamageDefault = - RSServerAdmin.getInstance() - .getSettingsDAO() - .getDefault( - SettingKey.CREEPER_ENTITY_DAMAGE - ); - - for (org.bukkit.World world - : org.bukkit.Bukkit.getWorlds()) { - - RSServerAdmin.getInstance() - .getWorldsDAO() - .ensureWorldExists( - world.getName() - ); - - RSServerAdmin.getInstance() - .getKeepInventoryDAO() - .ensureWorldExists( - world.getName(), - keepInventoryDefault - ); - - RSServerAdmin.getInstance() - .getCreeperSettingsDAO() - .ensureWorldExists( - world.getName(), - blockDamageDefault, - entityDamageDefault - ); - - RSServerAdmin.getInstance() - .getEquipmentDropSettingsDAO() - .ensureWorldExists( - world.getName() - ); - - } - - player.sendMessage( - "§aWorld scan complete." - ); - - } catch (Exception ex) { - - RSServerAdmin.getInstance() - .getLogger() - .warning( - "World scan failed: " - + ex.getMessage() - ); - - player.sendMessage( - "§cWorld scan failed." - ); - - } - - } - - /* - | Mob Inventory Drop - */ - - case 13 -> { - - try { - - player.openInventory( - MobEquipmentWorldMenu.create( - 1 - ) - ); - - } catch (Exception ex) { - - RSServerAdmin.getInstance() - .getLogger() - .warning( - "Failed to open Mob Equipment menu: " - + ex.getMessage() - ); - - } - - } - - /* - | Creeper menu - */ - - case 11 -> player.openInventory( - CreeperMenu.create() - ); - - /* - | Keep Inventory Menu - */ - - case 15 -> { - - try { - - player.openInventory( - KeepInventoryMenu.create( - 1 - ) - ); - - } catch (Exception ex) { - - RSServerAdmin.getInstance() - .getLogger() - .warning( - "Failed to open Keep Inventory menu: " - + ex.getMessage() - ); - - } - - } - - } - - } - - /* - | Creeper menu - */ - - case "creeper" -> { - - if (!(event.getWhoClicked() instanceof Player player)) { - return; - } - - switch (event.getSlot()) { - - case 4 -> player.openInventory( - com.rsscripting.serveradmin.gui.MainMenu.create() - ); - - case 11 -> { - - try { - - player.openInventory( - CreeperBlockDamageMenu.create( - 1 - ) - ); - - } catch (Exception ex) { - - RSServerAdmin.getInstance() - .getLogger() - .warning( - "Failed to open Creeper Block Damage menu: " - + ex.getMessage() - ); - - } - - } - - case 15 -> { - - try { - - player.openInventory( - CreeperEntityDamageMenu.create( - 1 - ) - ); - - } catch (Exception ex) { - - RSServerAdmin.getInstance() - .getLogger() - .warning( - "Failed to open Creeper Entity Damage menu: " - + ex.getMessage() - ); - - } - - } - - } - - } - - /* - | Keep Inventory - */ - - case "KEEP_INVENTORY" -> { - - if (!(event.getWhoClicked() instanceof Player player)) { - return; - } - - switch (event.getSlot()) { - - case 3 -> player.openInventory( - com.rsscripting.serveradmin.gui.MainMenu.create() - ); - - case 5 -> { - - try { - - RSServerAdmin.getInstance() - .getSettingsDAO() - .toggleDefault( - SettingKey.KEEP_INVENTORY_NEW_WORLD - ); - - player.openInventory( - KeepInventoryMenu.create( - holder.getPage() - ) - ); - - } catch (Exception ex) { - - RSServerAdmin.getInstance() - .getLogger() - .warning( - "Failed to update Keep Inventory default: " - + ex.getMessage() - ); - - } - - } - - default -> { - - if (event.getSlot() < 9) { - return; - } - - try { - - KeepInventoryDAO dao = - RSServerAdmin.getInstance() - .getKeepInventoryDAO(); - - 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 = - dao.getWorldSetting( - worldName - ); - - dao.setWorldSetting( - worldName, - !enabled - ); - - World world = - Bukkit.getWorld( - worldName - ); - - if (world != null) { - - world.setGameRule( - GameRule.KEEP_INVENTORY, - !enabled - ); - - } - - player.openInventory( - KeepInventoryMenu.create( - holder.getPage() - ) - ); - - } catch (Exception ex) { - - RSServerAdmin.getInstance() - .getLogger() - .warning( - "Failed to update Keep Inventory world setting: " - + ex.getMessage() - ); - - } - - } - - } - - } - - 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() - ); - - } - - } - - } - - } - - case "MOB_EQUIPMENT" -> { - - if (!(event.getWhoClicked() instanceof Player player)) { - return; - } - - switch (event.getSlot()) { - - case 4 -> player.openInventory( - MainMenu.create() - ); - - } - - } - - case "MOB_EQUIPMENT_WORLDS" -> { - - if (!(event.getWhoClicked() instanceof Player player)) { - return; - } - - switch (event.getSlot()) { - - case 4 -> { - - player.openInventory( - MainMenu.create() - ); - - } - - default -> { - - 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; - - } - - player.openInventory( - MobEquipmentSettingsMenu.create( - worldName - ) - ); - - } - - } - - } - - case "MOB_EQUIPMENT_SETTINGS" -> { - - if (!(event.getWhoClicked() instanceof Player player)) { - return; - } - - switch (event.getSlot()) { - - case 4 -> { - - try { - - player.openInventory( - MobEquipmentWorldMenu.create( - 1 - ) - ); - - } catch (Exception ex) { - - RSServerAdmin.getInstance() - .getLogger() - .warning( - "Failed to open Mob Equipment world menu: " - + ex.getMessage() - ); - - } - - } - - } - - } - - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/KeepInventoryListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/KeepInventoryListener.java new file mode 100644 index 0000000..34d6b51 --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/listeners/KeepInventoryListener.java @@ -0,0 +1,192 @@ +package com.rsscripting.serveradmin.listeners; + +import com.rsscripting.serveradmin.RSServerAdmin; +import com.rsscripting.serveradmin.dao.KeepInventoryDAO; +import com.rsscripting.serveradmin.gui.KeepInventoryMenu; +import com.rsscripting.serveradmin.gui.MainMenu; +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; +import com.rsscripting.serveradmin.settings.SettingKey; + +import org.bukkit.Bukkit; +import org.bukkit.GameRule; +import org.bukkit.World; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; + +public class KeepInventoryListener implements Listener { + + @EventHandler + public void onInventoryClick( + InventoryClickEvent event + ) { + + if (!(event.getInventory().getHolder() + instanceof RSMenuHolder holder)) { + + return; + + } + + if (!holder.getMenuId().equals( + "KEEP_INVENTORY" + )) { + + return; + + } + + if (event.getClickedInventory() == null) { + return; + } + + if (event.getClickedInventory() + != event.getView().getTopInventory()) { + + return; + + } + + event.setCancelled( + true + ); + + if (!(event.getWhoClicked() + instanceof Player player)) { + + return; + + } + + switch (event.getSlot()) { + + case 3 -> player.openInventory( + MainMenu.create() + ); + + case 5 -> { + + try { + + RSServerAdmin.getInstance() + .getSettingsDAO() + .toggleDefault( + SettingKey.KEEP_INVENTORY_NEW_WORLD + ); + + player.openInventory( + KeepInventoryMenu.create( + holder.getPage() + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to update Keep Inventory default: " + + ex.getMessage() + ); + + } + + } + + default -> { + + if (event.getSlot() < 9) { + return; + } + + try { + + KeepInventoryDAO dao = + RSServerAdmin.getInstance() + .getKeepInventoryDAO(); + + 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 = + dao.getWorldSetting( + worldName + ); + + dao.setWorldSetting( + worldName, + !enabled + ); + + World world = + Bukkit.getWorld( + worldName + ); + + if (world != null) { + + world.setGameRule( + GameRule.KEEP_INVENTORY, + !enabled + ); + + } + + player.openInventory( + KeepInventoryMenu.create( + holder.getPage() + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to update Keep Inventory world setting: " + + ex.getMessage() + ); + + } + + } + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/MainMenuListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/MainMenuListener.java new file mode 100644 index 0000000..ebdf3ba --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/listeners/MainMenuListener.java @@ -0,0 +1,199 @@ +package com.rsscripting.serveradmin.listeners; + +import com.rsscripting.serveradmin.gui.*; +import com.rsscripting.serveradmin.RSServerAdmin; +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; +import com.rsscripting.serveradmin.settings.SettingKey; +import com.rsscripting.serveradmin.gui.MobEquipmentWorldMenu; +import com.rsscripting.serveradmin.gui.MobEquipmentSettingsMenu; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.NamespacedKey; +import org.bukkit.persistence.PersistentDataType; + +public class MainMenuListener implements Listener { + + @EventHandler + public void onInventoryClick(InventoryClickEvent event) { + + if (!(event.getInventory().getHolder() instanceof RSMenuHolder holder)) { + return; + } + + if (event.getClickedInventory() == null) { + return; + } + + if (event.getClickedInventory() != event.getView().getTopInventory()) { + return; + } + + event.setCancelled(true); + + switch (holder.getMenuId()) { + + case "main" -> { + + if (!(event.getWhoClicked() instanceof Player player)) { + return; + } + + switch (event.getSlot()) { + + /* + | Rescan for new worlds + */ + + case 4 -> { + + try { + + boolean keepInventoryDefault = + RSServerAdmin.getInstance() + .getSettingsDAO() + .getDefault( + SettingKey.KEEP_INVENTORY_NEW_WORLD + ); + + boolean blockDamageDefault = + RSServerAdmin.getInstance() + .getSettingsDAO() + .getDefault( + SettingKey.CREEPER_BLOCK_DAMAGE + ); + + boolean entityDamageDefault = + RSServerAdmin.getInstance() + .getSettingsDAO() + .getDefault( + SettingKey.CREEPER_ENTITY_DAMAGE + ); + + for (org.bukkit.World world + : org.bukkit.Bukkit.getWorlds()) { + + RSServerAdmin.getInstance() + .getWorldsDAO() + .ensureWorldExists( + world.getName() + ); + + RSServerAdmin.getInstance() + .getKeepInventoryDAO() + .ensureWorldExists( + world.getName(), + keepInventoryDefault + ); + + RSServerAdmin.getInstance() + .getCreeperSettingsDAO() + .ensureWorldExists( + world.getName(), + blockDamageDefault, + entityDamageDefault + ); + + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO() + .ensureWorldExists( + world.getName() + ); + + } + + player.sendMessage( + "§aWorld scan complete." + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "World scan failed: " + + ex.getMessage() + ); + + player.sendMessage( + "§cWorld scan failed." + ); + + } + + } + + /* + | Mob Inventory Drop + */ + + case 13 -> { + + try { + + player.openInventory( + MobEquipmentWorldMenu.create( + 1 + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to open Mob Equipment menu: " + + ex.getMessage() + ); + + } + + } + + /* + | Creeper menu + */ + + case 11 -> player.openInventory( + CreeperMenu.create() + ); + + /* + | Keep Inventory Menu + */ + + case 15 -> { + + try { + + player.openInventory( + KeepInventoryMenu.create( + 1 + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to open Keep Inventory menu: " + + ex.getMessage() + ); + + } + + } + + } + + } + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/MobEquipmentDropListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/MobEquipmentDropListener.java new file mode 100644 index 0000000..8da07eb --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/listeners/MobEquipmentDropListener.java @@ -0,0 +1,137 @@ +package com.rsscripting.serveradmin.listeners; + +import com.rsscripting.serveradmin.RSServerAdmin; +import com.rsscripting.serveradmin.dao.MobEquipmentDropSettingsDAO; + +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.ItemStack; + +public class MobEquipmentDropListener implements Listener { + + @EventHandler + public void onEntityDeath( + EntityDeathEvent event + ) { + + LivingEntity entity = + event.getEntity(); + + EntityEquipment equipment = + entity.getEquipment(); + + if (equipment == null) { + return; + } + + String worldName = + entity.getWorld() + .getName(); + + try { + + MobEquipmentDropSettingsDAO dao = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO(); + + ItemStack helmet = + equipment.getHelmet(); + + if (dao.getHelmet(worldName) + && helmet != null + && !helmet.getType().isAir() + && !event.getDrops().contains(helmet)) { + + event.getDrops().add( + helmet.clone() + ); + + } + + ItemStack chestplate = + equipment.getChestplate(); + + if (dao.getChestplate(worldName) + && chestplate != null + && !chestplate.getType().isAir() + && !event.getDrops().contains(chestplate)) { + + event.getDrops().add( + chestplate.clone() + ); + + } + + ItemStack leggings = + equipment.getLeggings(); + + if (dao.getLeggings(worldName) + && leggings != null + && !leggings.getType().isAir() + && !event.getDrops().contains(leggings)) { + + event.getDrops().add( + leggings.clone() + ); + + } + + ItemStack boots = + equipment.getBoots(); + + if (dao.getBoots(worldName) + && boots != null + && !boots.getType().isAir() + && !event.getDrops().contains(boots)) { + + event.getDrops().add( + boots.clone() + ); + + } + + ItemStack mainHand = + equipment.getItemInMainHand(); + + if (dao.getMainHand(worldName) + && mainHand != null + && !mainHand.getType().isAir() + && !event.getDrops().contains(mainHand)) { + + event.getDrops().add( + mainHand.clone() + ); + + } + + ItemStack offHand = + equipment.getItemInOffHand(); + + if (dao.getOffHand(worldName) + && offHand != null + && !offHand.getType().isAir() + && !event.getDrops().contains(offHand)) { + + event.getDrops().add( + offHand.clone() + ); + + } + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to process equipment drops: " + + ex.getMessage() + ); + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/MobEquipmentMenuListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/MobEquipmentMenuListener.java new file mode 100644 index 0000000..65bdd37 --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/listeners/MobEquipmentMenuListener.java @@ -0,0 +1,374 @@ +package com.rsscripting.serveradmin.listeners; + +import com.rsscripting.serveradmin.RSServerAdmin; +import com.rsscripting.serveradmin.dao.MobEquipmentDropSettingsDAO; +import com.rsscripting.serveradmin.gui.MainMenu; +import com.rsscripting.serveradmin.gui.MobEquipmentSettingsMenu; +import com.rsscripting.serveradmin.gui.MobEquipmentWorldMenu; +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; + +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; + +public class MobEquipmentMenuListener implements Listener { + + @EventHandler + public void onInventoryClick( + InventoryClickEvent event + ) { + + if (!(event.getInventory().getHolder() + instanceof RSMenuHolder holder)) { + + return; + + } + + if (event.getClickedInventory() == null) { + return; + } + + if (event.getClickedInventory() + != event.getView().getTopInventory()) { + + return; + + } + + event.setCancelled( + true + ); + + switch (holder.getMenuId()) { + + case "MOB_EQUIPMENT" -> { + + if (!(event.getWhoClicked() instanceof Player player)) { + return; + } + + switch (event.getSlot()) { + + case 4 -> player.openInventory( + MainMenu.create() + ); + + } + + } + + case "MOB_EQUIPMENT_WORLDS" -> { + + if (!(event.getWhoClicked() instanceof Player player)) { + return; + } + + switch (event.getSlot()) { + + case 4 -> { + + player.openInventory( + MainMenu.create() + ); + + } + + default -> { + + 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; + + } + + player.openInventory( + MobEquipmentSettingsMenu.create( + worldName + ) + ); + + } + + } + + } + + case "MOB_EQUIPMENT_SETTINGS" -> { + + if (!(event.getWhoClicked() instanceof Player player)) { + return; + } + + String worldName = + holder.getWorldName(); + + switch (event.getSlot()) { + + case 4 -> { + + try { + + player.openInventory( + MobEquipmentWorldMenu.create( + 1 + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to open Mob Equipment world menu: " + + ex.getMessage() + ); + + } + + } + + case 22 -> { + + try { + + MobEquipmentDropSettingsDAO dao = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO(); + + dao.setHelmet( + worldName, + !dao.getHelmet( + worldName + ) + ); + + player.openInventory( + MobEquipmentSettingsMenu.create( + worldName + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to toggle helmet: " + + ex.getMessage() + ); + + } + + } + + case 30 -> { + + try { + + MobEquipmentDropSettingsDAO dao = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO(); + + dao.setOffHand( + worldName, + !dao.getOffHand( + worldName + ) + ); + + player.openInventory( + MobEquipmentSettingsMenu.create( + worldName + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to toggle offhand: " + + ex.getMessage() + ); + + } + + } + + case 31 -> { + + try { + + MobEquipmentDropSettingsDAO dao = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO(); + + dao.setChestplate( + worldName, + !dao.getChestplate( + worldName + ) + ); + + player.openInventory( + MobEquipmentSettingsMenu.create( + worldName + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to toggle chestplate: " + + ex.getMessage() + ); + + } + + } + + case 32 -> { + + try { + + MobEquipmentDropSettingsDAO dao = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO(); + + dao.setMainHand( + worldName, + !dao.getMainHand( + worldName + ) + ); + + player.openInventory( + MobEquipmentSettingsMenu.create( + worldName + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to toggle main hand: " + + ex.getMessage() + ); + + } + + } + + case 40 -> { + + try { + + MobEquipmentDropSettingsDAO dao = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO(); + + dao.setLeggings( + worldName, + !dao.getLeggings( + worldName + ) + ); + + player.openInventory( + MobEquipmentSettingsMenu.create( + worldName + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to toggle leggings: " + + ex.getMessage() + ); + + } + + } + + case 49 -> { + + try { + + MobEquipmentDropSettingsDAO dao = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO(); + + dao.setBoots( + worldName, + !dao.getBoots( + worldName + ) + ); + + player.openInventory( + MobEquipmentSettingsMenu.create( + worldName + ) + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to toggle boots: " + + ex.getMessage() + ); + + } + + } + + } + + } + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/utils/WorldSyncUtils.java b/src/main/java/com/rsscripting/serveradmin/utils/WorldSyncUtils.java new file mode 100644 index 0000000..5991d84 --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/utils/WorldSyncUtils.java @@ -0,0 +1,113 @@ +package com.rsscripting.serveradmin.utils; + +import com.rsscripting.serveradmin.RSServerAdmin; +import com.rsscripting.serveradmin.settings.SettingKey; + +import org.bukkit.Bukkit; +import org.bukkit.World; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class WorldSyncUtils { + + public static void synchronizeWorlds() + throws Exception { + + RSServerAdmin plugin = + RSServerAdmin.getInstance(); + + boolean keepInventoryDefault = + plugin.getSettingsDAO() + .getDefault( + SettingKey.KEEP_INVENTORY_NEW_WORLD + ); + + boolean blockDamageDefault = + plugin.getSettingsDAO() + .getDefault( + SettingKey.CREEPER_BLOCK_DAMAGE + ); + + boolean entityDamageDefault = + plugin.getSettingsDAO() + .getDefault( + SettingKey.CREEPER_ENTITY_DAMAGE + ); + + Set bukkitWorlds = + new HashSet<>(); + + /* + | Add missing worlds + */ + + for (World world : Bukkit.getWorlds()) { + + String worldName = + world.getName(); + + bukkitWorlds.add( + worldName + ); + + plugin.getWorldsDAO() + .ensureWorldExists( + worldName + ); + + plugin.getKeepInventoryDAO() + .ensureWorldExists( + worldName, + keepInventoryDefault + ); + + plugin.getCreeperSettingsDAO() + .ensureWorldExists( + worldName, + blockDamageDefault, + entityDamageDefault + ); + + plugin.getEquipmentDropSettingsDAO() + .ensureWorldExists( + worldName + ); + + } + + /* + | Remove deleted worlds + */ + + List databaseWorlds = + plugin.getWorldsDAO() + .getAllWorlds(); + + for (String worldName + : databaseWorlds) { + + if (bukkitWorlds.contains( + worldName + )) { + + continue; + + } + + plugin.getWorldsDAO() + .deleteWorldEverywhere( + worldName + ); + + plugin.getLogger().info( + "Removed stale world settings for: " + + worldName + ); + + } + + } + +} \ No newline at end of file