From afe08575ef65bfa00c89ad0b0ed6a4cdcc602c8d Mon Sep 17 00:00:00 2001 From: 1robie <97293924+1robie@users.noreply.github.com> Date: Thu, 26 Feb 2026 21:48:59 +0100 Subject: [PATCH 1/2] fix: improve error handling and formatting in various loaders and actions --- .../fr/maxlego08/menu/api/loader/NoneLoader.java | 14 ++++++++------ .../fr/maxlego08/menu/api/requirement/Action.java | 2 +- .../java/fr/maxlego08/menu/ZMenuItemStack.java | 8 ++++---- .../maxlego08/menu/loader/MenuItemStackLoader.java | 5 ++++- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/API/src/main/java/fr/maxlego08/menu/api/loader/NoneLoader.java b/API/src/main/java/fr/maxlego08/menu/api/loader/NoneLoader.java index dc903850..2f28b9f2 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/loader/NoneLoader.java +++ b/API/src/main/java/fr/maxlego08/menu/api/loader/NoneLoader.java @@ -21,13 +21,15 @@ public NoneLoader(@NotNull Plugin plugin,@NotNull Class clazz, @Nullable public Button load(@NonNull YamlConfiguration configuration, @NonNull String path, @NonNull DefaultButtonValue defaultButtonValue) { try { - return this.clazz.getConstructor(Plugin.class).newInstance(this.plugin); - } catch (Exception exception) { - try { - return this.clazz.getDeclaredConstructor().newInstance(); - } catch (Exception exception2) { - exception.printStackTrace(); + for (var constructor : this.clazz.getConstructors()) { + var params = constructor.getParameterTypes(); + if (params.length == 1 && params[0].isInstance(this.plugin)) { + return (Button) constructor.newInstance(this.plugin); + } } + return this.clazz.getDeclaredConstructor().newInstance(); + } catch (Exception exception) { + exception.printStackTrace(); } return null; } diff --git a/API/src/main/java/fr/maxlego08/menu/api/requirement/Action.java b/API/src/main/java/fr/maxlego08/menu/api/requirement/Action.java index 13773969..794457de 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/requirement/Action.java +++ b/API/src/main/java/fr/maxlego08/menu/api/requirement/Action.java @@ -41,7 +41,7 @@ public abstract class Action { */ protected abstract void execute(@NotNull Player player, @Nullable Button button, @NotNull InventoryEngine inventoryEngine, @NotNull Placeholders placeholders); - public void preExecute(@NotNull Player player,@Nullable Button button,@NotNull InventoryEngine inventoryEngine,@NotNull Placeholders placeholders) { + public void preExecute(@NotNull Player player, @Nullable Button button, @NotNull InventoryEngine inventoryEngine, @NotNull Placeholders placeholders) { placeholders.register("player", player.getName()); if (chance < 100 && Math.random() > (chance / 100.0f)) { for (Action denyChanceAction : denyChanceActions) { diff --git a/Common/src/main/java/fr/maxlego08/menu/ZMenuItemStack.java b/Common/src/main/java/fr/maxlego08/menu/ZMenuItemStack.java index f51b5ff6..d5e6df98 100644 --- a/Common/src/main/java/fr/maxlego08/menu/ZMenuItemStack.java +++ b/Common/src/main/java/fr/maxlego08/menu/ZMenuItemStack.java @@ -124,8 +124,7 @@ public static ZMenuItemStack fromMap(InventoryManager inventoryManager, File fil @Override public @NonNull ItemStack build(Player player) { - return build(new ZBuildContext.Builder().player(player).build()); - + return build(player, true); } @Override @@ -198,7 +197,7 @@ public ItemStack build(BuildContext context) { @Override public @NonNull ItemStack build(Player player, boolean useCache) { - return build(player); + return build(new ZBuildContext.Builder().player(player).useCache(useCache).build()); } @Override @@ -405,7 +404,8 @@ private void applyDisplayNameLore(Player player, Placeholders placeholders, Item if (this.displayName != null) { try { String displayName = locale == null ? this.displayName : this.translatedDisplayName.getOrDefault(locale, this.displayName); - itemName = fontImage.replace(papi(placeholders.parse(displayName), offlinePlayer == null ? player : offlinePlayer, useCache)); + if (displayName != null) + itemName = fontImage.replace(papi(placeholders.parse(displayName), offlinePlayer == null ? player : offlinePlayer, useCache)); } catch (Exception exception) { Logger.info("Error with update display name for item " + path + " in file " + filePath + " (" + player + ", " + this.displayName + ")", Logger.LogType.ERROR); exception.printStackTrace(); diff --git a/src/main/java/fr/maxlego08/menu/loader/MenuItemStackLoader.java b/src/main/java/fr/maxlego08/menu/loader/MenuItemStackLoader.java index 464c29a9..1c5c92e8 100644 --- a/src/main/java/fr/maxlego08/menu/loader/MenuItemStackLoader.java +++ b/src/main/java/fr/maxlego08/menu/loader/MenuItemStackLoader.java @@ -127,7 +127,10 @@ public MenuItemStack load(@NonNull YamlConfiguration configuration, @NonNull Str } if (!menuItemStack.isNeedPlaceholderAPI() && Configuration.enableCacheItemStack) { - menuItemStack.build(new ZBuildContext.Builder().build()); + try { + menuItemStack.build(new ZBuildContext.Builder().build()); + } catch (Exception ignored) { // Fail when a item requires a player to be built. + } } return menuItemStack; From ad77691b3c128bdf6937e166fcef635a266ebc99 Mon Sep 17 00:00:00 2001 From: 1robie <97293924+1robie@users.noreply.github.com> Date: Thu, 26 Feb 2026 23:00:38 +0100 Subject: [PATCH 2/2] fix: allow '%player%' as a valid player argument in validators --- .../menu/command/validators/OnlinePlayerArgumentValidator.java | 1 + .../menu/command/validators/PlayerArgumentValidator.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/fr/maxlego08/menu/command/validators/OnlinePlayerArgumentValidator.java b/src/main/java/fr/maxlego08/menu/command/validators/OnlinePlayerArgumentValidator.java index 00bee804..195231d4 100644 --- a/src/main/java/fr/maxlego08/menu/command/validators/OnlinePlayerArgumentValidator.java +++ b/src/main/java/fr/maxlego08/menu/command/validators/OnlinePlayerArgumentValidator.java @@ -14,6 +14,7 @@ public OnlinePlayerArgumentValidator(Plugin plugin) { @Override public boolean isValid(String value) { + if (value.equalsIgnoreCase("%player%")) return true; return plugin.getServer().getPlayerExact(value) != null; } diff --git a/src/main/java/fr/maxlego08/menu/command/validators/PlayerArgumentValidator.java b/src/main/java/fr/maxlego08/menu/command/validators/PlayerArgumentValidator.java index e6461f4a..01fd5053 100644 --- a/src/main/java/fr/maxlego08/menu/command/validators/PlayerArgumentValidator.java +++ b/src/main/java/fr/maxlego08/menu/command/validators/PlayerArgumentValidator.java @@ -14,6 +14,7 @@ public PlayerArgumentValidator(Plugin plugin) { @Override public boolean isValid(String value) { + if (value.equalsIgnoreCase("%player%")) return true; return this.plugin.getServer().getOfflinePlayer(value).hasPlayedBefore(); }