Release Ready

This commit is contained in:
BigPappa committed 2026-06-15 10:21:28 -05:00
1 parent 73a0ef8ae6
commit 6c19c18523
12 files changed
+1719 -810

No files matched your search

@@ -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;
@@ -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()
);
@@ -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
) {
@@ -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();
}
}
}
@@ -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
);
@@ -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()
);
}
}
}
}
}
}
}
@@ -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()
);
}
}
}
}
}
}
}
@@ -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()
);
}
}
}
}
}
@@ -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()
);
}
}
}
}
}
}
}
@@ -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()
);
}
}
}
@@ -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()
);
}
}
}
}
}
}
}
@@ -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<String> 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<String> 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
);
}
}
}