From 1d1723924703ca83dc9e56c31634dab274736520 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Mon, 4 Aug 2025 16:55:38 +0200 Subject: [PATCH] Adds some code for displaying an item's cost --- pom.xml | 2 +- .../blacksmith/BlackSmithConfigCommand.java | 7 +- .../blacksmith/container/ActionCost.java | 40 ++++++- .../CostCommand.java => util/CostHelper.java} | 112 +++++++----------- 4 files changed, 85 insertions(+), 76 deletions(-) rename src/main/java/net/knarcraft/blacksmith/{command/CostCommand.java => util/CostHelper.java} (80%) diff --git a/pom.xml b/pom.xml index bfbffce..d2b79b5 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ org.spigotmc spigot-api - 1.21.4-R0.1-SNAPSHOT + 1.21.5-R0.1-SNAPSHOT provided diff --git a/src/main/java/net/knarcraft/blacksmith/command/blacksmith/BlackSmithConfigCommand.java b/src/main/java/net/knarcraft/blacksmith/command/blacksmith/BlackSmithConfigCommand.java index 576d95f..a9bd15c 100644 --- a/src/main/java/net/knarcraft/blacksmith/command/blacksmith/BlackSmithConfigCommand.java +++ b/src/main/java/net/knarcraft/blacksmith/command/blacksmith/BlackSmithConfigCommand.java @@ -12,6 +12,7 @@ import net.knarcraft.blacksmith.util.InputParsingHelper; import net.knarcraft.blacksmith.util.ItemHelper; import net.knarcraft.blacksmith.util.TypeValidationHelper; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -101,9 +102,13 @@ public class BlackSmithConfigCommand implements CommandExecutor { if (enchantment == null) { return false; } + NamespacedKey enchantmentKey = enchantment.getKeyOrNull(); + if (enchantmentKey == null) { + return false; + } BlacksmithPlugin.getStringFormatter().displaySuccessMessage(sender, BlacksmithTranslatableMessage.getItemCurrentValueMessage(setting.getCommandName(), - ItemType.ENCHANTMENT, enchantment.getKey().getKey(), + ItemType.ENCHANTMENT, enchantmentKey.getKey(), String.valueOf(settings.getEnchantmentCost(enchantment)))); return true; } else { diff --git a/src/main/java/net/knarcraft/blacksmith/container/ActionCost.java b/src/main/java/net/knarcraft/blacksmith/container/ActionCost.java index 49bc2a7..4c9b384 100644 --- a/src/main/java/net/knarcraft/blacksmith/container/ActionCost.java +++ b/src/main/java/net/knarcraft/blacksmith/container/ActionCost.java @@ -2,6 +2,8 @@ package net.knarcraft.blacksmith.container; import net.knarcraft.blacksmith.BlacksmithPlugin; import net.knarcraft.blacksmith.manager.EconomyManager; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.NamespacedKey; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.serialization.ConfigurationSerializable; import org.bukkit.entity.Player; @@ -68,20 +70,46 @@ public record ActionCost(double monetaryCost, int expCost, @Nullable ItemStack i return new ActionCost(this.monetaryCost, this.expCost, this.itemCost, requiredPermissions); } + /** + * Displays this action cost as a string + * + * @param player

The player to calculate the cost for

+ * @return

The string representation of this action cost

+ */ @NotNull - public String displayCost() { + public String displayCost(@NotNull Player player) { StringBuilder builder = new StringBuilder(); if (monetaryCost > 0) { - builder.append(EconomyManager.format(monetaryCost)).append(", "); + builder.append(EconomyManager.format(monetaryCost)).append(", ").append("\n"); } if (expCost > 0) { - builder.append(expCost).append("exp, "); + builder.append(expCost).append("exp, ").append("\n"); } if (itemCost != null) { - // TODO: Present name, amount and name + lore - builder.append(itemCost); + NamespacedKey itemName = itemCost.getType().getKeyOrNull(); + if (itemName != null) { + builder.append(itemCost.getAmount()).append(" x ").append(itemName); + ItemMeta itemMeta = itemCost.getItemMeta(); + if (itemMeta != null && itemMeta.hasDisplayName()) { + builder.append("(").append(itemMeta.getDisplayName()).append(")"); + } + if (itemMeta != null && itemMeta.hasLore() && itemMeta.getLore() != null) { + for (String lore : itemMeta.getLore()) { + builder.append("\n").append(lore); + } + } + builder.append("\n"); + } + } + if (!requiredPermissions().isEmpty()) { + for (String permission : requiredPermissions()) { + if (player.hasPermission(permission)) { + builder.append(ChatColor.DARK_GREEN).append("O ").append(permission).append("\n"); + } else { + builder.append(ChatColor.DARK_RED).append("X ").append(permission).append("\n"); + } + } } - // TODO: Display required permissions if the player doesn't have them? return builder.toString(); } diff --git a/src/main/java/net/knarcraft/blacksmith/command/CostCommand.java b/src/main/java/net/knarcraft/blacksmith/util/CostHelper.java similarity index 80% rename from src/main/java/net/knarcraft/blacksmith/command/CostCommand.java rename to src/main/java/net/knarcraft/blacksmith/util/CostHelper.java index a372483..2078115 100644 --- a/src/main/java/net/knarcraft/blacksmith/command/CostCommand.java +++ b/src/main/java/net/knarcraft/blacksmith/util/CostHelper.java @@ -1,13 +1,11 @@ -package net.knarcraft.blacksmith.command; +package net.knarcraft.blacksmith.util; import net.knarcraft.blacksmith.BlacksmithPlugin; import net.knarcraft.blacksmith.container.ActionCost; import net.knarcraft.blacksmith.formatting.BlacksmithTranslatableMessage; import net.knarcraft.blacksmith.property.CostType; import org.bukkit.Bukkit; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.permissions.Permission; @@ -23,49 +21,48 @@ import java.util.Map; import java.util.Set; import java.util.StringJoiner; -public class CostCommand implements TabExecutor { +/** + * A helper class for setting action costs + */ +public final class CostHelper { private static List plugins; private static Map> permissions; - - @Override - public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] arguments) { - //TODO: Whenever a cost is specified (not for the per-material and per-enchantment costs), allow either a simple - // cost or an ActionCost. When loading costs, first try and parse a double. If not, parse an ActionCost object. - // TODO: The command should look like "blacksmithEdit