diff --git a/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java b/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java index b658000..93bd66b 100644 --- a/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java +++ b/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java @@ -1,19 +1,16 @@ package com.rsscripting.serveradmin; +import com.rsscripting.serveradmin.dao.*; 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.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; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.Bukkit; import org.bukkit.World; @@ -29,6 +26,7 @@ public class RSServerAdmin extends JavaPlugin { private SecurityManager securityManager; private WorldsDAO worldsDAO; private CreeperSettingsDAO creeperSettingsDAO; + private EquipmentDropSettingsDAO equipmentDropSettingsDAO; @Override public void onEnable() { @@ -62,6 +60,11 @@ public class RSServerAdmin extends JavaPlugin { databaseManager ); + equipmentDropSettingsDAO = + new EquipmentDropSettingsDAO( + databaseManager + ); + securityManager = new SecurityManager(this); boolean keepInventoryDefault = @@ -96,6 +99,10 @@ public class RSServerAdmin extends JavaPlugin { entityDamageDefault ); + equipmentDropSettingsDAO.ensureWorldExists( + world.getName() + ); + } if (getCommand("rsadmin") != null) { @@ -188,4 +195,11 @@ public class RSServerAdmin extends JavaPlugin { return creeperSettingsDAO; } + public EquipmentDropSettingsDAO + getEquipmentDropSettingsDAO() { + + return equipmentDropSettingsDAO; + + } + } \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/commands/RSAdminCommand.java b/src/main/java/com/rsscripting/serveradmin/commands/RSAdminCommand.java index f8ad9e8..c199c6a 100644 --- a/src/main/java/com/rsscripting/serveradmin/commands/RSAdminCommand.java +++ b/src/main/java/com/rsscripting/serveradmin/commands/RSAdminCommand.java @@ -6,6 +6,8 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; public class RSAdminCommand implements CommandExecutor { @@ -17,10 +19,10 @@ public class RSAdminCommand implements CommandExecutor { @Override public boolean onCommand( - CommandSender sender, - Command command, - String label, - String[] args + @NotNull CommandSender sender, + @NotNull Command command, + @NotNull String label, + @NotNull String @NonNull [] args ) { if (!(sender instanceof Player player)) { diff --git a/src/main/java/com/rsscripting/serveradmin/creeper/CreeperSettingsDAO.java b/src/main/java/com/rsscripting/serveradmin/dao/CreeperSettingsDAO.java similarity index 99% rename from src/main/java/com/rsscripting/serveradmin/creeper/CreeperSettingsDAO.java rename to src/main/java/com/rsscripting/serveradmin/dao/CreeperSettingsDAO.java index b62f174..4776e15 100644 --- a/src/main/java/com/rsscripting/serveradmin/creeper/CreeperSettingsDAO.java +++ b/src/main/java/com/rsscripting/serveradmin/dao/CreeperSettingsDAO.java @@ -1,4 +1,4 @@ -package com.rsscripting.serveradmin.creeper; +package com.rsscripting.serveradmin.dao; import com.rsscripting.serveradmin.database.DatabaseManager; diff --git a/src/main/java/com/rsscripting/serveradmin/dao/EquipmentDropSettingsDAO.java b/src/main/java/com/rsscripting/serveradmin/dao/EquipmentDropSettingsDAO.java new file mode 100644 index 0000000..c0c8669 --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/dao/EquipmentDropSettingsDAO.java @@ -0,0 +1,272 @@ +package com.rsscripting.serveradmin.dao; + +import com.rsscripting.serveradmin.database.DatabaseManager; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class EquipmentDropSettingsDAO { + + private final DatabaseManager databaseManager; + + public EquipmentDropSettingsDAO( + DatabaseManager databaseManager + ) { + + this.databaseManager = + databaseManager; + + } + + public void ensureWorldExists( + String worldName + ) throws SQLException { + + Connection connection = + databaseManager.getConnection(); + + try (PreparedStatement statement = + connection.prepareStatement( + """ + INSERT OR IGNORE INTO equipment_drop_settings ( + world_name, + helmet, + chestplate, + leggings, + boots, + main_hand, + off_hand + ) + VALUES (?, 1, 1, 1, 1, 1, 1) + """ + )) { + + statement.setString( + 1, + worldName + ); + + statement.executeUpdate(); + + } + + } + + public boolean getHelmet( + String worldName + ) throws SQLException { + + return getValue( + worldName, + "helmet" + ); + + } + + public void setHelmet( + String worldName, + boolean enabled + ) throws SQLException { + + setValue( + worldName, + "helmet", + enabled + ); + + } + + public boolean getChestplate( + String worldName + ) throws SQLException { + + return getValue( + worldName, + "chestplate" + ); + + } + + public void setChestplate( + String worldName, + boolean enabled + ) throws SQLException { + + setValue( + worldName, + "chestplate", + enabled + ); + + } + + public boolean getLeggings( + String worldName + ) throws SQLException { + + return getValue( + worldName, + "leggings" + ); + + } + + public void setLeggings( + String worldName, + boolean enabled + ) throws SQLException { + + setValue( + worldName, + "leggings", + enabled + ); + + } + + public boolean getBoots( + String worldName + ) throws SQLException { + + return getValue( + worldName, + "boots" + ); + + } + + public void setBoots( + String worldName, + boolean enabled + ) throws SQLException { + + setValue( + worldName, + "boots", + enabled + ); + + } + + public boolean getMainHand( + String worldName + ) throws SQLException { + + return getValue( + worldName, + "main_hand" + ); + + } + + public void setMainHand( + String worldName, + boolean enabled + ) throws SQLException { + + setValue( + worldName, + "main_hand", + enabled + ); + + } + + public boolean getOffHand( + String worldName + ) throws SQLException { + + return getValue( + worldName, + "off_hand" + ); + + } + + public void setOffHand( + String worldName, + boolean enabled + ) throws SQLException { + + setValue( + worldName, + "off_hand", + enabled + ); + + } + + private boolean getValue( + String worldName, + String column + ) throws SQLException { + + Connection connection = + databaseManager.getConnection(); + + try (PreparedStatement statement = + connection.prepareStatement( + "SELECT " + column + + " FROM equipment_drop_settings " + + "WHERE world_name = ?" + )) { + + statement.setString( + 1, + worldName + ); + + try (ResultSet result = + statement.executeQuery()) { + + if (result.next()) { + + return result.getBoolean( + column + ); + + } + + } + + } + + return true; + + } + + private void setValue( + String worldName, + String column, + boolean enabled + ) throws SQLException { + + Connection connection = + databaseManager.getConnection(); + + try (PreparedStatement statement = + connection.prepareStatement( + "UPDATE equipment_drop_settings " + + "SET " + column + + " = ? WHERE world_name = ?" + )) { + + statement.setBoolean( + 1, + enabled + ); + + statement.setString( + 2, + worldName + ); + + statement.executeUpdate(); + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/keepinventory/KeepInventoryDAO.java b/src/main/java/com/rsscripting/serveradmin/dao/KeepInventoryDAO.java similarity index 78% rename from src/main/java/com/rsscripting/serveradmin/keepinventory/KeepInventoryDAO.java rename to src/main/java/com/rsscripting/serveradmin/dao/KeepInventoryDAO.java index 7683c49..df99816 100644 --- a/src/main/java/com/rsscripting/serveradmin/keepinventory/KeepInventoryDAO.java +++ b/src/main/java/com/rsscripting/serveradmin/dao/KeepInventoryDAO.java @@ -1,4 +1,4 @@ -package com.rsscripting.serveradmin.keepinventory; +package com.rsscripting.serveradmin.dao; import com.rsscripting.serveradmin.database.DatabaseManager; @@ -139,41 +139,4 @@ public class KeepInventoryDAO { } - public java.util.List getAllWorlds() - throws SQLException { - - java.util.List worlds = - new java.util.ArrayList<>(); - - Connection connection = - databaseManager.getConnection(); - - try (PreparedStatement statement = - connection.prepareStatement( - """ - SELECT world_name - FROM keep_inventory - ORDER BY world_name - """ - ); - - ResultSet rs = - statement.executeQuery()) { - - while (rs.next()) { - - worlds.add( - rs.getString( - "world_name" - ) - ); - - } - - } - - return worlds; - - } - } \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/database/SettingsDAO.java b/src/main/java/com/rsscripting/serveradmin/dao/SettingsDAO.java similarity index 93% rename from src/main/java/com/rsscripting/serveradmin/database/SettingsDAO.java rename to src/main/java/com/rsscripting/serveradmin/dao/SettingsDAO.java index e4e0314..63e2bb8 100644 --- a/src/main/java/com/rsscripting/serveradmin/database/SettingsDAO.java +++ b/src/main/java/com/rsscripting/serveradmin/dao/SettingsDAO.java @@ -1,5 +1,6 @@ -package com.rsscripting.serveradmin.database; +package com.rsscripting.serveradmin.dao; +import com.rsscripting.serveradmin.database.DatabaseManager; import com.rsscripting.serveradmin.settings.SettingKey; import java.sql.Connection; @@ -50,9 +51,9 @@ public class SettingsDAO { case KEEP_INVENTORY -> true; case CREEPER_BLOCK_DAMAGE, - CREEPER_ENTITY_DAMAGE -> false; + CREEPER_ENTITY_DAMAGE, + KEEP_INVENTORY_NEW_WORLD -> false; - case KEEP_INVENTORY_NEW_WORLD -> false; }; } diff --git a/src/main/java/com/rsscripting/serveradmin/worlds/WorldsDAO.java b/src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java similarity index 97% rename from src/main/java/com/rsscripting/serveradmin/worlds/WorldsDAO.java rename to src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java index 3800c78..c0b3341 100644 --- a/src/main/java/com/rsscripting/serveradmin/worlds/WorldsDAO.java +++ b/src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java @@ -1,4 +1,4 @@ -package com.rsscripting.serveradmin.worlds; +package com.rsscripting.serveradmin.dao; import com.rsscripting.serveradmin.database.DatabaseManager; diff --git a/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java b/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java index cebc840..94dfa07 100644 --- a/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java +++ b/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java @@ -22,7 +22,15 @@ public class DatabaseManager { File dataFolder = plugin.getDataFolder(); if (!dataFolder.exists()) { - dataFolder.mkdirs(); + + if (!dataFolder.mkdirs()) { + + throw new SQLException( + "Failed to create plugin data folder." + ); + + } + } File databaseFile = new File( @@ -86,6 +94,20 @@ public class DatabaseManager { """ ); + statement.execute( + """ + CREATE TABLE IF NOT EXISTS equipment_drop_settings ( + world_name TEXT PRIMARY KEY, + helmet INTEGER NOT NULL, + chestplate INTEGER NOT NULL, + leggings INTEGER NOT NULL, + boots INTEGER NOT NULL, + main_hand INTEGER NOT NULL, + off_hand 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 index 7b43ca1..e6286be 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/CreeperBlockDamageMenu.java +++ b/src/main/java/com/rsscripting/serveradmin/gui/CreeperBlockDamageMenu.java @@ -1,8 +1,11 @@ package com.rsscripting.serveradmin.gui; import com.rsscripting.serveradmin.RSServerAdmin; -import com.rsscripting.serveradmin.creeper.CreeperSettingsDAO; +import com.rsscripting.serveradmin.dao.CreeperSettingsDAO; +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; import com.rsscripting.serveradmin.settings.SettingKey; +import com.rsscripting.serveradmin.utils.GUIUtils; +import com.rsscripting.serveradmin.utils.MenuLayoutUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; diff --git a/src/main/java/com/rsscripting/serveradmin/gui/CreeperEntityDamageMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/CreeperEntityDamageMenu.java index 5f9672d..a885c97 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/CreeperEntityDamageMenu.java +++ b/src/main/java/com/rsscripting/serveradmin/gui/CreeperEntityDamageMenu.java @@ -1,8 +1,11 @@ package com.rsscripting.serveradmin.gui; import com.rsscripting.serveradmin.RSServerAdmin; -import com.rsscripting.serveradmin.creeper.CreeperSettingsDAO; +import com.rsscripting.serveradmin.dao.CreeperSettingsDAO; +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; import com.rsscripting.serveradmin.settings.SettingKey; +import com.rsscripting.serveradmin.utils.GUIUtils; +import com.rsscripting.serveradmin.utils.MenuLayoutUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; diff --git a/src/main/java/com/rsscripting/serveradmin/gui/CreeperMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/CreeperMenu.java index df23aa7..afd4ad7 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/CreeperMenu.java +++ b/src/main/java/com/rsscripting/serveradmin/gui/CreeperMenu.java @@ -1,8 +1,10 @@ package 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.utils.GUIUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.Inventory; @@ -111,13 +113,22 @@ public class CreeperMenu { } catch (Exception ex) { - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to build Creeper menu: " + + ex.getMessage() + ); } } catch (Exception ex) { - - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to build Creeper menu: " + + ex.getMessage() + ); } diff --git a/src/main/java/com/rsscripting/serveradmin/gui/KeepInventoryMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/KeepInventoryMenu.java index f7dd71a..e14d3dd 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/KeepInventoryMenu.java +++ b/src/main/java/com/rsscripting/serveradmin/gui/KeepInventoryMenu.java @@ -1,9 +1,12 @@ package com.rsscripting.serveradmin.gui; import com.rsscripting.serveradmin.RSServerAdmin; -import com.rsscripting.serveradmin.keepinventory.KeepInventoryDAO; +import com.rsscripting.serveradmin.dao.KeepInventoryDAO; +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; import com.rsscripting.serveradmin.settings.SettingKey; +import com.rsscripting.serveradmin.utils.GUIUtils; +import com.rsscripting.serveradmin.utils.MenuLayoutUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.Inventory; diff --git a/src/main/java/com/rsscripting/serveradmin/gui/MainMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/MainMenu.java index da45c66..3dafc49 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/MainMenu.java +++ b/src/main/java/com/rsscripting/serveradmin/gui/MainMenu.java @@ -1,9 +1,7 @@ package com.rsscripting.serveradmin.gui; -import com.rsscripting.serveradmin.gui.GUIUtils; -import com.rsscripting.serveradmin.gui.RSMenuHolder; -import com.rsscripting.serveradmin.gui.KeepInventoryMenu; - +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; +import com.rsscripting.serveradmin.utils.GUIUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.Inventory; @@ -57,6 +55,31 @@ public class MainMenu { inventory.setItem(11, creeper); + ItemStack mobDrops = + new ItemStack( + Material.SKELETON_SKULL + ); + + ItemMeta mobDropsMeta = + mobDrops.getItemMeta(); + + if (mobDropsMeta != null) { + + mobDropsMeta.setDisplayName( + "§aMob Equipment Drops" + ); + + mobDrops.setItemMeta( + mobDropsMeta + ); + + } + + inventory.setItem( + 13, + mobDrops + ); + ItemStack keepInventory = new ItemStack(Material.CHEST); diff --git a/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentMenu.java new file mode 100644 index 0000000..edeb97e --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentMenu.java @@ -0,0 +1,122 @@ +package com.rsscripting.serveradmin.gui; + +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; +import com.rsscripting.serveradmin.utils.GUIUtils; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class MobEquipmentMenu { + + public static Inventory create() { + + RSMenuHolder holder = + new RSMenuHolder( + "MOB_EQUIPMENT" + ); + + Inventory inventory = + Bukkit.createInventory( + holder, + 27, + "Mob Equipment Drops" + ); + + GUIUtils.fillEmptySlots( + inventory + ); + + /* + | Back + */ + + ItemStack back = + new ItemStack( + Material.ARROW + ); + + ItemMeta backMeta = + back.getItemMeta(); + + if (backMeta != null) { + + backMeta.setDisplayName( + "§cBack" + ); + + back.setItemMeta( + backMeta + ); + + } + + inventory.setItem( + 4, + back + ); + + /* + | Armor Drops + */ + + ItemStack armor = + new ItemStack( + Material.DIAMOND_CHESTPLATE + ); + + ItemMeta armorMeta = + armor.getItemMeta(); + + if (armorMeta != null) { + + armorMeta.setDisplayName( + "§aArmor Drops" + ); + + armor.setItemMeta( + armorMeta + ); + + } + + inventory.setItem( + 11, + armor + ); + + /* + | Hand Item Drops + */ + + ItemStack hands = + new ItemStack( + Material.DIAMOND_SWORD + ); + + ItemMeta handMeta = + hands.getItemMeta(); + + if (handMeta != null) { + + handMeta.setDisplayName( + "§aHand Item Drops" + ); + + hands.setItemMeta( + handMeta + ); + + } + + inventory.setItem( + 15, + hands + ); + + return inventory; + + } + +} \ 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 new file mode 100644 index 0000000..dcb015f --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentSettingsMenu.java @@ -0,0 +1,268 @@ +package com.rsscripting.serveradmin.gui; + +import com.rsscripting.serveradmin.RSServerAdmin; +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; +import com.rsscripting.serveradmin.utils.GUIUtils; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class MobEquipmentSettingsMenu { + + public static Inventory create( + String worldName + ) { + + RSMenuHolder holder = + new RSMenuHolder( + "MOB_EQUIPMENT_SETTINGS" + ); + + holder.setWorldName( + worldName + ); + + boolean helmetEnabled = true; + boolean chestplateEnabled = true; + boolean leggingsEnabled = true; + boolean bootsEnabled = true; + boolean mainHandEnabled = true; + boolean offHandEnabled = true; + + try { + + helmetEnabled = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO() + .getHelmet( + worldName + ); + + chestplateEnabled = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO() + .getChestplate( + worldName + ); + + leggingsEnabled = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO() + .getLeggings( + worldName + ); + + bootsEnabled = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO() + .getBoots( + worldName + ); + + mainHandEnabled = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO() + .getMainHand( + worldName + ); + + offHandEnabled = + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO() + .getOffHand( + worldName + ); + + } catch (Exception ex) { + + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to load equipment drop settings for " + + worldName + + ": " + + ex.getMessage() + ); + + } + + Inventory inventory = + Bukkit.createInventory( + holder, + 54, + "Equipment: " + worldName + ); + + GUIUtils.fillEmptySlots( + inventory + ); + + /* + | Back + */ + + ItemStack back = + new ItemStack( + Material.ARROW + ); + + ItemMeta backMeta = + back.getItemMeta(); + + if (backMeta != null) { + + backMeta.setDisplayName( + "§cBack" + ); + + back.setItemMeta( + backMeta + ); + + } + + inventory.setItem( + 4, + back + ); + + /* + | Helmet + */ + + ItemStack helmet = + new ItemStack( + Material.LEATHER_HELMET + ); + + if (helmetEnabled) { + + GUIUtils.addGlow( + helmet + ); + + } + + inventory.setItem( + 13, + helmet + ); + + /* + | Off Hand + */ + + ItemStack offHand = + new ItemStack( + Material.SHIELD + ); + + if (offHandEnabled) { + + GUIUtils.addGlow( + offHand + ); + + } + + inventory.setItem( + 20, + offHand + ); + + /* + | Chestplate + */ + + ItemStack chestplate = + new ItemStack( + Material.LEATHER_CHESTPLATE + ); + + if (chestplateEnabled) { + + GUIUtils.addGlow( + chestplate + ); + + } + + inventory.setItem( + 21, + chestplate + ); + + /* + | Main Hand + */ + + ItemStack mainHand = + new ItemStack( + Material.IRON_SWORD + ); + + if (mainHandEnabled) { + + GUIUtils.addGlow( + mainHand + ); + + } + + inventory.setItem( + 22, + mainHand + ); + + /* + | Leggings + */ + + ItemStack leggings = + new ItemStack( + Material.LEATHER_LEGGINGS + ); + + if (leggingsEnabled) { + + GUIUtils.addGlow( + leggings + ); + + } + + inventory.setItem( + 29, + leggings + ); + + /* + | Boots + */ + + ItemStack boots = + new ItemStack( + Material.LEATHER_BOOTS + ); + + if (bootsEnabled) { + + GUIUtils.addGlow( + boots + ); + + } + + inventory.setItem( + 37, + boots + ); + + return inventory; + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentWorldMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentWorldMenu.java new file mode 100644 index 0000000..2c5c714 --- /dev/null +++ b/src/main/java/com/rsscripting/serveradmin/gui/MobEquipmentWorldMenu.java @@ -0,0 +1,205 @@ +package com.rsscripting.serveradmin.gui; + +import com.rsscripting.serveradmin.RSServerAdmin; +import com.rsscripting.serveradmin.menuholder.RSMenuHolder; +import com.rsscripting.serveradmin.utils.GUIUtils; +import com.rsscripting.serveradmin.utils.MenuLayoutUtils; + +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 MobEquipmentWorldMenu { + + private static final int WORLDS_PER_PAGE = 45; + + public static Inventory create( + int page + ) throws SQLException { + + RSMenuHolder holder = + new RSMenuHolder( + "MOB_EQUIPMENT_WORLDS" + ); + + holder.setPage( + page + ); + + Inventory inventory = + Bukkit.createInventory( + holder, + 54, + "Mob Equipment Drops" + ); + + GUIUtils.fillEmptySlots( + inventory + ); + + createBackButton( + 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( + 4, + item + ); + + } + + private static void populateWorlds( + Inventory inventory, + int page + ) throws SQLException { + + 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); + + ItemStack item = + new ItemStack( + Material.SKELETON_SKULL + ); + + 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( + "§7Configure equipment drops" + ) + ); + + 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 + ); + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/CreeperBlockDamageListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/CreeperBlockDamageListener.java index 3dae33d..ef744ca 100644 --- a/src/main/java/com/rsscripting/serveradmin/listeners/CreeperBlockDamageListener.java +++ b/src/main/java/com/rsscripting/serveradmin/listeners/CreeperBlockDamageListener.java @@ -1,7 +1,6 @@ package com.rsscripting.serveradmin.listeners; import com.rsscripting.serveradmin.RSServerAdmin; -import com.rsscripting.serveradmin.settings.SettingKey; import org.bukkit.entity.Creeper; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/CreeperEntityDamageListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/CreeperEntityDamageListener.java index 032370b..64d5079 100644 --- a/src/main/java/com/rsscripting/serveradmin/listeners/CreeperEntityDamageListener.java +++ b/src/main/java/com/rsscripting/serveradmin/listeners/CreeperEntityDamageListener.java @@ -1,7 +1,6 @@ package com.rsscripting.serveradmin.listeners; import com.rsscripting.serveradmin.RSServerAdmin; -import com.rsscripting.serveradmin.settings.SettingKey; import org.bukkit.entity.Creeper; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java index 07e5fd7..73df360 100644 --- a/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java +++ b/src/main/java/com/rsscripting/serveradmin/listeners/InventoryListener.java @@ -2,8 +2,11 @@ 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.keepinventory.KeepInventoryDAO; +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; @@ -60,6 +63,20 @@ public class InventoryListener implements Listener { 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()) { @@ -76,6 +93,20 @@ public class InventoryListener implements Listener { keepInventoryDefault ); + RSServerAdmin.getInstance() + .getCreeperSettingsDAO() + .ensureWorldExists( + world.getName(), + blockDamageDefault, + entityDamageDefault + ); + + RSServerAdmin.getInstance() + .getEquipmentDropSettingsDAO() + .ensureWorldExists( + world.getName() + ); + } player.sendMessage( @@ -84,7 +115,12 @@ public class InventoryListener implements Listener { } catch (Exception ex) { - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "World scan failed: " + + ex.getMessage() + ); player.sendMessage( "§cWorld scan failed." @@ -94,6 +130,33 @@ public class InventoryListener implements Listener { } + /* + | 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 */ @@ -118,7 +181,12 @@ public class InventoryListener implements Listener { } catch (Exception ex) { - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to open Keep Inventory menu: " + + ex.getMessage() + ); } @@ -228,7 +296,12 @@ public class InventoryListener implements Listener { } catch (Exception ex) { - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to update Keep Inventory default: " + + ex.getMessage() + ); } @@ -311,7 +384,12 @@ public class InventoryListener implements Listener { } catch (Exception ex) { - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to update Keep Inventory world setting: " + + ex.getMessage() + ); } @@ -593,6 +671,120 @@ public class InventoryListener implements Listener { } + 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() + ); + + } + + } + + } + + } + } } diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java index c9f9117..2624338 100644 --- a/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java +++ b/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java @@ -55,6 +55,11 @@ public class WorldLoadListener implements Listener { entityDamageDefault ); + plugin.getEquipmentDropSettingsDAO() + .ensureWorldExists( + event.getWorld().getName() + ); + boolean keepInventoryEnabled = plugin.getKeepInventoryDAO() .getWorldSetting( @@ -68,7 +73,14 @@ public class WorldLoadListener implements Listener { } catch (Exception ex) { - ex.printStackTrace(); + RSServerAdmin.getInstance() + .getLogger() + .warning( + "Failed to register world settings for " + + event.getWorld().getName() + + ": " + + ex.getMessage() + ); } diff --git a/src/main/java/com/rsscripting/serveradmin/gui/RSMenuHolder.java b/src/main/java/com/rsscripting/serveradmin/menuholder/RSMenuHolder.java similarity index 75% rename from src/main/java/com/rsscripting/serveradmin/gui/RSMenuHolder.java rename to src/main/java/com/rsscripting/serveradmin/menuholder/RSMenuHolder.java index 9ce94d3..bcd9aa4 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/RSMenuHolder.java +++ b/src/main/java/com/rsscripting/serveradmin/menuholder/RSMenuHolder.java @@ -1,4 +1,4 @@ -package com.rsscripting.serveradmin.gui; +package com.rsscripting.serveradmin.menuholder; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; @@ -11,6 +11,8 @@ public class RSMenuHolder private int page = 1; + private String worldName; + public RSMenuHolder( String menuId ) { @@ -45,6 +47,20 @@ public class RSMenuHolder } + public String getWorldName() { + + return worldName; + + } + + public void setWorldName( + String worldName + ) { + + this.worldName = worldName; + + } + @Override public @NotNull Inventory getInventory() { diff --git a/src/main/java/com/rsscripting/serveradmin/gui/GUIUtils.java b/src/main/java/com/rsscripting/serveradmin/utils/GUIUtils.java similarity index 96% rename from src/main/java/com/rsscripting/serveradmin/gui/GUIUtils.java rename to src/main/java/com/rsscripting/serveradmin/utils/GUIUtils.java index fab1cce..7055ca7 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/GUIUtils.java +++ b/src/main/java/com/rsscripting/serveradmin/utils/GUIUtils.java @@ -1,4 +1,4 @@ -package com.rsscripting.serveradmin.gui; +package com.rsscripting.serveradmin.utils; import org.bukkit.Material; import org.bukkit.inventory.Inventory; diff --git a/src/main/java/com/rsscripting/serveradmin/gui/MenuLayoutUtils.java b/src/main/java/com/rsscripting/serveradmin/utils/MenuLayoutUtils.java similarity index 96% rename from src/main/java/com/rsscripting/serveradmin/gui/MenuLayoutUtils.java rename to src/main/java/com/rsscripting/serveradmin/utils/MenuLayoutUtils.java index e861ddf..1775433 100644 --- a/src/main/java/com/rsscripting/serveradmin/gui/MenuLayoutUtils.java +++ b/src/main/java/com/rsscripting/serveradmin/utils/MenuLayoutUtils.java @@ -1,4 +1,4 @@ -package com.rsscripting.serveradmin.gui; +package com.rsscripting.serveradmin.utils; import java.util.ArrayList; import java.util.List;