From 7637412b1d11e9ab6eb9e816da9d94ed42992949 Mon Sep 17 00:00:00 2001 From: GeminiAntigravityCLI Date: Thu, 20 Aug 2026 18:18:43 +0200 Subject: [PATCH] fix(economy): resolve startup NPE on Essentials currency format and dynamic validation --- .../luc/gamingcore/command/GuildCommands.java | 43 +++++++++++++------ .../gamingcore/economy/EconomyManager.java | 6 ++- src/main/resources/plugin.yml | 2 + 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/main/java/fr/luc/gamingcore/command/GuildCommands.java b/src/main/java/fr/luc/gamingcore/command/GuildCommands.java index 049f72f..0deb5f0 100644 --- a/src/main/java/fr/luc/gamingcore/command/GuildCommands.java +++ b/src/main/java/fr/luc/gamingcore/command/GuildCommands.java @@ -2,6 +2,7 @@ package fr.luc.gamingcore.command; import fr.luc.bettermccommands.BetterMcCommands; import fr.luc.bettermccommands.argument.Arguments; +import fr.luc.bettermccommands.validation.ValidationResult; import fr.luc.gamingcore.Main; import fr.luc.gamingcore.manager.GuildManager; import fr.luc.gamingcore.manager.GuildResult; @@ -90,21 +91,39 @@ public class GuildCommands { .argument(Arguments.string("nom").description("Nom de la guilde (3-16 car)")) .argument(Arguments.string("tag").optional().description("Tag court (ex: LEG)")) - // Validations déclaratives - .validate(context -> !guildManager.isInGuild(context.getPlayer().getUniqueId()), - msg.get("guild.already_in_guild")) - .validate(context -> GUILD_NAME_PATTERN.matcher(context.getString("nom")).matches(), - msg.get("guild.invalid_name")) - .validate(context -> guildManager.getGuildByName(context.getString("nom")) == null, - msg.get("guild.name_taken", "{guild}", "")) + // Validations dynamiques + .validate(context -> { + if (guildManager.isInGuild(context.getPlayer().getUniqueId())) { + return ValidationResult.invalid(msg.get("guild.already_in_guild")); + } + return ValidationResult.valid(); + }) + .validate(context -> { + String name = context.getString("nom"); + if (!GUILD_NAME_PATTERN.matcher(name).matches()) { + return ValidationResult.invalid(msg.get("guild.invalid_name")); + } + if (guildManager.getGuildByName(name) != null) { + return ValidationResult.invalid(msg.get("guild.name_taken", "{guild}", name)); + } + return ValidationResult.valid(); + }) .validate(context -> { Chunk chunk = context.getPlayer().getLocation().getChunk(); - return !guildManager.isChunkClaimed(chunk.getWorld().getName(), chunk.getX(), chunk.getZ()); - }, msg.get("guild.creation.chunk_already_claimed")) - .validate(context -> guildManager.getEconomyManager().has(context.getPlayer(), creationCost), - msg.get("guild.creation.insufficient_funds", "{cost}", guildManager.getEconomyManager().format(creationCost))) + if (guildManager.isChunkClaimed(chunk.getWorld().getName(), chunk.getX(), chunk.getZ())) { + return ValidationResult.invalid(msg.get("guild.creation.chunk_already_claimed")); + } + return ValidationResult.valid(); + }) + .validate(context -> { + if (!guildManager.getEconomyManager().has(context.getPlayer(), creationCost)) { + return ValidationResult.invalid(msg.get("guild.creation.insufficient_funds", + "{cost}", guildManager.getEconomyManager().format(creationCost))); + } + return ValidationResult.valid(); + }) - // Confirmation avec détails du claim et du coût + // Confirmation préalable avec rappel .requireConfirmation(Duration.ofSeconds(20)) .executes(context -> { diff --git a/src/main/java/fr/luc/gamingcore/economy/EconomyManager.java b/src/main/java/fr/luc/gamingcore/economy/EconomyManager.java index 761ab00..b348448 100644 --- a/src/main/java/fr/luc/gamingcore/economy/EconomyManager.java +++ b/src/main/java/fr/luc/gamingcore/economy/EconomyManager.java @@ -112,7 +112,11 @@ public class EconomyManager { */ public String format(double amount) { if (isAvailable()) { - return plugin.getEconomy().format(amount); + try { + return plugin.getEconomy().format(amount); + } catch (Throwable ignored) { + // Fallback si le provider d'économie (ex: EssentialsX) n'est pas encore initialisé + } } return numberFormat.format(amount) + " $"; } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a27671b..691c15d 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -9,3 +9,5 @@ depend: - Vault softdepend: - WorldEdit + - Essentials + - EssentialsX