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
+1315 -83

No files matched your search

@@ -4,12 +4,13 @@ import com.rsscripting.serveradmin.database.DatabaseManager;
import com.rsscripting.serveradmin.database.SettingsDAO;
import com.rsscripting.serveradmin.commands.RSAdminCommand;
import com.rsscripting.serveradmin.keepinventory.KeepInventoryDAO;
import com.rsscripting.serveradmin.listeners.CreeperListener;
import com.rsscripting.serveradmin.listeners.CreeperBlockDamageListener;
import com.rsscripting.serveradmin.security.SecurityManager;
import com.rsscripting.serveradmin.listeners.InventoryListener;
import com.rsscripting.serveradmin.listeners.CreeperEntityDamageListener;
import com.rsscripting.serveradmin.update.GitHubUpdateChecker;
import com.rsscripting.serveradmin.listeners.WorldLoadListener;
import com.rsscripting.serveradmin.creeper.CreeperSettingsDAO;
import com.rsscripting.serveradmin.settings.SettingKey;
import com.rsscripting.serveradmin.worlds.WorldsDAO;
@@ -27,6 +28,7 @@ public class RSServerAdmin extends JavaPlugin {
private SettingsDAO settingsDAO;
private SecurityManager securityManager;
private WorldsDAO worldsDAO;
private CreeperSettingsDAO creeperSettingsDAO;
@Override
public void onEnable() {
@@ -41,13 +43,24 @@ public class RSServerAdmin extends JavaPlugin {
databaseManager.connect();
settingsDAO = new SettingsDAO(databaseManager);
settingsDAO = new SettingsDAO(
databaseManager
);
settingsDAO.initializeDefaults();
keepInventoryDAO = new KeepInventoryDAO(databaseManager);
keepInventoryDAO = new KeepInventoryDAO(
databaseManager
);
worldsDAO = new WorldsDAO(databaseManager);
worldsDAO = new WorldsDAO(
databaseManager
);
creeperSettingsDAO =
new CreeperSettingsDAO(
databaseManager
);
securityManager = new SecurityManager(this);
@@ -67,6 +80,22 @@ public class RSServerAdmin extends JavaPlugin {
keepInventoryDefault
);
boolean blockDamageDefault =
settingsDAO.getDefault(
SettingKey.CREEPER_BLOCK_DAMAGE
);
boolean entityDamageDefault =
settingsDAO.getDefault(
SettingKey.CREEPER_ENTITY_DAMAGE
);
creeperSettingsDAO.ensureWorldExists(
world.getName(),
blockDamageDefault,
entityDamageDefault
);
}
if (getCommand("rsadmin") != null) {
@@ -89,7 +118,7 @@ public class RSServerAdmin extends JavaPlugin {
);
getServer().getPluginManager().registerEvents(
new CreeperListener(),
new CreeperBlockDamageListener(),
this
);
@@ -149,10 +178,14 @@ public class RSServerAdmin extends JavaPlugin {
return settingsDAO;
}
public WorldsDAO getWorldsDAO() {
return worldsDAO;}
return worldsDAO;
}
public SecurityManager getSecurityManager() {
return securityManager;
}
public CreeperSettingsDAO getCreeperSettingsDAO() {
return creeperSettingsDAO;
}
}
@@ -0,0 +1,213 @@
package com.rsscripting.serveradmin.creeper;
import com.rsscripting.serveradmin.database.DatabaseManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class CreeperSettingsDAO {
private final DatabaseManager databaseManager;
public CreeperSettingsDAO(
DatabaseManager databaseManager
) {
this.databaseManager =
databaseManager;
}
public void ensureWorldExists(
String worldName,
boolean blockDamage,
boolean entityDamage
) throws SQLException {
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
INSERT OR IGNORE INTO
creeper_settings
(
world_name,
block_damage,
entity_damage
)
VALUES (?, ?, ?)
"""
)) {
statement.setString(
1,
worldName
);
statement.setInt(
2,
blockDamage ? 1 : 0
);
statement.setInt(
3,
entityDamage ? 1 : 0
);
statement.executeUpdate();
}
}
public boolean getBlockDamage(
String worldName
) throws SQLException {
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
SELECT block_damage
FROM creeper_settings
WHERE world_name = ?
"""
)) {
statement.setString(
1,
worldName
);
try (ResultSet rs =
statement.executeQuery()) {
if (rs.next()) {
return rs.getInt(
"block_damage"
) == 1;
}
}
}
return false;
}
public void setBlockDamage(
String worldName,
boolean value
) throws SQLException {
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
UPDATE creeper_settings
SET block_damage = ?
WHERE world_name = ?
"""
)) {
statement.setInt(
1,
value ? 1 : 0
);
statement.setString(
2,
worldName
);
statement.executeUpdate();
}
}
public boolean getEntityDamage(
String worldName
) throws SQLException {
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
SELECT entity_damage
FROM creeper_settings
WHERE world_name = ?
"""
)) {
statement.setString(
1,
worldName
);
try (ResultSet rs =
statement.executeQuery()) {
if (rs.next()) {
return rs.getInt(
"entity_damage"
) == 1;
}
}
}
return false;
}
public void setEntityDamage(
String worldName,
boolean value
) throws SQLException {
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
UPDATE creeper_settings
SET entity_damage = ?
WHERE world_name = ?
"""
)) {
statement.setInt(
1,
value ? 1 : 0
);
statement.setString(
2,
worldName
);
statement.executeUpdate();
}
}
}
@@ -76,6 +76,16 @@ public class DatabaseManager {
"""
);
statement.execute(
"""
CREATE TABLE IF NOT EXISTS creeper_settings (
world_name TEXT PRIMARY KEY,
block_damage INTEGER NOT NULL,
entity_damage INTEGER NOT NULL
)
"""
);
}
}
@@ -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;
}
}
@@ -7,7 +7,7 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityExplodeEvent;
public class CreeperListener implements Listener {
public class CreeperBlockDamageListener implements Listener {
@EventHandler
public void onEntityExplode(
@@ -20,14 +20,19 @@ public class CreeperListener implements Listener {
try {
boolean disableBlockDamage =
String worldName =
event.getLocation()
.getWorld()
.getName();
boolean blockDamageEnabled =
RSServerAdmin.getInstance()
.getSettingsDAO()
.getDefault(
SettingKey.CREEPER_BLOCK_DAMAGE
.getCreeperSettingsDAO()
.getBlockDamage(
worldName
);
if (!disableBlockDamage) {
if (blockDamageEnabled) {
return;
}
@@ -36,7 +41,12 @@ public class CreeperListener implements Listener {
} catch (Exception ex) {
ex.printStackTrace();
RSServerAdmin.getInstance()
.getLogger()
.warning(
"Failed to process Creeper block damage: "
+ ex.getMessage()
);
}
@@ -20,22 +20,34 @@ public class CreeperEntityDamageListener implements Listener {
try {
boolean disableEntityDamage =
String worldName =
event.getEntity()
.getWorld()
.getName();
boolean entityDamageEnabled =
RSServerAdmin.getInstance()
.getSettingsDAO()
.getDefault(
SettingKey.CREEPER_ENTITY_DAMAGE
.getCreeperSettingsDAO()
.getEntityDamage(
worldName
);
if (!disableEntityDamage) {
if (entityDamageEnabled) {
return;
}
event.setCancelled(true);
event.setCancelled(
true
);
} catch (Exception ex) {
ex.printStackTrace();
RSServerAdmin.getInstance()
.getLogger()
.warning(
"Failed to process Creeper entity damage: "
+ ex.getMessage()
);
}
@@ -1,8 +1,6 @@
package com.rsscripting.serveradmin.listeners;
import com.rsscripting.serveradmin.gui.KeepInventoryMenu;
import com.rsscripting.serveradmin.gui.RSMenuHolder;
import com.rsscripting.serveradmin.gui.CreeperMenu;
import com.rsscripting.serveradmin.gui.*;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.settings.SettingKey;
import com.rsscripting.serveradmin.keepinventory.KeepInventoryDAO;
@@ -14,6 +12,9 @@ import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.Bukkit;
import org.bukkit.GameRule;
import org.bukkit.World;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.NamespacedKey;
import org.bukkit.persistence.PersistentDataType;
public class InventoryListener implements Listener {
@@ -139,53 +140,55 @@ public class InventoryListener implements Listener {
switch (event.getSlot()) {
case 4 -> player.openInventory(
com.rsscripting.serveradmin.gui.MainMenu.create()
);
case 11 -> {
try {
RSServerAdmin.getInstance()
.getSettingsDAO()
.toggleDefault(
SettingKey.CREEPER_BLOCK_DAMAGE
player.openInventory(
CreeperBlockDamageMenu.create(
1
)
);
} catch (Exception ex) {
ex.printStackTrace();
RSServerAdmin.getInstance()
.getLogger()
.warning(
"Failed to open Creeper Block Damage menu: "
+ ex.getMessage()
);
}
player.openInventory(
CreeperMenu.create()
);
}
case 15 -> {
try {
RSServerAdmin.getInstance()
.getSettingsDAO()
.toggleDefault(
SettingKey.CREEPER_ENTITY_DAMAGE
player.openInventory(
CreeperEntityDamageMenu.create(
1
)
);
} catch (Exception ex) {
ex.printStackTrace();
}
player.openInventory(
CreeperMenu.create()
RSServerAdmin.getInstance()
.getLogger()
.warning(
"Failed to open Creeper Entity Damage menu: "
+ ex.getMessage()
);
}
case 4 -> player.openInventory(
com.rsscripting.serveradmin.gui.MainMenu.create()
);
}
}
@@ -243,27 +246,39 @@ public class InventoryListener implements Listener {
RSServerAdmin.getInstance()
.getKeepInventoryDAO();
java.util.List<String> worlds =
RSServerAdmin.getInstance()
.getWorldsDAO()
.getAllWorlds();
if (event.getCurrentItem() == null) {
return;
}
int worldIndex =
((holder.getPage() - 1) * 45)
+ (event.getSlot() - 9);
if (!event.getCurrentItem().hasItemMeta()) {
return;
}
if (worldIndex < 0
|| worldIndex >= worlds.size()) {
ItemMeta meta =
event.getCurrentItem()
.getItemMeta();
if (meta == null) {
return;
}
String worldName =
meta.getPersistentDataContainer()
.get(
new NamespacedKey(
RSServerAdmin.getInstance(),
"world_name"
),
PersistentDataType.STRING
);
if (worldName == null
|| worldName.isBlank()) {
return;
}
String worldName =
worlds.get(
worldIndex
);
boolean enabled =
dao.getWorldSetting(
worldName
@@ -306,6 +321,278 @@ public class InventoryListener implements Listener {
}
case "CREEPER_BLOCK_DAMAGE" -> {
if (!(event.getWhoClicked() instanceof Player player)) {
return;
}
switch (event.getSlot()) {
case 3 -> {
try {
player.openInventory(
CreeperMenu.create()
);
} catch (Exception ex) {
RSServerAdmin.getInstance()
.getLogger()
.warning(
"Failed to open Creeper menu: "
+ ex.getMessage()
);
}
}
case 5 -> {
try {
RSServerAdmin.getInstance()
.getSettingsDAO()
.toggleDefault(
SettingKey.CREEPER_BLOCK_DAMAGE
);
player.openInventory(
CreeperBlockDamageMenu.create(
holder.getPage()
)
);
} catch (Exception ex) {
RSServerAdmin.getInstance()
.getLogger()
.warning(
"Failed to toggle Creeper Block Damage default: "
+ ex.getMessage()
);
}
}
default -> {
if (event.getSlot() < 9) {
return;
}
try {
if (event.getCurrentItem() == null) {
return;
}
if (!event.getCurrentItem().hasItemMeta()) {
return;
}
ItemMeta meta =
event.getCurrentItem()
.getItemMeta();
if (meta == null) {
return;
}
String worldName =
meta.getPersistentDataContainer()
.get(
new NamespacedKey(
RSServerAdmin.getInstance(),
"world_name"
),
PersistentDataType.STRING
);
if (worldName == null
|| worldName.isBlank()) {
return;
}
boolean enabled =
RSServerAdmin.getInstance()
.getCreeperSettingsDAO()
.getBlockDamage(
worldName
);
RSServerAdmin.getInstance()
.getCreeperSettingsDAO()
.setBlockDamage(
worldName,
!enabled
);
player.openInventory(
CreeperBlockDamageMenu.create(
holder.getPage()
)
);
} catch (Exception ex) {
RSServerAdmin.getInstance()
.getLogger()
.warning(
"Failed to update Creeper Block Damage setting: "
+ ex.getMessage()
);
}
}
}
}
case "CREEPER_ENTITY_DAMAGE" -> {
if (!(event.getWhoClicked() instanceof Player player)) {
return;
}
switch (event.getSlot()) {
case 3 -> {
try {
player.openInventory(
CreeperMenu.create()
);
} catch (Exception ex) {
RSServerAdmin.getInstance()
.getLogger()
.warning(
"Failed to open Creeper menu: "
+ ex.getMessage()
);
}
}
case 5 -> {
try {
RSServerAdmin.getInstance()
.getSettingsDAO()
.toggleDefault(
SettingKey.CREEPER_ENTITY_DAMAGE
);
player.openInventory(
CreeperEntityDamageMenu.create(
holder.getPage()
)
);
} catch (Exception ex) {
RSServerAdmin.getInstance()
.getLogger()
.warning(
"Failed to toggle Creeper Entity Damage default: "
+ ex.getMessage()
);
}
}
default -> {
if (event.getSlot() < 9) {
return;
}
try {
if (event.getCurrentItem() == null) {
return;
}
if (!event.getCurrentItem().hasItemMeta()) {
return;
}
ItemMeta meta =
event.getCurrentItem()
.getItemMeta();
if (meta == null) {
return;
}
String worldName =
meta.getPersistentDataContainer()
.get(
new NamespacedKey(
RSServerAdmin.getInstance(),
"world_name"
),
PersistentDataType.STRING
);
if (worldName == null
|| worldName.isBlank()) {
return;
}
boolean enabled =
RSServerAdmin.getInstance()
.getCreeperSettingsDAO()
.getEntityDamage(
worldName
);
RSServerAdmin.getInstance()
.getCreeperSettingsDAO()
.setEntityDamage(
worldName,
!enabled
);
player.openInventory(
CreeperEntityDamageMenu.create(
holder.getPage()
)
);
} catch (Exception ex) {
RSServerAdmin.getInstance()
.getLogger()
.warning(
"Failed to update Creeper Entity Damage setting: "
+ ex.getMessage()
);
}
}
}
}
}
}
@@ -36,6 +36,25 @@ public class WorldLoadListener implements Listener {
keepInventoryDefault
);
boolean blockDamageDefault =
plugin.getSettingsDAO()
.getDefault(
SettingKey.CREEPER_BLOCK_DAMAGE
);
boolean entityDamageDefault =
plugin.getSettingsDAO()
.getDefault(
SettingKey.CREEPER_ENTITY_DAMAGE
);
plugin.getCreeperSettingsDAO()
.ensureWorldExists(
event.getWorld().getName(),
blockDamageDefault,
entityDamageDefault
);
boolean keepInventoryEnabled =
plugin.getKeepInventoryDAO()
.getWorldSetting(