diff --git a/.gradle/8.5/checksums/checksums.lock b/.gradle/8.5/checksums/checksums.lock index 57f4afc..706773b 100644 Binary files a/.gradle/8.5/checksums/checksums.lock and b/.gradle/8.5/checksums/checksums.lock differ diff --git a/.gradle/8.5/checksums/sha1-checksums.bin b/.gradle/8.5/checksums/sha1-checksums.bin index fe187f1..d900894 100644 Binary files a/.gradle/8.5/checksums/sha1-checksums.bin and b/.gradle/8.5/checksums/sha1-checksums.bin differ diff --git a/.gradle/8.5/executionHistory/executionHistory.bin b/.gradle/8.5/executionHistory/executionHistory.bin index 27a1391..881a888 100644 Binary files a/.gradle/8.5/executionHistory/executionHistory.bin and b/.gradle/8.5/executionHistory/executionHistory.bin differ diff --git a/.gradle/8.5/executionHistory/executionHistory.lock b/.gradle/8.5/executionHistory/executionHistory.lock index e63c391..24fb9bc 100644 Binary files a/.gradle/8.5/executionHistory/executionHistory.lock and b/.gradle/8.5/executionHistory/executionHistory.lock differ diff --git a/.gradle/8.5/fileHashes/fileHashes.bin b/.gradle/8.5/fileHashes/fileHashes.bin index c13e6e9..2c67f2a 100644 Binary files a/.gradle/8.5/fileHashes/fileHashes.bin and b/.gradle/8.5/fileHashes/fileHashes.bin differ diff --git a/.gradle/8.5/fileHashes/fileHashes.lock b/.gradle/8.5/fileHashes/fileHashes.lock index a9168dc..77ca9c8 100644 Binary files a/.gradle/8.5/fileHashes/fileHashes.lock and b/.gradle/8.5/fileHashes/fileHashes.lock differ diff --git a/.gradle/8.5/fileHashes/resourceHashesCache.bin b/.gradle/8.5/fileHashes/resourceHashesCache.bin index 340d4d4..4d42b38 100644 Binary files a/.gradle/8.5/fileHashes/resourceHashesCache.bin and b/.gradle/8.5/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 922c19f..702c5cf 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index 2a5025c..4bcd5fd 100644 Binary files a/.gradle/file-system.probe and b/.gradle/file-system.probe differ diff --git a/build/classes/java/main/me/trouper/sentinel/server/gui/config/AntiNukeGUI.class b/build/classes/java/main/me/trouper/sentinel/server/gui/config/AntiNukeGUI.class index a75f013..b3761ac 100644 Binary files a/build/classes/java/main/me/trouper/sentinel/server/gui/config/AntiNukeGUI.class and b/build/classes/java/main/me/trouper/sentinel/server/gui/config/AntiNukeGUI.class differ diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index 8a1e90a..a00a33b 100644 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/src/main/java/me/trouper/sentinel/data/storage/NBTStorage.java b/src/main/java/me/trouper/sentinel/data/storage/NBTStorage.java index e034bf5..415fb8b 100644 --- a/src/main/java/me/trouper/sentinel/data/storage/NBTStorage.java +++ b/src/main/java/me/trouper/sentinel/data/storage/NBTStorage.java @@ -17,30 +17,23 @@ public class NBTStorage implements JsonSerializable { public Map caughtItems = new HashMap<>(); - public static ItemStack toItem(String data) { - try { - byte[] bytes = Base64.getDecoder().decode(data); - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); - ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); - ItemStack item = (ItemStack) objectInputStream.readObject(); - objectInputStream.close(); - return item; - } catch (IOException | ClassNotFoundException e) { - Sentinel.getInstance().getLogger().warning("Could not deserialize ItemStack: " + e.getMessage()); - return null; + public static ItemStack toItem(String serializedString) { + if (serializedString.equals("null")) return null; + byte[] decodedBytes = Base64.getDecoder().decode(serializedString); + String mapString = new String(decodedBytes); + // Remove the curly braces and split by commas to get key-value pairs + String[] keyValuePairs = mapString.substring(1, mapString.length() - 1).split(", "); + Map deserializedMap = new HashMap<>(); + for (String pair : keyValuePairs) { + String[] keyValue = pair.split("="); + deserializedMap.put(keyValue[0], keyValue[1]); } + ItemStack item = ItemStack.deserialize(deserializedMap); + return item; } - - public static String toB64(ItemStack item) { - try { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); - objectOutputStream.writeObject(item); - objectOutputStream.close(); - return Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray()); - } catch (IOException e) { - Sentinel.getInstance().getLogger().warning("Could not serialize ItemStack: " + e.getMessage()); - return null; - } + + public static String toB64(ItemStack itemStack) { + Map serializedMap = itemStack.serialize(); + return Base64.getEncoder().encodeToString(serializedMap.toString().getBytes()); } } diff --git a/src/main/java/me/trouper/sentinel/server/events/violations/players/ChatEvent.java b/src/main/java/me/trouper/sentinel/server/events/violations/players/ChatEvent.java index 73e98c7..8751e45 100644 --- a/src/main/java/me/trouper/sentinel/server/events/violations/players/ChatEvent.java +++ b/src/main/java/me/trouper/sentinel/server/events/violations/players/ChatEvent.java @@ -60,7 +60,7 @@ public class ChatEvent implements CustomListener { UrlFilterGUI.updater.invokeCallbacks(e); ProfanityFilterGUI.updater.invokeCallbacks(e); SpamFilterGUI.updater.invokeCallbacks(e); - NewWhitelistGUI. + NewWhitelistGUI.updater.invokeCallbacks(e); DangerousCommand.updater.invokeCallbacks(e); LoggedCommand.updater.invokeCallbacks(e); SpecificCommand.updater.invokeCallbacks(e); diff --git a/src/main/java/me/trouper/sentinel/server/gui/PaginatedGUI.java b/src/main/java/me/trouper/sentinel/server/gui/PaginatedGUI.java index 1fbdbef..714326e 100644 --- a/src/main/java/me/trouper/sentinel/server/gui/PaginatedGUI.java +++ b/src/main/java/me/trouper/sentinel/server/gui/PaginatedGUI.java @@ -23,6 +23,8 @@ public abstract class PaginatedGUI { protected static final Map> activeFilters = new HashMap<>(); protected static final Map chosenOperator = new HashMap<>(); + protected abstract CustomGui backGUI(); + public CustomGui createGUI(Player p) { ServerUtils.verbose("Creating GUI for player: %s", p.getName()); int page = currentPages.compute(p.getUniqueId(), (k, v) -> realizePage(p, v == null ? 0 : v)); @@ -40,10 +42,10 @@ public abstract class PaginatedGUI { protected abstract String getTitle(Player p); protected void setupPage(Player p, Inventory inv) { - ServerUtils.verbose("Setting up page for player: %s", p.getName()); + ServerUtils.verbose(1,"Setting up page for player: %s", p.getName()); int page = currentPages.compute(p.getUniqueId(), (k, v) -> realizePage(p, v == null ? 0 : v)); List filtered = filterEntries(p, chosenOperator.computeIfAbsent(p.getUniqueId(), v -> FilterOperator.AND)); - ServerUtils.verbose("Current page: %d, Total entries: %d", page, filtered.size()); + ServerUtils.verbose(1,"Current page: %d, Total entries: %d", page, filtered.size()); // Clear previous items for (int i = 0; i < ITEMS_PER_PAGE; i++) { @@ -67,7 +69,7 @@ public abstract class PaginatedGUI { protected abstract ItemStack createDisplayItem(T item); protected void openFilterMenu(Player p) { - ServerUtils.verbose("Creating filter menu for %s", p); + ServerUtils.verbose(1,"Creating filter menu for %s", p); Set filters = activeFilters.computeIfAbsent(p.getUniqueId(), k -> new HashSet<>()); CustomGui.GuiBuilder filterGui = CustomGui.create() @@ -101,6 +103,10 @@ public abstract class PaginatedGUI { protected void changePage(Player p, int direction) { int current = currentPages.getOrDefault(p.getUniqueId(), 0); + if (current + direction < 0) { + p.openInventory(backGUI().getInventory()); + return; + } int newPage = realizePage(p, current + direction); currentPages.put(p.getUniqueId(), newPage); p.openInventory(createGUI(p).getInventory()); @@ -114,6 +120,9 @@ public abstract class PaginatedGUI { } private ItemStack createNavigationItem(String direction, int pageTo) { + if (pageTo < 0) { + return Items.BACK; + } return new ItemBuilder() .material(Material.ARROW) .name(Text.color("&b" + direction + "&7 Page")) diff --git a/src/main/java/me/trouper/sentinel/server/gui/nbt/NBTGui.java b/src/main/java/me/trouper/sentinel/server/gui/nbt/NBTGui.java index 2335c2c..fea408c 100644 --- a/src/main/java/me/trouper/sentinel/server/gui/nbt/NBTGui.java +++ b/src/main/java/me/trouper/sentinel/server/gui/nbt/NBTGui.java @@ -5,6 +5,7 @@ import io.github.itzispyder.pdk.plugin.gui.CustomGui; import io.github.itzispyder.pdk.utils.misc.Pair; import me.trouper.sentinel.Sentinel; import me.trouper.sentinel.data.storage.NBTStorage; +import me.trouper.sentinel.server.gui.MainGUI; import me.trouper.sentinel.server.gui.PaginatedGUI; import me.trouper.sentinel.utils.ServerUtils; import me.trouper.sentinel.utils.Text; @@ -25,6 +26,11 @@ public class NBTGui extends PaginatedGUI> { this.nbtStorage = Sentinel.getInstance().getDirector().io.nbtStorage; } + @Override + protected CustomGui backGUI() { + return new MainGUI().home; + } + @Override protected String getTitle(Player p) { return Text.color("&6&lItem Ownership &7(" + getFilterCount(p) + " items)"); diff --git a/src/main/java/me/trouper/sentinel/server/gui/whitelist/NewWhitelistGUI.java b/src/main/java/me/trouper/sentinel/server/gui/whitelist/NewWhitelistGUI.java index 6bfd6b1..229b18a 100644 --- a/src/main/java/me/trouper/sentinel/server/gui/whitelist/NewWhitelistGUI.java +++ b/src/main/java/me/trouper/sentinel/server/gui/whitelist/NewWhitelistGUI.java @@ -32,6 +32,11 @@ public class NewWhitelistGUI extends PaginatedGUI { private static final Map chosenPlayer = new HashMap<>(); + @Override + protected CustomGui backGUI() { + return new MainGUI().home; + } + @Override protected String getTitle(Player p) { return Text.color("&6&lCommand Blocks &7(" + getFilterCount(p) + " filters)"); @@ -94,9 +99,26 @@ public class NewWhitelistGUI extends PaginatedGUI { e -> { if (e.isLeftClick()) toggleFilter(p, "USER"); else if (e.isRightClick()) { - + queuePlayer(p,(cfg,value)->{ + chosenPlayer.put(p.getUniqueId(),value.getAll().toString()); + },chosenPlayer.getOrDefault(p.getUniqueId(),"null")); } - }) + }); + } + + public static ConfigUpdater updater = new ConfigUpdater<>(Sentinel.getInstance().getDirector().io.violationConfig); + protected void queuePlayer(Player player, BiConsumer action, String currentValue) { + MainGUI.awaitingCallback.add(player.getUniqueId()); + player.closeInventory(); + updater.queuePlayer(player, 20*60, (e)->{ + e.setCancelled(true); + return LegacyComponentSerializer.legacySection().serialize(e.message()); + }, (cfg, newValue) -> { + action.accept(cfg,new Args(newValue.split("\\s+"))); + player.sendMessage(Text.prefix("Value updated successfully")); + openFilterMenu(player); + }); + player.sendMessage(Component.text(Text.prefix("Enter the new value in chat. The value is currently set to &b%s&7. (Click to insert)".formatted(currentValue))).clickEvent(ClickEvent.suggestCommand(currentValue))); } @Override