fix(economy): resolve startup NPE on Essentials currency format and dynamic validation

This commit is contained in:
2026-08-20 18:18:43 +02:00
parent 22e259d865
commit 7637412b1d
3 changed files with 38 additions and 13 deletions
@@ -2,6 +2,7 @@ package fr.luc.gamingcore.command;
import fr.luc.bettermccommands.BetterMcCommands; import fr.luc.bettermccommands.BetterMcCommands;
import fr.luc.bettermccommands.argument.Arguments; import fr.luc.bettermccommands.argument.Arguments;
import fr.luc.bettermccommands.validation.ValidationResult;
import fr.luc.gamingcore.Main; import fr.luc.gamingcore.Main;
import fr.luc.gamingcore.manager.GuildManager; import fr.luc.gamingcore.manager.GuildManager;
import fr.luc.gamingcore.manager.GuildResult; 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("nom").description("Nom de la guilde (3-16 car)"))
.argument(Arguments.string("tag").optional().description("Tag court (ex: LEG)")) .argument(Arguments.string("tag").optional().description("Tag court (ex: LEG)"))
// Validations déclaratives // Validations dynamiques
.validate(context -> !guildManager.isInGuild(context.getPlayer().getUniqueId()), .validate(context -> {
msg.get("guild.already_in_guild")) if (guildManager.isInGuild(context.getPlayer().getUniqueId())) {
.validate(context -> GUILD_NAME_PATTERN.matcher(context.getString("nom")).matches(), return ValidationResult.invalid(msg.get("guild.already_in_guild"));
msg.get("guild.invalid_name")) }
.validate(context -> guildManager.getGuildByName(context.getString("nom")) == null, return ValidationResult.valid();
msg.get("guild.name_taken", "{guild}", "")) })
.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 -> { .validate(context -> {
Chunk chunk = context.getPlayer().getLocation().getChunk(); Chunk chunk = context.getPlayer().getLocation().getChunk();
return !guildManager.isChunkClaimed(chunk.getWorld().getName(), chunk.getX(), chunk.getZ()); if (guildManager.isChunkClaimed(chunk.getWorld().getName(), chunk.getX(), chunk.getZ())) {
}, msg.get("guild.creation.chunk_already_claimed")) return ValidationResult.invalid(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))) 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)) .requireConfirmation(Duration.ofSeconds(20))
.executes(context -> { .executes(context -> {
@@ -112,7 +112,11 @@ public class EconomyManager {
*/ */
public String format(double amount) { public String format(double amount) {
if (isAvailable()) { 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) + " $"; return numberFormat.format(amount) + " $";
} }
+2
View File
@@ -9,3 +9,5 @@ depend:
- Vault - Vault
softdepend: softdepend:
- WorldEdit - WorldEdit
- Essentials
- EssentialsX