diff --git a/pom.xml b/pom.xml
index a41615b..c311ebc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
com.rsscripting
RS-ServerAdmin
RS-ServerAdmin
- 1.2.1
+ 1.3.0
21
diff --git a/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java b/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java
index 6534cd6..e50ab43 100644
--- a/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java
+++ b/src/main/java/com/rsscripting/serveradmin/RSServerAdmin.java
@@ -24,6 +24,7 @@ public class RSServerAdmin extends JavaPlugin {
private WorldsDAO worldsDAO;
private CreeperSettingsDAO creeperSettingsDAO;
private MobEquipmentDropSettingsDAO equipmentDropSettingsDAO;
+ private PeacefulMobsDAO peacefulMobsDAO;
private GitHubUpdateChecker gitHubUpdateChecker;
@Override
@@ -63,6 +64,11 @@ public class RSServerAdmin extends JavaPlugin {
databaseManager
);
+ peacefulMobsDAO =
+ new PeacefulMobsDAO(
+ databaseManager
+ );
+
securityManager = new SecurityManager(this);
boolean keepInventoryDefault =
@@ -70,6 +76,11 @@ public class RSServerAdmin extends JavaPlugin {
SettingKey.KEEP_INVENTORY_NEW_WORLD
);
+ boolean peacefulMobsDefault =
+ settingsDAO.getDefault(
+ SettingKey.PEACEFUL_MOBS_NEW_WORLD
+ );
+
for (World world : Bukkit.getWorlds()) {
worldsDAO.ensureWorldExists(
@@ -101,6 +112,11 @@ public class RSServerAdmin extends JavaPlugin {
world.getName()
);
+ peacefulMobsDAO.ensureWorldExists(
+ world.getName(),
+ peacefulMobsDefault
+ );
+
}
if (getCommand("rsadmin") != null) {
@@ -157,6 +173,11 @@ public class RSServerAdmin extends JavaPlugin {
this
);
+ getServer().getPluginManager().registerEvents(
+ new PeacefulMobsListener(),
+ this
+ );
+
getServer().getPluginManager().registerEvents(
new UpdateNotificationListener(),
this
@@ -196,26 +217,33 @@ public class RSServerAdmin extends JavaPlugin {
}
public KeepInventoryDAO getKeepInventoryDAO() {
- return keepInventoryDAO;}
+ return keepInventoryDAO;
+ }
+
public static RSServerAdmin getInstance() {
return instance;
}
+
public DatabaseManager getDatabaseManager() {
return databaseManager;
}
+
public SettingsDAO getSettingsDAO() {
return settingsDAO;
}
+
public WorldsDAO getWorldsDAO() {
return worldsDAO;
}
+
public SecurityManager getSecurityManager() {
return securityManager;
}
+
public CreeperSettingsDAO getCreeperSettingsDAO() {
return creeperSettingsDAO;
}
@@ -226,6 +254,13 @@ public class RSServerAdmin extends JavaPlugin {
return equipmentDropSettingsDAO;
}
+
+ public PeacefulMobsDAO getPeacefulMobsDAO() {
+
+ return peacefulMobsDAO;
+
+ }
+
public GitHubUpdateChecker getGitHubUpdateChecker() {
return gitHubUpdateChecker;
diff --git a/src/main/java/com/rsscripting/serveradmin/dao/PeacefulMobsDAO.java b/src/main/java/com/rsscripting/serveradmin/dao/PeacefulMobsDAO.java
new file mode 100644
index 0000000..fafb510
--- /dev/null
+++ b/src/main/java/com/rsscripting/serveradmin/dao/PeacefulMobsDAO.java
@@ -0,0 +1,123 @@
+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 PeacefulMobsDAO {
+
+ private final DatabaseManager databaseManager;
+
+ public PeacefulMobsDAO(DatabaseManager databaseManager) {
+ this.databaseManager = databaseManager;
+ }
+
+ public boolean getWorldSetting(
+ String worldName
+ ) throws SQLException {
+
+ Connection connection =
+ databaseManager.getConnection();
+
+ try (PreparedStatement statement =
+ connection.prepareStatement(
+ """
+ SELECT enabled
+ FROM peaceful_mobs
+ WHERE world_name = ?
+ """
+ )) {
+
+ statement.setString(
+ 1,
+ worldName
+ );
+
+ try (ResultSet resultSet =
+ statement.executeQuery()) {
+
+ if (resultSet.next()) {
+
+ return resultSet.getInt(
+ "enabled"
+ ) == 1;
+
+ }
+
+ }
+
+ }
+
+ return false;
+ }
+
+ public void setWorldSetting(
+ String worldName,
+ boolean enabled
+ ) throws SQLException {
+
+ Connection connection =
+ databaseManager.getConnection();
+
+ try (PreparedStatement statement =
+ connection.prepareStatement(
+ """
+ INSERT OR REPLACE INTO peaceful_mobs
+ (world_name, enabled)
+ VALUES (?, ?)
+ """
+ )) {
+
+ statement.setString(
+ 1,
+ worldName
+ );
+
+ statement.setInt(
+ 2,
+ enabled ? 1 : 0
+ );
+
+ statement.executeUpdate();
+
+ }
+
+ }
+
+ public void ensureWorldExists(
+ String worldName,
+ boolean defaultValue
+ ) throws SQLException {
+
+ Connection connection =
+ databaseManager.getConnection();
+
+ try (PreparedStatement statement =
+ connection.prepareStatement(
+ """
+ INSERT OR IGNORE INTO peaceful_mobs
+ (world_name, enabled)
+ VALUES (?, ?)
+ """
+ )) {
+
+ statement.setString(
+ 1,
+ worldName
+ );
+
+ statement.setInt(
+ 2,
+ defaultValue ? 1 : 0
+ );
+
+ statement.executeUpdate();
+
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/rsscripting/serveradmin/dao/SettingsDAO.java b/src/main/java/com/rsscripting/serveradmin/dao/SettingsDAO.java
index 63e2bb8..1f72910 100644
--- a/src/main/java/com/rsscripting/serveradmin/dao/SettingsDAO.java
+++ b/src/main/java/com/rsscripting/serveradmin/dao/SettingsDAO.java
@@ -52,7 +52,8 @@ public class SettingsDAO {
case CREEPER_BLOCK_DAMAGE,
CREEPER_ENTITY_DAMAGE,
- KEEP_INVENTORY_NEW_WORLD -> false;
+ KEEP_INVENTORY_NEW_WORLD,
+ PEACEFUL_MOBS_NEW_WORLD -> false;
};
}
diff --git a/src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java b/src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java
index 72bb025..941921a 100644
--- a/src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java
+++ b/src/main/java/com/rsscripting/serveradmin/dao/WorldsDAO.java
@@ -1,7 +1,6 @@
package com.rsscripting.serveradmin.dao;
import com.rsscripting.serveradmin.database.DatabaseManager;
-import com.rsscripting.serveradmin.RSServerAdmin;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -14,12 +13,8 @@ public class WorldsDAO {
private final DatabaseManager databaseManager;
- public WorldsDAO(
- DatabaseManager databaseManager
- ) {
-
+ public WorldsDAO(DatabaseManager databaseManager) {
this.databaseManager = databaseManager;
-
}
public void ensureWorldExists(
@@ -33,13 +28,8 @@ public class WorldsDAO {
connection.prepareStatement(
"""
INSERT OR IGNORE INTO worlds
- (
- world_name
- )
- VALUES
- (
- ?
- )
+ (world_name)
+ VALUES (?)
"""
)) {
@@ -49,9 +39,7 @@ public class WorldsDAO {
);
statement.executeUpdate();
-
}
-
}
public List getAllWorlds()
@@ -71,24 +59,20 @@ public class WorldsDAO {
ORDER BY world_name
"""
);
-
- ResultSet rs =
+ ResultSet resultSet =
statement.executeQuery()) {
- while (rs.next()) {
+ while (resultSet.next()) {
worlds.add(
- rs.getString(
+ resultSet.getString(
"world_name"
)
);
-
}
-
}
return worlds;
-
}
public void deleteWorldEverywhere(
@@ -100,10 +84,7 @@ public class WorldsDAO {
try (PreparedStatement statement =
connection.prepareStatement(
- """
- DELETE FROM worlds
- WHERE world_name = ?
- """
+ "DELETE FROM worlds WHERE world_name = ?"
)) {
statement.setString(
@@ -112,15 +93,11 @@ public class WorldsDAO {
);
statement.executeUpdate();
-
}
try (PreparedStatement statement =
connection.prepareStatement(
- """
- DELETE FROM keep_inventory
- WHERE world_name = ?
- """
+ "DELETE FROM keep_inventory WHERE world_name = ?"
)) {
statement.setString(
@@ -129,15 +106,11 @@ public class WorldsDAO {
);
statement.executeUpdate();
-
}
try (PreparedStatement statement =
connection.prepareStatement(
- """
- DELETE FROM creeper_settings
- WHERE world_name = ?
- """
+ "DELETE FROM creeper_settings WHERE world_name = ?"
)) {
statement.setString(
@@ -146,15 +119,11 @@ public class WorldsDAO {
);
statement.executeUpdate();
-
}
try (PreparedStatement statement =
connection.prepareStatement(
- """
- DELETE FROM equipment_drop_settings
- WHERE world_name = ?
- """
+ "DELETE FROM equipment_drop_settings WHERE world_name = ?"
)) {
statement.setString(
@@ -163,9 +132,19 @@ public class WorldsDAO {
);
statement.executeUpdate();
-
}
+ try (PreparedStatement statement =
+ connection.prepareStatement(
+ "DELETE FROM peaceful_mobs WHERE world_name = ?"
+ )) {
+
+ statement.setString(
+ 1,
+ worldName
+ );
+
+ statement.executeUpdate();
+ }
}
-
}
\ No newline at end of file
diff --git a/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java b/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java
index 94dfa07..c62cc60 100644
--- a/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java
+++ b/src/main/java/com/rsscripting/serveradmin/database/DatabaseManager.java
@@ -108,6 +108,15 @@ public class DatabaseManager {
"""
);
+ statement.execute(
+ """
+ CREATE TABLE IF NOT EXISTS peaceful_mobs (
+ world_name TEXT PRIMARY KEY,
+ enabled INTEGER NOT NULL
+ )
+ """
+ );
+
}
}
diff --git a/src/main/java/com/rsscripting/serveradmin/gui/MainMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/MainMenu.java
index 3dafc49..7e17819 100644
--- a/src/main/java/com/rsscripting/serveradmin/gui/MainMenu.java
+++ b/src/main/java/com/rsscripting/serveradmin/gui/MainMenu.java
@@ -22,15 +22,31 @@ public class MainMenu {
"Main Menu"
);
- ItemStack creeper = new ItemStack(Material.CREEPER_HEAD);
+ ItemStack creeper =
+ new ItemStack(
+ Material.CREEPER_HEAD
+ );
- ItemMeta creeperMeta = creeper.getItemMeta();
+ ItemMeta creeperMeta =
+ creeper.getItemMeta();
if (creeperMeta != null) {
- creeperMeta.setDisplayName("§aCreepers");
- creeper.setItemMeta(creeperMeta);
+
+ creeperMeta.setDisplayName(
+ "§aCreepers"
+ );
+
+ creeper.setItemMeta(
+ creeperMeta
+ );
+
}
+ inventory.setItem(
+ 11,
+ creeper
+ );
+
ItemStack scanWorlds =
new ItemStack(
Material.COMPASS
@@ -40,20 +56,29 @@ public class MainMenu {
scanWorlds.getItemMeta();
if (scanMeta != null) {
- scanMeta.setDisplayName("§aRescan Worlds");
- scanMeta.setLore(java.util.List.of(
- "§7Rescan for new worlds",
- "",
- "§eClick to rescan."
- ));
+ scanMeta.setDisplayName(
+ "§aRescan Worlds"
+ );
+
+ scanMeta.setLore(
+ java.util.List.of(
+ "§7Rescan for new worlds",
+ "",
+ "§eClick to rescan."
+ )
+ );
+
+ scanWorlds.setItemMeta(
+ scanMeta
+ );
- scanWorlds.setItemMeta(scanMeta);
}
- inventory.setItem(4, scanWorlds);
-
- inventory.setItem(11, creeper);
+ inventory.setItem(
+ 4,
+ scanWorlds
+ );
ItemStack mobDrops =
new ItemStack(
@@ -81,19 +106,64 @@ public class MainMenu {
);
ItemStack keepInventory =
- new ItemStack(Material.CHEST);
+ new ItemStack(
+ Material.CHEST
+ );
ItemMeta keepMeta =
keepInventory.getItemMeta();
if (keepMeta != null) {
- keepMeta.setDisplayName("§aKeep Inventory");
- keepInventory.setItemMeta(keepMeta);
+
+ keepMeta.setDisplayName(
+ "§aKeep Inventory"
+ );
+
+ keepInventory.setItemMeta(
+ keepMeta
+ );
+
}
- inventory.setItem(15, keepInventory);
+ inventory.setItem(
+ 15,
+ keepInventory
+ );
- GUIUtils.fillEmptySlots(inventory);
+ ItemStack peacefulMobs =
+ new ItemStack(
+ Material.ZOMBIE_HEAD
+ );
+
+ ItemMeta peacefulMeta =
+ peacefulMobs.getItemMeta();
+
+ if (peacefulMeta != null) {
+
+ peacefulMeta.setDisplayName(
+ "§aPeaceful Mobs"
+ );
+
+ peacefulMeta.setLore(
+ java.util.List.of(
+ "§7Prevent mobs from targeting players"
+ )
+ );
+
+ peacefulMobs.setItemMeta(
+ peacefulMeta
+ );
+
+ }
+
+ inventory.setItem(
+ 22,
+ peacefulMobs
+ );
+
+ GUIUtils.fillEmptySlots(
+ inventory
+ );
return inventory;
diff --git a/src/main/java/com/rsscripting/serveradmin/gui/PeacefulMobsMenu.java b/src/main/java/com/rsscripting/serveradmin/gui/PeacefulMobsMenu.java
new file mode 100644
index 0000000..528e9c6
--- /dev/null
+++ b/src/main/java/com/rsscripting/serveradmin/gui/PeacefulMobsMenu.java
@@ -0,0 +1,281 @@
+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 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 PeacefulMobsMenu {
+
+ private static final int WORLDS_PER_PAGE = 45;
+
+ public static Inventory create(
+ int page
+ ) throws SQLException {
+
+ RSMenuHolder holder =
+ new RSMenuHolder(
+ "PEACEFUL_MOBS"
+ );
+
+ holder.setPage(
+ page
+ );
+
+ Inventory inventory =
+ Bukkit.createInventory(
+ holder,
+ 54,
+ "Peaceful Mobs"
+ );
+
+ 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.PEACEFUL_MOBS_NEW_WORLD
+ );
+
+ ItemStack item =
+ new ItemStack(
+ enabled
+ ? Material.LIME_DYE
+ : Material.GRAY_DYE
+ );
+
+ ItemMeta meta =
+ item.getItemMeta();
+
+ if (meta != null) {
+
+ meta.setDisplayName(
+ "§eDefault For New Worlds"
+ );
+
+ meta.setLore(
+ List.of(
+ "§7Controls newly detected worlds",
+ "",
+ enabled
+ ? "§aCurrent: Mobs cannot target players"
+ : "§cCurrent: Mobs can target players"
+ )
+ );
+
+ item.setItemMeta(
+ meta
+ );
+
+ }
+
+ if (enabled) {
+
+ GUIUtils.addGlow(
+ item
+ );
+
+ }
+
+ inventory.setItem(
+ 5,
+ 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);
+
+ boolean enabled =
+ RSServerAdmin.getInstance()
+ .getPeacefulMobsDAO()
+ .getWorldSetting(
+ 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(
+ "§7Peaceful Mobs",
+ "",
+ enabled
+ ? "§aCurrent: Mobs cannot target players"
+ : "§cCurrent: Mobs can target players"
+ )
+ );
+
+ 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/MainMenuListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/MainMenuListener.java
index ebdf3ba..c9ea622 100644
--- a/src/main/java/com/rsscripting/serveradmin/listeners/MainMenuListener.java
+++ b/src/main/java/com/rsscripting/serveradmin/listeners/MainMenuListener.java
@@ -73,6 +73,13 @@ public class MainMenuListener implements Listener {
SettingKey.CREEPER_ENTITY_DAMAGE
);
+ boolean peacefulMobsDefault =
+ RSServerAdmin.getInstance()
+ .getSettingsDAO()
+ .getDefault(
+ SettingKey.PEACEFUL_MOBS_NEW_WORLD
+ );
+
for (org.bukkit.World world
: org.bukkit.Bukkit.getWorlds()) {
@@ -103,6 +110,13 @@ public class MainMenuListener implements Listener {
world.getName()
);
+ RSServerAdmin.getInstance()
+ .getPeacefulMobsDAO()
+ .ensureWorldExists(
+ world.getName(),
+ peacefulMobsDefault
+ );
+
}
player.sendMessage(
@@ -188,6 +202,33 @@ public class MainMenuListener implements Listener {
}
+ /*
+ | Peaceful Mobs Menu
+ */
+
+ case 22 -> {
+
+ try {
+
+ player.openInventory(
+ PeacefulMobsMenu.create(
+ 1
+ )
+ );
+
+ } catch (Exception ex) {
+
+ RSServerAdmin.getInstance()
+ .getLogger()
+ .warning(
+ "Failed to open Peaceful Mobs menu: "
+ + ex.getMessage()
+ );
+
+ }
+
+ }
+
}
}
diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/PeacefulMobsListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/PeacefulMobsListener.java
new file mode 100644
index 0000000..3e2e1aa
--- /dev/null
+++ b/src/main/java/com/rsscripting/serveradmin/listeners/PeacefulMobsListener.java
@@ -0,0 +1,294 @@
+package com.rsscripting.serveradmin.listeners;
+
+import com.rsscripting.serveradmin.RSServerAdmin;
+import com.rsscripting.serveradmin.gui.MainMenu;
+import com.rsscripting.serveradmin.gui.PeacefulMobsMenu;
+import com.rsscripting.serveradmin.menuholder.RSMenuHolder;
+import com.rsscripting.serveradmin.settings.SettingKey;
+
+import org.bukkit.Bukkit;
+import org.bukkit.NamespacedKey;
+import org.bukkit.World;
+import org.bukkit.entity.Mob;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityTargetEvent;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.persistence.PersistentDataType;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class PeacefulMobsListener implements Listener {
+
+ private final RSServerAdmin plugin =
+ RSServerAdmin.getInstance();
+
+ private final Map peacefulWorlds =
+ new HashMap<>();
+
+ @EventHandler(
+ priority = EventPriority.HIGHEST,
+ ignoreCancelled = false
+ )
+ public void onEntityTarget(
+ EntityTargetEvent event
+ ) {
+
+ if (!(event.getEntity() instanceof Mob mob)) {
+ return;
+ }
+
+ if (!(event.getTarget() instanceof Player)) {
+ return;
+ }
+
+ String worldName =
+ mob.getWorld().getName();
+
+ try {
+
+ if (isPeaceful(worldName)) {
+
+ event.setTarget(null);
+
+ }
+
+ } catch (Exception ex) {
+
+ plugin.getLogger().warning(
+ "Failed to check Peaceful Mobs setting for world "
+ + worldName
+ + ": "
+ + ex.getMessage()
+ );
+
+ }
+
+ }
+
+ private boolean isPeaceful(
+ String worldName
+ ) throws Exception {
+
+ Boolean cached =
+ peacefulWorlds.get(
+ worldName
+ );
+
+ if (cached != null) {
+
+ return cached;
+
+ }
+
+ boolean enabled =
+ plugin.getPeacefulMobsDAO()
+ .getWorldSetting(
+ worldName
+ );
+
+ peacefulWorlds.put(
+ worldName,
+ enabled
+ );
+
+ return enabled;
+
+ }
+
+ @EventHandler
+ public void onInventoryClick(
+ InventoryClickEvent event
+ ) {
+
+ if (!(event.getInventory().getHolder()
+ instanceof RSMenuHolder holder)) {
+
+ return;
+
+ }
+
+ if (!holder.getMenuId().equals(
+ "PEACEFUL_MOBS"
+ )) {
+
+ 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 {
+
+ plugin.getSettingsDAO()
+ .toggleDefault(
+ SettingKey.PEACEFUL_MOBS_NEW_WORLD
+ );
+
+ player.openInventory(
+ PeacefulMobsMenu.create(
+ holder.getPage()
+ )
+ );
+
+ } catch (Exception ex) {
+
+ plugin.getLogger().warning(
+ "Failed to update Peaceful Mobs 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(
+ plugin,
+ "world_name"
+ ),
+ PersistentDataType.STRING
+ );
+
+ if (worldName == null
+ || worldName.isBlank()) {
+
+ return;
+
+ }
+
+ boolean enabled =
+ plugin.getPeacefulMobsDAO()
+ .getWorldSetting(
+ worldName
+ );
+
+ boolean newValue =
+ !enabled;
+
+ plugin.getPeacefulMobsDAO()
+ .setWorldSetting(
+ worldName,
+ newValue
+ );
+
+ peacefulWorlds.put(
+ worldName,
+ newValue
+ );
+
+ if (newValue) {
+
+ World world =
+ Bukkit.getWorld(
+ worldName
+ );
+
+ if (world != null) {
+
+ world.getEntitiesByClass(
+ Mob.class
+ )
+ .forEach(
+ mob ->
+ mob.setTarget(
+ null
+ )
+ );
+
+ }
+
+ }
+
+ player.openInventory(
+ PeacefulMobsMenu.create(
+ holder.getPage()
+ )
+ );
+
+ } catch (Exception ex) {
+
+ plugin.getLogger().warning(
+ "Failed to update Peaceful Mobs world setting: "
+ + ex.getMessage()
+ );
+
+ }
+
+ }
+
+ }
+
+ }
+
+ public void cacheWorldSetting(
+ String worldName,
+ boolean enabled
+ ) {
+
+ peacefulWorlds.put(
+ worldName,
+ enabled
+ );
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java b/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java
index 2624338..9e77032 100644
--- a/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java
+++ b/src/main/java/com/rsscripting/serveradmin/listeners/WorldLoadListener.java
@@ -2,85 +2,100 @@ package com.rsscripting.serveradmin.listeners;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.settings.SettingKey;
+import org.bukkit.World;
+import org.bukkit.entity.Mob;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.WorldLoadEvent;
-import org.bukkit.GameRule;
public class WorldLoadListener implements Listener {
+ private final RSServerAdmin plugin =
+ RSServerAdmin.getInstance();
+
@EventHandler
public void onWorldLoad(
WorldLoadEvent event
) {
+ World world = event.getWorld();
+
try {
- RSServerAdmin plugin =
- RSServerAdmin.getInstance();
-
- plugin.getWorldsDAO()
- .ensureWorldExists(
- event.getWorld().getName()
- );
-
boolean keepInventoryDefault =
- plugin.getSettingsDAO()
- .getDefault(
- SettingKey.KEEP_INVENTORY_NEW_WORLD
- );
-
- plugin.getKeepInventoryDAO()
- .ensureWorldExists(
- event.getWorld().getName(),
- keepInventoryDefault
+ plugin.getSettingsDAO().getDefault(
+ SettingKey.KEEP_INVENTORY_NEW_WORLD
);
+ plugin.getWorldsDAO().ensureWorldExists(
+ world.getName()
+ );
+
+ plugin.getKeepInventoryDAO().ensureWorldExists(
+ world.getName(),
+ keepInventoryDefault
+ );
+
boolean blockDamageDefault =
- plugin.getSettingsDAO()
- .getDefault(
- SettingKey.CREEPER_BLOCK_DAMAGE
- );
+ plugin.getSettingsDAO().getDefault(
+ SettingKey.CREEPER_BLOCK_DAMAGE
+ );
boolean entityDamageDefault =
- plugin.getSettingsDAO()
- .getDefault(
- SettingKey.CREEPER_ENTITY_DAMAGE
- );
-
- plugin.getCreeperSettingsDAO()
- .ensureWorldExists(
- event.getWorld().getName(),
- blockDamageDefault,
- entityDamageDefault
+ plugin.getSettingsDAO().getDefault(
+ SettingKey.CREEPER_ENTITY_DAMAGE
);
- plugin.getEquipmentDropSettingsDAO()
- .ensureWorldExists(
- event.getWorld().getName()
+ plugin.getCreeperSettingsDAO().ensureWorldExists(
+ world.getName(),
+ blockDamageDefault,
+ entityDamageDefault
+ );
+
+ plugin.getEquipmentDropSettingsDAO().ensureWorldExists(
+ world.getName()
+ );
+
+ boolean peacefulMobsDefault =
+ plugin.getSettingsDAO().getDefault(
+ SettingKey.PEACEFUL_MOBS_NEW_WORLD
);
- boolean keepInventoryEnabled =
- plugin.getKeepInventoryDAO()
- .getWorldSetting(
- event.getWorld().getName()
- );
+ plugin.getPeacefulMobsDAO().ensureWorldExists(
+ world.getName(),
+ peacefulMobsDefault
+ );
- event.getWorld().setGameRule(
- GameRule.KEEP_INVENTORY,
- keepInventoryEnabled
+ boolean peacefulMobsEnabled =
+ plugin.getPeacefulMobsDAO().getWorldSetting(
+ world.getName()
+ );
+
+ if (peacefulMobsEnabled) {
+
+ world.getEntitiesByClass(Mob.class)
+ .forEach(mob -> mob.setTarget(null));
+
+ }
+
+ boolean keepInventory =
+ plugin.getKeepInventoryDAO().getWorldSetting(
+ world.getName()
+ );
+
+ world.setGameRule(
+ org.bukkit.GameRule.KEEP_INVENTORY,
+ keepInventory
);
} catch (Exception ex) {
- RSServerAdmin.getInstance()
- .getLogger()
- .warning(
- "Failed to register world settings for "
- + event.getWorld().getName()
- + ": "
- + ex.getMessage()
- );
+ plugin.getLogger().severe(
+ "Failed to initialize settings for world "
+ + world.getName()
+ + ": "
+ + ex.getMessage()
+ );
}
diff --git a/src/main/java/com/rsscripting/serveradmin/settings/SettingKey.java b/src/main/java/com/rsscripting/serveradmin/settings/SettingKey.java
index 486a617..a76b759 100644
--- a/src/main/java/com/rsscripting/serveradmin/settings/SettingKey.java
+++ b/src/main/java/com/rsscripting/serveradmin/settings/SettingKey.java
@@ -5,6 +5,7 @@ public enum SettingKey {
CREEPER_BLOCK_DAMAGE,
CREEPER_ENTITY_DAMAGE,
KEEP_INVENTORY_NEW_WORLD,
- KEEP_INVENTORY
+ KEEP_INVENTORY,
+ PEACEFUL_MOBS_NEW_WORLD
}
\ No newline at end of file
diff --git a/src/main/java/com/rsscripting/serveradmin/utils/WorldSyncUtils.java b/src/main/java/com/rsscripting/serveradmin/utils/WorldSyncUtils.java
index 5991d84..9af401d 100644
--- a/src/main/java/com/rsscripting/serveradmin/utils/WorldSyncUtils.java
+++ b/src/main/java/com/rsscripting/serveradmin/utils/WorldSyncUtils.java
@@ -36,6 +36,12 @@ public class WorldSyncUtils {
SettingKey.CREEPER_ENTITY_DAMAGE
);
+ boolean peacefulMobsDefault =
+ plugin.getSettingsDAO()
+ .getDefault(
+ SettingKey.PEACEFUL_MOBS_NEW_WORLD
+ );
+
Set bukkitWorlds =
new HashSet<>();
@@ -75,6 +81,12 @@ public class WorldSyncUtils {
worldName
);
+ plugin.getPeacefulMobsDAO()
+ .ensureWorldExists(
+ worldName,
+ peacefulMobsDefault
+ );
+
}
/*