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:
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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user