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
This commit is contained in:
BigPappa committed 2026-06-15 07:01:47 -05:00
1 parent ebf030b192
commit 73a0ef8ae6
23 files changed
+1203 -73

No files matched your search

@@ -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;
@@ -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;
@@ -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()
);
}
@@ -1,66 +0,0 @@
package com.rsscripting.serveradmin.gui;
import org.bukkit.Material;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
public class GUIUtils {
private GUIUtils() {
}
public static ItemStack createFiller() {
ItemStack item =
new ItemStack(Material.LIGHT_BLUE_STAINED_GLASS_PANE);
ItemMeta meta = item.getItemMeta();
if (meta != null) {
meta.setDisplayName(" ");
item.setItemMeta(meta);
}
return item;
}
public static void fillEmptySlots(Inventory inventory) {
ItemStack filler = createFiller();
for (int slot = 0; slot < inventory.getSize(); slot++) {
if (inventory.getItem(slot) == null) {
inventory.setItem(slot, filler);
}
}
}
public static void addGlow(ItemStack item) {
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return;
}
meta.addEnchant(
Enchantment.UNBREAKING,
1,
true
);
meta.addItemFlags(
ItemFlag.HIDE_ENCHANTS
);
item.setItemMeta(meta);
}
}
@@ -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;
@@ -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);
@@ -1,70 +0,0 @@
package com.rsscripting.serveradmin.gui;
import java.util.ArrayList;
import java.util.List;
public class MenuLayoutUtils {
public static List<Integer> getCenteredSlots(
int itemCount
) {
List<Integer> 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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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<String> 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<Integer> rowSlots =
MenuLayoutUtils.getCenteredSlots(
itemsRemaining
);
slot =
9
+ (row * 9)
+ rowSlots.get(
indexInRow
);
} else {
slot =
9
+ (row * 9)
+ indexInRow;
}
inventory.setItem(
slot,
item
);
}
}
}
@@ -1,57 +0,0 @@
package com.rsscripting.serveradmin.gui;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.jetbrains.annotations.NotNull;
public class RSMenuHolder
implements InventoryHolder {
private final String menuId;
private int page = 1;
public RSMenuHolder(
String menuId
) {
this.menuId = menuId;
}
public String getMenuId() {
return menuId;
}
public int getPage() {
return page;
}
public void setPage(
int page
) {
if (page < 1) {
page = 1;
}
this.page = page;
}
@Override
public @NotNull Inventory getInventory() {
throw new UnsupportedOperationException(
"RSMenuHolder does not store an inventory."
);
}
}