From f19ce02448a671e19625ff0a9be9ead33a8e9cc1 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Mon, 18 May 2026 17:34:02 +0200 Subject: [PATCH 1/5] fix: chest lore not update (i guess) https://github.com/ServerOpenMC/PluginV2/issues/1007 --- .../features/city/menu/CityChestMenu.java | 8 +--- .../features/city/menu/main/CityMenu.java | 2 +- .../city/menu/main/buttons/ChestButton.java | 38 +++++++++++-------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java b/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java index 862c495b1..1934c2376 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java @@ -205,14 +205,10 @@ public int getSizeOfItems() { public void onClose(InventoryCloseEvent event) { if (Restart.isRestarting) return; HumanEntity humanEntity = event.getPlayer(); - if (!(humanEntity instanceof Player player)) { - return; - } + if (!(humanEntity instanceof Player player)) return; City city = CityManager.getPlayerCity(player.getUniqueId()); - if (city == null) { - return; - } + if (city == null) return; Inventory inv = event.getInventory(); exit(city, inv); diff --git a/src/main/java/fr/openmc/core/features/city/menu/main/CityMenu.java b/src/main/java/fr/openmc/core/features/city/menu/main/CityMenu.java index bfc82188a..2422b3488 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/main/CityMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/main/CityMenu.java @@ -87,7 +87,7 @@ public String getTexture() { TypeButton.init(this, inventory, city, TYPE_SLOTS); // ** Chest Button - ChestButton.init(this, inventory, city, CHEST_SLOTS); + ChestButton.init(this, city, CHEST_SLOTS); // ** Bank Button BankButton.init(this, inventory, city, BANK_SLOTS); diff --git a/src/main/java/fr/openmc/core/features/city/menu/main/buttons/ChestButton.java b/src/main/java/fr/openmc/core/features/city/menu/main/buttons/ChestButton.java index 6d0895827..5b6b05a26 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/main/buttons/ChestButton.java +++ b/src/main/java/fr/openmc/core/features/city/menu/main/buttons/ChestButton.java @@ -3,6 +3,7 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.ItemBuilder; import fr.openmc.api.menulib.utils.MenuUtils; +import fr.openmc.core.OMCPlugin; import fr.openmc.core.features.city.City; import fr.openmc.core.features.city.CityManager; import fr.openmc.core.features.city.CityPermission; @@ -18,26 +19,33 @@ import org.bukkit.entity.Player; import java.util.List; -import java.util.Map; +import java.util.function.Supplier; public class ChestButton { - public static void init(Menu menu, Map contents, City city, int[] slots) { + public static void init(Menu menu, City city, int[] slots) { Player player = menu.getOwner(); - MenuUtils.createButtonItem( - contents, - slots, - new ItemBuilder(menu, Material.PAPER, itemMeta -> { - itemMeta.itemName(TranslationManager.translation("feature.city.menus.main.chest.title")); - itemMeta.lore(getDynamicLore(city, player)); - itemMeta.setItemModel(NamespacedKey.minecraft("air")); - }).setOnClick(inventoryClickEvent -> { - City cityCheck = CityManager.getPlayerCity(player.getUniqueId()); - if (!CityChestConditions.canCityChestOpen(cityCheck, player)) return; + MenuUtils.runDynamicButtonItem( + player, + menu, + slots, + getItemSupplier(menu, city, player) + ) + .runTaskTimer(OMCPlugin.getInstance(), 0L, 20L); + } + + private static Supplier getItemSupplier(Menu menu, City city, Player player) { + return () -> new ItemBuilder(menu, Material.PAPER, itemMeta -> { + itemMeta.itemName(TranslationManager.translation("feature.city.menus.main.chest.title")); + itemMeta.lore(getDynamicLore(city, player)); + itemMeta.setItemModel(NamespacedKey.minecraft("air")); + }).setOnClick(inventoryClickEvent -> { + City cityCheck = CityManager.getPlayerCity(player.getUniqueId()); + + if (!CityChestConditions.canCityChestOpen(cityCheck, player)) return; - new CityChestMenu(player, city, 1).open(); - }) - ); + new CityChestMenu(player, city, 1).open(); + }); } private static List getDynamicLore(City city, Player player) { From e64d63ebf8e9414d9eec71727e6ae8002cdd0776 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Mon, 18 May 2026 17:49:18 +0200 Subject: [PATCH 2/5] not optimized ptdr, remake https://spark.lucko.me/PZghbkmS0Z --- src/main/java/fr/openmc/api/menulib/Menu.java | 16 ++++++++ .../java/fr/openmc/api/menulib/MenuLib.java | 6 +++ .../features/city/menu/CityChestMenu.java | 2 + .../features/city/menu/main/CityMenu.java | 2 +- .../city/menu/main/buttons/ChestButton.java | 38 ++++++++----------- 5 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/main/java/fr/openmc/api/menulib/Menu.java b/src/main/java/fr/openmc/api/menulib/Menu.java index d843d736a..a0f3d9177 100644 --- a/src/main/java/fr/openmc/api/menulib/Menu.java +++ b/src/main/java/fr/openmc/api/menulib/Menu.java @@ -222,6 +222,22 @@ public final Map fill(ItemStack item) { } return map; } + + public final void update() { + if (owner == null) return; + + Inventory open = owner.getOpenInventory().getTopInventory(); + + if (!(open.getHolder() instanceof Menu menu) || menu != this) return; + + Map content = getContent(); + + for (Map.Entry entry : content.entrySet()) { + setItem(owner, open, entry.getKey(), entry.getValue()); + } + + owner.updateInventory(); + } /** * Checks if the given {@link ItemStack} is associated with the specified item ID. diff --git a/src/main/java/fr/openmc/api/menulib/MenuLib.java b/src/main/java/fr/openmc/api/menulib/MenuLib.java index be40b8cfa..f0e96e7ef 100644 --- a/src/main/java/fr/openmc/api/menulib/MenuLib.java +++ b/src/main/java/fr/openmc/api/menulib/MenuLib.java @@ -83,6 +83,12 @@ public static void setItemClickEvent(Menu menu, ItemBuilder itemBuilder, Consume menu.getItemClickEvents().put(itemBuilder, e); } + public static void updateMenu(Player player) { + if (!(player.getInventory().getHolder(false) instanceof Menu menu)) return; + + menu.update(); + } + public static void clearHistory(Player player) { menuHistory.remove(player); } diff --git a/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java b/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java index 1934c2376..f50d8ddf8 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java @@ -1,5 +1,6 @@ package fr.openmc.core.features.city.menu; +import fr.openmc.api.menulib.MenuLib; import fr.openmc.api.menulib.PaginatedMenu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; @@ -212,6 +213,7 @@ public void onClose(InventoryCloseEvent event) { Inventory inv = event.getInventory(); exit(city, inv); + MenuLib.updateMenu(player); } private void exit(City city, Inventory inv) { diff --git a/src/main/java/fr/openmc/core/features/city/menu/main/CityMenu.java b/src/main/java/fr/openmc/core/features/city/menu/main/CityMenu.java index 2422b3488..bfc82188a 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/main/CityMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/main/CityMenu.java @@ -87,7 +87,7 @@ public String getTexture() { TypeButton.init(this, inventory, city, TYPE_SLOTS); // ** Chest Button - ChestButton.init(this, city, CHEST_SLOTS); + ChestButton.init(this, inventory, city, CHEST_SLOTS); // ** Bank Button BankButton.init(this, inventory, city, BANK_SLOTS); diff --git a/src/main/java/fr/openmc/core/features/city/menu/main/buttons/ChestButton.java b/src/main/java/fr/openmc/core/features/city/menu/main/buttons/ChestButton.java index 5b6b05a26..6d0895827 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/main/buttons/ChestButton.java +++ b/src/main/java/fr/openmc/core/features/city/menu/main/buttons/ChestButton.java @@ -3,7 +3,6 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.ItemBuilder; import fr.openmc.api.menulib.utils.MenuUtils; -import fr.openmc.core.OMCPlugin; import fr.openmc.core.features.city.City; import fr.openmc.core.features.city.CityManager; import fr.openmc.core.features.city.CityPermission; @@ -19,33 +18,26 @@ import org.bukkit.entity.Player; import java.util.List; -import java.util.function.Supplier; +import java.util.Map; public class ChestButton { - public static void init(Menu menu, City city, int[] slots) { + public static void init(Menu menu, Map contents, City city, int[] slots) { Player player = menu.getOwner(); + MenuUtils.createButtonItem( + contents, + slots, + new ItemBuilder(menu, Material.PAPER, itemMeta -> { + itemMeta.itemName(TranslationManager.translation("feature.city.menus.main.chest.title")); + itemMeta.lore(getDynamicLore(city, player)); + itemMeta.setItemModel(NamespacedKey.minecraft("air")); + }).setOnClick(inventoryClickEvent -> { + City cityCheck = CityManager.getPlayerCity(player.getUniqueId()); - MenuUtils.runDynamicButtonItem( - player, - menu, - slots, - getItemSupplier(menu, city, player) - ) - .runTaskTimer(OMCPlugin.getInstance(), 0L, 20L); - } - - private static Supplier getItemSupplier(Menu menu, City city, Player player) { - return () -> new ItemBuilder(menu, Material.PAPER, itemMeta -> { - itemMeta.itemName(TranslationManager.translation("feature.city.menus.main.chest.title")); - itemMeta.lore(getDynamicLore(city, player)); - itemMeta.setItemModel(NamespacedKey.minecraft("air")); - }).setOnClick(inventoryClickEvent -> { - City cityCheck = CityManager.getPlayerCity(player.getUniqueId()); - - if (!CityChestConditions.canCityChestOpen(cityCheck, player)) return; + if (!CityChestConditions.canCityChestOpen(cityCheck, player)) return; - new CityChestMenu(player, city, 1).open(); - }); + new CityChestMenu(player, city, 1).open(); + }) + ); } private static List getDynamicLore(City city, Player player) { From 8521578203fbcba564cfff1cbb3e235cb8be8291 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Mon, 18 May 2026 18:03:07 +0200 Subject: [PATCH 3/5] fix space --- src/main/java/fr/openmc/api/menulib/MenuLib.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/openmc/api/menulib/MenuLib.java b/src/main/java/fr/openmc/api/menulib/MenuLib.java index a2b170247..c61631774 100644 --- a/src/main/java/fr/openmc/api/menulib/MenuLib.java +++ b/src/main/java/fr/openmc/api/menulib/MenuLib.java @@ -222,7 +222,7 @@ public void onInventoryDrag(InventoryDragEvent e) { */ @EventHandler public void onClose(InventoryCloseEvent e) { - if (!(e.getPlayer() instanceof Player player)) return; + if (!(e.getPlayer() instanceof Player player)) return; if (e.getInventory().getHolder(false) instanceof Menu menu) { menu.onClose(e); From 2c4a95c663de60131af5ca2a8a5358c7f8282fda Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Mon, 18 May 2026 18:25:18 +0200 Subject: [PATCH 4/5] fix chest lore (optimized) --- src/main/java/fr/openmc/api/menulib/Menu.java | 12 ++++-------- src/main/java/fr/openmc/api/menulib/MenuLib.java | 3 +-- .../core/features/city/menu/CityChestMenu.java | 1 + 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/fr/openmc/api/menulib/Menu.java b/src/main/java/fr/openmc/api/menulib/Menu.java index a0f3d9177..57d9b4f8c 100644 --- a/src/main/java/fr/openmc/api/menulib/Menu.java +++ b/src/main/java/fr/openmc/api/menulib/Menu.java @@ -147,9 +147,8 @@ public final void open() { Inventory inventory = getInventory(); - getContent().forEach((slot, item) -> { - setItem(owner, inventory, slot, item); - }); + getContent().forEach((slot, item) -> + setItem(owner, inventory, slot, item)); Bukkit.getServer().getPluginManager().callEvent(new OpenMenuEvent(owner, this)); @@ -230,11 +229,8 @@ public final void update() { if (!(open.getHolder() instanceof Menu menu) || menu != this) return; - Map content = getContent(); - - for (Map.Entry entry : content.entrySet()) { - setItem(owner, open, entry.getKey(), entry.getValue()); - } + getContent().forEach((slot, item) -> + setItem(owner, open, slot, item)); owner.updateInventory(); } diff --git a/src/main/java/fr/openmc/api/menulib/MenuLib.java b/src/main/java/fr/openmc/api/menulib/MenuLib.java index c61631774..39e347757 100644 --- a/src/main/java/fr/openmc/api/menulib/MenuLib.java +++ b/src/main/java/fr/openmc/api/menulib/MenuLib.java @@ -84,8 +84,7 @@ public static void setItemClickEvent(Menu menu, ItemBuilder itemBuilder, Consume } public static void updateMenu(Player player) { - if (!(player.getInventory().getHolder(false) instanceof Menu menu)) return; - + if (!(player.getOpenInventory().getTopInventory().getHolder() instanceof Menu menu)) return; menu.update(); } diff --git a/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java b/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java index f50d8ddf8..ce3c9ed9c 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java @@ -213,6 +213,7 @@ public void onClose(InventoryCloseEvent event) { Inventory inv = event.getInventory(); exit(city, inv); + // fixes #1007 MenuLib.updateMenu(player); } From 49afcbff97c01909fb02377a3153dc7f2cd4da5d Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Mon, 18 May 2026 18:30:05 +0200 Subject: [PATCH 5/5] add runTaskLater --- .../java/fr/openmc/core/features/city/menu/CityChestMenu.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java b/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java index ce3c9ed9c..8be787667 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/CityChestMenu.java @@ -6,6 +6,7 @@ import fr.openmc.api.menulib.utils.ItemBuilder; import fr.openmc.api.menulib.utils.MenuUtils; import fr.openmc.api.menulib.utils.StaticSlots; +import fr.openmc.core.OMCPlugin; import fr.openmc.core.commands.utils.Restart; import fr.openmc.core.features.city.City; import fr.openmc.core.features.city.CityManager; @@ -18,6 +19,7 @@ import lombok.Getter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; @@ -214,7 +216,7 @@ public void onClose(InventoryCloseEvent event) { Inventory inv = event.getInventory(); exit(city, inv); // fixes #1007 - MenuLib.updateMenu(player); + Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), ()-> MenuLib.updateMenu(player), 5L); } private void exit(City city, Inventory inv) {