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-14 15:54:33 -05:00
1 parent 9ca8039268
commit ebf030b192
12 files changed
+1318 -86

No files matched your search

@@ -0,0 +1,270 @@
package com.rsscripting.serveradmin.gui;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.creeper.CreeperSettingsDAO;
import com.rsscripting.serveradmin.settings.SettingKey;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataType;
import java.sql.SQLException;
import java.util.List;
public class CreeperBlockDamageMenu {
private static final int WORLDS_PER_PAGE = 45;
public static Inventory create(
int page
) throws SQLException {
RSMenuHolder holder =
new RSMenuHolder(
"CREEPER_BLOCK_DAMAGE"
);
holder.setPage(
page
);
Inventory inventory =
Bukkit.createInventory(
holder,
54,
"Block Damage"
);
GUIUtils.fillEmptySlots(
inventory
);
createBackButton(
inventory
);
createDefaultButton(
inventory
);
populateWorlds(
inventory,
page
);
return inventory;
}
private static void createBackButton(
Inventory inventory
) {
ItemStack item =
new ItemStack(
Material.ARROW
);
ItemMeta meta =
item.getItemMeta();
if (meta != null) {
meta.setDisplayName(
"§cBack"
);
item.setItemMeta(
meta
);
}
inventory.setItem(
3,
item
);
}
private static void createDefaultButton(
Inventory inventory
) throws SQLException {
boolean enabled =
RSServerAdmin.getInstance()
.getSettingsDAO()
.getDefault(
SettingKey.CREEPER_BLOCK_DAMAGE
);
ItemStack item =
new ItemStack(
enabled
? Material.ENDER_CHEST
: Material.CHEST
);
ItemMeta meta =
item.getItemMeta();
if (meta != null) {
meta.setDisplayName(
"§eDefault For New Worlds"
);
meta.setLore(
List.of(
"§7Controls newly detected worlds",
"",
enabled
? "§aCurrent: New worlds allow creeper block damage"
: "§cCurrent: New worlds block creeper block damage"
)
);
item.setItemMeta(
meta
);
}
inventory.setItem(
5,
item
);
}
private static void populateWorlds(
Inventory inventory,
int page
) throws SQLException {
CreeperSettingsDAO dao =
RSServerAdmin.getInstance()
.getCreeperSettingsDAO();
List<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);
boolean enabled =
dao.getBlockDamage(
worldName
);
ItemStack item =
new ItemStack(
enabled
? Material.LIME_SHULKER_BOX
: Material.RED_SHULKER_BOX
);
ItemMeta meta =
item.getItemMeta();
if (meta != null) {
meta.setDisplayName(
"§e" + worldName
);
meta.getPersistentDataContainer()
.set(
new NamespacedKey(
RSServerAdmin.getInstance(),
"world_name"
),
PersistentDataType.STRING,
worldName
);
meta.setLore(
List.of(
"§7Creeper Block Damage",
"",
enabled
? "§aCurrent: Creepers damage blocks"
: "§cCurrent: Creepers do not damage blocks"
)
);
item.setItemMeta(
meta
);
}
int relativeIndex =
i - start;
int row =
relativeIndex / 9;
int indexInRow =
relativeIndex % 9;
int itemsRemaining =
worldCount - (row * 9);
boolean lastPartialRow =
itemsRemaining < 9;
int slot;
if (lastPartialRow) {
List<Integer> rowSlots =
MenuLayoutUtils.getCenteredSlots(
itemsRemaining
);
slot =
9
+ (row * 9)
+ rowSlots.get(
indexInRow
);
} else {
slot =
9
+ (row * 9)
+ indexInRow;
}
inventory.setItem(
slot,
item
);
}
}
}
@@ -0,0 +1,270 @@
package com.rsscripting.serveradmin.gui;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.creeper.CreeperSettingsDAO;
import com.rsscripting.serveradmin.settings.SettingKey;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataType;
import java.sql.SQLException;
import java.util.List;
public class CreeperEntityDamageMenu {
private static final int WORLDS_PER_PAGE = 45;
public static Inventory create(
int page
) throws SQLException {
RSMenuHolder holder =
new RSMenuHolder(
"CREEPER_ENTITY_DAMAGE"
);
holder.setPage(
page
);
Inventory inventory =
Bukkit.createInventory(
holder,
54,
"Entity Damage"
);
GUIUtils.fillEmptySlots(
inventory
);
createBackButton(
inventory
);
createDefaultButton(
inventory
);
populateWorlds(
inventory,
page
);
return inventory;
}
private static void createBackButton(
Inventory inventory
) {
ItemStack item =
new ItemStack(
Material.ARROW
);
ItemMeta meta =
item.getItemMeta();
if (meta != null) {
meta.setDisplayName(
"§cBack"
);
item.setItemMeta(
meta
);
}
inventory.setItem(
3,
item
);
}
private static void createDefaultButton(
Inventory inventory
) throws SQLException {
boolean enabled =
RSServerAdmin.getInstance()
.getSettingsDAO()
.getDefault(
SettingKey.CREEPER_ENTITY_DAMAGE
);
ItemStack item =
new ItemStack(
enabled
? Material.ENDER_CHEST
: Material.CHEST
);
ItemMeta meta =
item.getItemMeta();
if (meta != null) {
meta.setDisplayName(
"§eDefault For New Worlds"
);
meta.setLore(
List.of(
"§7Controls newly detected worlds",
"",
enabled
? "§aCurrent: New worlds allow creeper entity damage"
: "§cCurrent: New worlds block creeper entity damage"
)
);
item.setItemMeta(
meta
);
}
inventory.setItem(
5,
item
);
}
private static void populateWorlds(
Inventory inventory,
int page
) throws SQLException {
CreeperSettingsDAO dao =
RSServerAdmin.getInstance()
.getCreeperSettingsDAO();
List<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);
boolean enabled =
dao.getEntityDamage(
worldName
);
ItemStack item =
new ItemStack(
enabled
? Material.LIME_SHULKER_BOX
: Material.RED_SHULKER_BOX
);
ItemMeta meta =
item.getItemMeta();
if (meta != null) {
meta.setDisplayName(
"§e" + worldName
);
meta.getPersistentDataContainer()
.set(
new NamespacedKey(
RSServerAdmin.getInstance(),
"world_name"
),
PersistentDataType.STRING,
worldName
);
meta.setLore(
List.of(
"§7Creeper Entity Damage",
"",
enabled
? "§aCurrent: Creepers damage entities"
: "§cCurrent: Creepers do not damage entities"
)
);
item.setItemMeta(
meta
);
}
int relativeIndex =
i - start;
int row =
relativeIndex / 9;
int indexInRow =
relativeIndex % 9;
int itemsRemaining =
worldCount - (row * 9);
boolean lastPartialRow =
itemsRemaining < 9;
int slot;
if (lastPartialRow) {
List<Integer> rowSlots =
MenuLayoutUtils.getCenteredSlots(
itemsRemaining
);
slot =
9
+ (row * 9)
+ rowSlots.get(
indexInRow
);
} else {
slot =
9
+ (row * 9)
+ indexInRow;
}
inventory.setItem(
slot,
item
);
}
}
}
@@ -62,14 +62,6 @@ public class CreeperMenu {
}
if (disableBlockDamage) {
GUIUtils.addGlow(
blockDamage
);
}
inventory.setItem(
11,
blockDamage
@@ -112,14 +104,6 @@ public class CreeperMenu {
}
if (disableEntityDamage) {
GUIUtils.addGlow(
entityDamage
);
}
inventory.setItem(
15,
entityDamage
@@ -2,13 +2,15 @@ package com.rsscripting.serveradmin.gui;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.keepinventory.KeepInventoryDAO;
import com.rsscripting.serveradmin.worlds.WorldsDAO;
import com.rsscripting.serveradmin.settings.SettingKey;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.NamespacedKey;
import org.bukkit.persistence.PersistentDataType;
import java.sql.SQLException;
import java.util.List;
@@ -164,11 +166,17 @@ public class KeepInventoryMenu {
int start =
(page - 1) * WORLDS_PER_PAGE;
int slot =
9;
int end =
Math.min(
start + WORLDS_PER_PAGE,
worlds.size()
);
int worldCount =
end - start;
for (int i = start;
i < worlds.size() && slot < 54;
i < end;
i++) {
String worldName =
@@ -195,6 +203,16 @@ public class KeepInventoryMenu {
"§e" + worldName
);
meta.getPersistentDataContainer()
.set(
new NamespacedKey(
RSServerAdmin.getInstance(),
"world_name"
),
PersistentDataType.STRING,
worldName
);
meta.setLore(
List.of(
"§7Keep Inventory",
@@ -211,15 +229,51 @@ public class KeepInventoryMenu {
}
int relativeIndex =
i - start;
int row =
relativeIndex / 9;
int indexInRow =
relativeIndex % 9;
int itemsRemaining =
worldCount - (row * 9);
boolean lastPartialRow =
itemsRemaining < 9;
int slot;
if (lastPartialRow) {
List<Integer> rowSlots =
MenuLayoutUtils.getCenteredSlots(
itemsRemaining
);
slot =
9
+ (row * 9)
+ rowSlots.get(
indexInRow
);
} else {
slot =
9
+ (row * 9)
+ indexInRow;
}
inventory.setItem(
slot,
item
);
slot++;
}
}
}
}
@@ -0,0 +1,70 @@
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;
}
}