diff --git a/patches/api/0002-Player-GUI-API.patch b/patches/api/0002-Player-GUI-API.patch index 9db8b52..2872b7b 100644 --- a/patches/api/0002-Player-GUI-API.patch +++ b/patches/api/0002-Player-GUI-API.patch @@ -21,19 +21,17 @@ index 0000000000000000000000000000000000000000..cc0645aa27e6e96922f26242e71fef5d +public record ItemIcon(Function itemUpdate, Consumer onClick, int slot) {} diff --git a/src/main/java/me/samsuik/sakura/player/gui/PlayerGUI.java b/src/main/java/me/samsuik/sakura/player/gui/PlayerGUI.java new file mode 100644 -index 0000000000000000000000000000000000000000..55d914153ca3f6458ee52223665516d5735a7c34 +index 0000000000000000000000000000000000000000..1619a55dcdb8da143c82489419650f12dfbdf0a3 --- /dev/null +++ b/src/main/java/me/samsuik/sakura/player/gui/PlayerGUI.java -@@ -0,0 +1,108 @@ +@@ -0,0 +1,114 @@ +package me.samsuik.sakura.player.gui; + +import org.bukkit.entity.Player; -+import org.bukkit.event.EventPriority; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; -+import org.bukkit.plugin.EventExecutor; -+import org.bukkit.plugin.RegisteredListener; ++import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + @@ -64,6 +62,14 @@ index 0000000000000000000000000000000000000000..55d914153ca3f6458ee52223665516d5 + + protected abstract void register(); + ++ protected void refresh(Player player) { ++ Inventory inventory = player.getOpenInventory().getTopInventory(); ++ ++ if (inventory.getHolder() instanceof Holder) { ++ iconMap.forEach((slot, icon) -> updateIcon(player, icon, inventory)); ++ } ++ } ++ + public void unregister() { + REGISTERED_GUIS.remove(this); + registered = false; @@ -72,7 +78,7 @@ index 0000000000000000000000000000000000000000..55d914153ca3f6458ee52223665516d5 + @ApiStatus.Internal + public static void onWindowClick(InventoryClickEvent event) { + for (PlayerGUI ui : REGISTERED_GUIS) { -+ var inventory = event.getClickedInventory(); ++ Inventory inventory = event.getClickedInventory(); + + if (inventory != null && inventory.getHolder() == ui.holder) { + ui.handleSlotClick(event, inventory); @@ -83,9 +89,9 @@ index 0000000000000000000000000000000000000000..55d914153ca3f6458ee52223665516d5 + private void handleSlotClick(InventoryClickEvent event, Inventory inventory) { + event.setCancelled(true); + -+ var player = (Player) event.getWhoClicked(); -+ var slot = event.getSlot(); -+ var icon = iconMap.get(slot); ++ Player player = (Player) event.getWhoClicked(); ++ int slot = event.getSlot(); ++ ItemIcon icon = iconMap.get(slot); + + if (icon != null) { + icon.onClick() @@ -95,7 +101,7 @@ index 0000000000000000000000000000000000000000..55d914153ca3f6458ee52223665516d5 + } + + private void updateIcon(Player player, ItemIcon icon, Inventory inventory) { -+ var item = icon.itemUpdate().apply(player); ++ ItemStack item = icon.itemUpdate().apply(player); + inventory.setItem(icon.slot(), item); + } + @@ -108,9 +114,9 @@ index 0000000000000000000000000000000000000000..55d914153ca3f6458ee52223665516d5 + registerUI(); + } + -+ var inventory = base.apply(player, holder); ++ Inventory inventory = base.apply(player, holder); + -+ for (var icon : iconMap.values()) { ++ for (ItemIcon icon : iconMap.values()) { + updateIcon(player, icon, inventory); + } + diff --git a/patches/api/0003-Visibility-API.patch b/patches/api/0003-Visibility-API.patch index 1ef7b15..a126baa 100644 --- a/patches/api/0003-Visibility-API.patch +++ b/patches/api/0003-Visibility-API.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Visibility API diff --git a/src/main/java/me/samsuik/sakura/player/visibility/Visibility.java b/src/main/java/me/samsuik/sakura/player/visibility/Visibility.java new file mode 100644 -index 0000000000000000000000000000000000000000..8d9a5ffe7dfe00ff2d3deb6bc94b5dc53af15cd4 +index 0000000000000000000000000000000000000000..0483f5a19ff3d4e5e6528c3e4be549fde5fe9a7b --- /dev/null +++ b/src/main/java/me/samsuik/sakura/player/visibility/Visibility.java @@ -0,0 +1,142 @@ @@ -96,15 +96,15 @@ index 0000000000000000000000000000000000000000..8d9a5ffe7dfe00ff2d3deb6bc94b5dc5 + * THEN: enable all settings + */ + public void toggleAll() { -+ var toggled = true; // true == all toggled ++ boolean toggled = true; // true == all toggled + + // If something is enabled set state to true -+ for (var setting : Setting.values()) { ++ for (Setting setting : Setting.values()) { + toggled &= isToggled(setting); + } + + // apply the opposite of the state so that it toggles -+ for (var setting : Setting.values()) { ++ for (Setting setting : Setting.values()) { + toggle(setting, toggled); + } + } @@ -153,7 +153,7 @@ index 0000000000000000000000000000000000000000..8d9a5ffe7dfe00ff2d3deb6bc94b5dc5 + +} diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 20fa1024f9ad8f478a347be5c554b5e45b398a1c..b6d299b2fa9bb30d0a3b8735417dfa9be897d355 100644 +index 9240ea09206461d61cc08d4252e8507555bf41cf..38cdc63ebc775fc8ef0cc098113c8f901366288f 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java @@ -53,6 +53,15 @@ import org.jetbrains.annotations.Nullable; diff --git a/patches/server/0006-Visibility-API-and-Command.patch b/patches/server/0006-Visibility-API-and-Command.patch index 99fe879..45dc5fd 100644 --- a/patches/server/0006-Visibility-API-and-Command.patch +++ b/patches/server/0006-Visibility-API-and-Command.patch @@ -114,46 +114,45 @@ index 0000000000000000000000000000000000000000..6027e4741e2de7c6d3bd7b094c196a21 +} diff --git a/src/main/java/me/samsuik/sakura/player/visibility/VisibilityGUI.java b/src/main/java/me/samsuik/sakura/player/visibility/VisibilityGUI.java new file mode 100644 -index 0000000000000000000000000000000000000000..33615f7a06cd5269e89d794518b6416fc727d823 +index 0000000000000000000000000000000000000000..d5bd47426a219a3825deaa0b62386c88d17b4aac --- /dev/null +++ b/src/main/java/me/samsuik/sakura/player/visibility/VisibilityGUI.java -@@ -0,0 +1,108 @@ +@@ -0,0 +1,119 @@ +package me.samsuik.sakura.player.visibility; + +import me.samsuik.sakura.configuration.GlobalConfiguration; +import me.samsuik.sakura.player.gui.ItemIcon; +import me.samsuik.sakura.player.gui.PlayerGUI; -+import me.samsuik.sakura.player.visibility.Visibility; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.format.TextDecoration; -+import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; ++import org.bukkit.inventory.meta.ItemMeta; + +import java.util.function.BiFunction; + +public class VisibilityGUI extends PlayerGUI { + + private static final BiFunction CREATE_INVENTORY = (player, holder) -> { -+ var inventory = Bukkit.createInventory(holder, 45, Component.text("FPS GUI")); ++ Inventory inventory = Bukkit.createInventory(holder, 45, Component.text("FPS GUI")); + -+ for (var i = 0; i < inventory.getSize(); ++i) { -+ var column = i % 9; -+ var row = (i + 1) / 9; ++ for (int i = 0; i < inventory.getSize(); ++i) { ++ int column = i % 9; ++ int row = (i + 1) / 9; + -+ var background = column > 0 && column < 8 ? (row > 0 && row < 4 || column > 1 && column < 7) ++ Material background = column > 0 && column < 8 ? (row > 0 && row < 4 || column > 1 && column < 7) + ? Material.matchMaterial(GlobalConfiguration.get().fps.material) + : Material.WHITE_STAINED_GLASS_PANE + : Material.BLACK_STAINED_GLASS_PANE; + -+ var itemstack = new ItemStack(background); -+ var meta = itemstack.getItemMeta(); ++ ItemStack itemstack = new ItemStack(background); ++ ItemMeta meta = itemstack.getItemMeta(); + meta.displayName(Component.space()); + itemstack.setItemMeta(meta); + @@ -180,45 +179,57 @@ index 0000000000000000000000000000000000000000..33615f7a06cd5269e89d794518b6416f + registerFPSIcon(Visibility.Setting.ENCHANTMENT_GLINT, Material.ENCHANTED_BOOK, NamedTextColor.DARK_PURPLE, 32); + + registerIcon(new ItemIcon( -+ (player) -> new ItemStack(Material.EMERALD_BLOCK), -+ (player) -> player.getVisibility().toggleAll(), ++ (player) -> { ++ ItemStack itemstack = new ItemStack(Material.GREEN_STAINED_GLASS_PANE); ++ Component title = Component.text("Toggle all", NamedTextColor.GREEN); ++ ++ itemstack.editMeta(meta -> meta.displayName(title.decoration(TextDecoration.ITALIC, false))); ++ return itemstack; ++ }, ++ (player) -> { ++ player.getVisibility().toggleAll(); ++ ++ // refresh icons after toggling ++ this.refresh(player); ++ }, + 26 + )); + } + + private void registerFPSIcon(Visibility.Setting setting, Material material, TextColor colour, int slot) { + registerIcon(new ItemIcon((player) -> { -+ var visibility = player.getVisibility(); ++ Visibility visibility = player.getVisibility(); ++ ItemStack itemstack = new ItemStack(material); + -+ // Get the current state as a string -+ var state = visibility.isEnabled(setting) -+ ? "Enabled" : "Disabled"; ++ itemstack.editMeta(meta -> { ++ // Get the current state as a string ++ String state = visibility.isEnabled(setting) ? "Enabled" : "Disabled"; + -+ // Friendly name as a component -+ var title = Component.text(setting.friendlyName()).color(colour); -+ var itemstack = new ItemStack(material); -+ var meta = itemstack.getItemMeta(); ++ // Friendly name as a component ++ Component title = Component.text(setting.friendlyName(), colour); + -+ // Display names are italic by default -+ title = title.decoration(TextDecoration.ITALIC, false); ++ // Display names are italic by default ++ title = title.decoration(TextDecoration.ITALIC, false); + -+ // Set the display name -+ meta.displayName(title.append(Component.space()) -+ .append(Component.text(state).color(NamedTextColor.GRAY))); ++ // Set the display name ++ meta.displayName(title.append(Component.space()) ++ .append(Component.text(state, NamedTextColor.GRAY))); ++ }); + -+ itemstack.setItemMeta(meta); + return itemstack; + }, (player) -> { -+ var visibility = player.getVisibility(); ++ Visibility visibility = player.getVisibility(); + + // Toggle clicked setting visibility + visibility.toggle(setting); + ++ // Get the current state as a string ++ String state = visibility.isEnabled(setting) ? "Enabled" : "Disabled"; ++ + // Send message to player -+ var state = visibility.isEnabled(setting) ? "Enabled" : "Disabled"; -+ player.sendMessage(MiniMessage.miniMessage().deserialize(GlobalConfiguration.get().fps.message, ++ player.sendRichMessage(GlobalConfiguration.get().fps.message, + Placeholder.unparsed("name", setting.friendlyName()), -+ Placeholder.unparsed("state", state)) ++ Placeholder.unparsed("state", state) + ); + }, + slot