Implements armor trim salvage #24
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				EpicKnarvik97/Blacksmith/pipeline/head This commit looks good
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	EpicKnarvik97/Blacksmith/pipeline/head This commit looks good
				
			This commit is contained in:
		@@ -141,6 +141,16 @@ public class ScrapperNPCSettings implements TraitSettings<ScrapperSetting> {
 | 
			
		||||
        return asString(ScrapperSetting.COST_MESSAGE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the message to use for displaying armor trim salvage cost
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>The message to use for displaying armor trim salvage cost</p>
 | 
			
		||||
     */
 | 
			
		||||
    @NotNull
 | 
			
		||||
    public String getArmorTrimCostMessage() {
 | 
			
		||||
        return asString(ScrapperSetting.COST_MESSAGE_ARMOR_TRIM);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @NotNull
 | 
			
		||||
    public String getCoolDownUnexpiredMessage() {
 | 
			
		||||
@@ -297,6 +307,15 @@ public class ScrapperNPCSettings implements TraitSettings<ScrapperSetting> {
 | 
			
		||||
        return asBoolean(ScrapperSetting.SALVAGE_ENCHANTED);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Whether salvage of armor trims is enabled
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>True if this scrapper can salvage armor trims</p>
 | 
			
		||||
     */
 | 
			
		||||
    public boolean salvageArmorTrims() {
 | 
			
		||||
        return asBoolean(ScrapperSetting.SALVAGE_ARMOR_TRIMS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the title of this scrapper NPC
 | 
			
		||||
     *
 | 
			
		||||
@@ -371,4 +390,29 @@ public class ScrapperNPCSettings implements TraitSettings<ScrapperSetting> {
 | 
			
		||||
        return asString(ScrapperSetting.CANNOT_SALVAGE_ENCHANTED_MESSAGE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the message to display when explaining that this scrapper is unable to salvage armor trims
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>The cannot salvage armor trim message</p>
 | 
			
		||||
     */
 | 
			
		||||
    @NotNull
 | 
			
		||||
    public String getCannotSalvageArmorTrimMessage() {
 | 
			
		||||
        return asString(ScrapperSetting.CANNOT_SALVAGE_ARMOR_TRIM_MESSAGE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the message to display when explaining that this scrapper is unable to find salvage for the armor trim
 | 
			
		||||
     *
 | 
			
		||||
     * <p>Because there is no direct way (that I have found) to convert TrimMaterial and TrimPattern to Material, armor
 | 
			
		||||
     * trim salvaging relies on material string and a hard-coded map. As those are prone to breaking because of API
 | 
			
		||||
     * changes, there is a high likelihood that cases will arise when the scrapper is unable to find the correct
 | 
			
		||||
     * materials.</p>
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>The cannot find armor trim salvage message</p>
 | 
			
		||||
     */
 | 
			
		||||
    @NotNull
 | 
			
		||||
    public String getArmorTrimSalvageNotFoundMessage() {
 | 
			
		||||
        return asString(ScrapperSetting.ARMOR_TRIM_SALVAGE_NOT_FOUND_MESSAGE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -79,6 +79,12 @@ public enum ScrapperSetting implements Setting {
 | 
			
		||||
    SALVAGE_ENCHANTED("salvageEnchanted", SettingValueType.BOOLEAN, false,
 | 
			
		||||
            "Whether to enable salvaging of enchanted items. This is disabled by default because it's " +
 | 
			
		||||
                    "possible to accidentally salvage items with very good enchantments.", true, false),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The setting for whether the NPC should allow salvaging of armor trims
 | 
			
		||||
     */
 | 
			
		||||
    SALVAGE_ARMOR_TRIMS("salvageArmorTrims", SettingValueType.BOOLEAN, true,
 | 
			
		||||
            "Whether to enable salvaging of armor trims.", true, false),
 | 
			
		||||
    
 | 
			
		||||
    /*-----------
 | 
			
		||||
     | Messages |
 | 
			
		||||
@@ -155,12 +161,19 @@ public enum ScrapperSetting implements Setting {
 | 
			
		||||
            "The message to display when a player cannot pay for the salvaging", true, true),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The message displayed when displaying the cost of reforging the held item to the player
 | 
			
		||||
     * The message displayed when displaying the cost of salvaging the held item to the player
 | 
			
		||||
     */
 | 
			
		||||
    COST_MESSAGE("costMessage", SettingValueType.STRING,
 | 
			
		||||
            "&eIt will cost &a{cost}&e to salvage that item! {yield} Click again to salvage!",
 | 
			
		||||
            "The message to display when informing a player about the salvaging cost", true, true),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The message displayed when displaying the cost of salvaging the armor trim of the held item to the player
 | 
			
		||||
     */
 | 
			
		||||
    COST_MESSAGE_ARMOR_TRIM("costMessageArmorTrim", SettingValueType.STRING,
 | 
			
		||||
            "&eIt will cost &a{cost}&e to salvage that armor trim!",
 | 
			
		||||
            "The message to display when explaining the shown item's armor trim's salvage cost", true, true),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The message displayed when explaining that all items will be returned as salvage
 | 
			
		||||
     */
 | 
			
		||||
@@ -175,10 +188,27 @@ public enum ScrapperSetting implements Setting {
 | 
			
		||||
            "&cI cannot extract all components from that damaged item.&r",
 | 
			
		||||
            "The message to display when explaining expected partial yield as part of the cost message", true, true),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The message displayed when explaining that enchanted item salvage is disabled
 | 
			
		||||
     */
 | 
			
		||||
    CANNOT_SALVAGE_ENCHANTED_MESSAGE("cannotSalvageEnchantedMessage", SettingValueType.STRING,
 | 
			
		||||
            "&cI'm sorry, but I'm unable to salvage enchanted items!",
 | 
			
		||||
            "The message to display when asked to salvage an enchanted item, and that option is disabled", true, true),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The message displayed when explaining that armor trim salvage is disabled
 | 
			
		||||
     */
 | 
			
		||||
    CANNOT_SALVAGE_ARMOR_TRIM_MESSAGE("cannotSalvageArmorTrimMessage", SettingValueType.STRING,
 | 
			
		||||
            "&cI'm sorry, but I'm unable to salvage armor trims!",
 | 
			
		||||
            "The message to display when asked to salvage an armor trim, and that option is disabled", true, true),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The message displayed when explaining that the items to return as armor trim salvage are unknown
 | 
			
		||||
     */
 | 
			
		||||
    ARMOR_TRIM_SALVAGE_NOT_FOUND_MESSAGE("armorTrimSalvageNotFoundMessage", SettingValueType.STRING,
 | 
			
		||||
            "&cI'm sorry, but I don't know how to salvage that armor trim!",
 | 
			
		||||
            "The message to display if the correct materials to return for the armor trim are unknown", true, true),
 | 
			
		||||
 | 
			
		||||
    /*------------------
 | 
			
		||||
     | Global settings |
 | 
			
		||||
     ------------------*/
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.Server;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
import org.bukkit.inventory.meta.ArmorMeta;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
@@ -87,6 +88,23 @@ public class ScrapperTrait extends CustomTrait<ScrapperSetting> {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<ItemStack> salvage = null;
 | 
			
		||||
 | 
			
		||||
        // Deal with armor trim salvage
 | 
			
		||||
        boolean salvagingArmorTrim = false;
 | 
			
		||||
        if (itemInHand.getItemMeta() instanceof ArmorMeta armorMeta && armorMeta.hasTrim()) {
 | 
			
		||||
            if (!getSettings().salvageArmorTrims()) {
 | 
			
		||||
                sendNPCMessage(this.npc, player, getSettings().getCannotSalvageArmorTrimMessage());
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            salvage = SalvageHelper.getTrimSalvage(itemInHand, armorMeta);
 | 
			
		||||
            if (salvage == null) {
 | 
			
		||||
                sendNPCMessage(this.npc, player, getSettings().getArmorTrimSalvageNotFoundMessage());
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            salvagingArmorTrim = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Check if the item is enchanted, and whether this blacksmith can salvage it
 | 
			
		||||
        if (!itemInHand.getEnchantments().isEmpty() && !getSettings().salvageEnchanted()) {
 | 
			
		||||
            sendNPCMessage(this.npc, player, getSettings().getCannotSalvageEnchantedMessage());
 | 
			
		||||
@@ -94,7 +112,9 @@ public class ScrapperTrait extends CustomTrait<ScrapperSetting> {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Check if any salvage will be produced
 | 
			
		||||
        List<ItemStack> salvage = getSalvage(itemInHand, extended);
 | 
			
		||||
        if (salvage == null) {
 | 
			
		||||
            salvage = getSalvage(itemInHand, extended);
 | 
			
		||||
        }
 | 
			
		||||
        boolean noUsefulSalvage = salvage == null || salvage.isEmpty();
 | 
			
		||||
        if (noUsefulSalvage) {
 | 
			
		||||
            sendNPCMessage(this.npc, player, getSettings().getTooDamagedMessage());
 | 
			
		||||
@@ -114,8 +134,13 @@ public class ScrapperTrait extends CustomTrait<ScrapperSetting> {
 | 
			
		||||
            expectedYield = getSettings().getPartialSalvageMessage();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        sendNPCMessage(this.npc, player, StringFormatter.replacePlaceholders(getSettings().getCostMessage(),
 | 
			
		||||
                List.of("{cost}", "{yield}"), List.of(cost, expectedYield)));
 | 
			
		||||
        if (salvagingArmorTrim) {
 | 
			
		||||
            sendNPCMessage(this.npc, player, StringFormatter.replacePlaceholder(getSettings().getArmorTrimCostMessage(),
 | 
			
		||||
                    "{cost}", cost));
 | 
			
		||||
        } else {
 | 
			
		||||
            sendNPCMessage(this.npc, player, StringFormatter.replacePlaceholders(getSettings().getCostMessage(),
 | 
			
		||||
                    List.of("{cost}", "{yield}"), List.of(cost, expectedYield)));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,9 @@ import org.bukkit.inventory.ItemStack;
 | 
			
		||||
import org.bukkit.inventory.Recipe;
 | 
			
		||||
import org.bukkit.inventory.ShapedRecipe;
 | 
			
		||||
import org.bukkit.inventory.ShapelessRecipe;
 | 
			
		||||
import org.bukkit.inventory.meta.ArmorMeta;
 | 
			
		||||
import org.bukkit.inventory.meta.trim.ArmorTrim;
 | 
			
		||||
import org.bukkit.inventory.meta.trim.TrimMaterial;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
@@ -24,6 +27,59 @@ import java.util.Random;
 | 
			
		||||
public final class SalvageHelper {
 | 
			
		||||
 | 
			
		||||
    private static final Random random = new Random();
 | 
			
		||||
    private static final Map<TrimMaterial, Material> trimMaterialToMaterial;
 | 
			
		||||
 | 
			
		||||
    static {
 | 
			
		||||
        trimMaterialToMaterial = new HashMap<>();
 | 
			
		||||
        trimMaterialToMaterial.put(TrimMaterial.AMETHYST, Material.AMETHYST_SHARD);
 | 
			
		||||
        trimMaterialToMaterial.put(TrimMaterial.COPPER, Material.COPPER_INGOT);
 | 
			
		||||
        trimMaterialToMaterial.put(TrimMaterial.DIAMOND, Material.DIAMOND);
 | 
			
		||||
        trimMaterialToMaterial.put(TrimMaterial.EMERALD, Material.EMERALD);
 | 
			
		||||
        trimMaterialToMaterial.put(TrimMaterial.GOLD, Material.GOLD_INGOT);
 | 
			
		||||
        trimMaterialToMaterial.put(TrimMaterial.IRON, Material.IRON_INGOT);
 | 
			
		||||
        trimMaterialToMaterial.put(TrimMaterial.LAPIS, Material.LAPIS_LAZULI);
 | 
			
		||||
        trimMaterialToMaterial.put(TrimMaterial.NETHERITE, Material.NETHERITE_INGOT);
 | 
			
		||||
        trimMaterialToMaterial.put(TrimMaterial.QUARTZ, Material.QUARTZ);
 | 
			
		||||
        trimMaterialToMaterial.put(TrimMaterial.REDSTONE, Material.REDSTONE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets salvage for the given armor trim
 | 
			
		||||
     *
 | 
			
		||||
     * @param item      <p>The item to have its armor trim salvaged</p>
 | 
			
		||||
     * @param armorMeta <p>The armor meta of the item to salvage</p>
 | 
			
		||||
     * @return <p>The salvage, or null if salvage could not be calculated</p>
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public static List<ItemStack> getTrimSalvage(@NotNull ItemStack item, @NotNull ArmorMeta armorMeta) {
 | 
			
		||||
        ArmorTrim armorTrim = armorMeta.getTrim();
 | 
			
		||||
        if (armorTrim == null) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<ItemStack> result = new ArrayList<>();
 | 
			
		||||
        Material trimMaterial = trimMaterialToMaterial.get(armorTrim.getMaterial());
 | 
			
		||||
        if (trimMaterial != null) {
 | 
			
		||||
            result.add(new ItemStack(trimMaterial, 1));
 | 
			
		||||
        } else {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        Material patternMaterial = Material.matchMaterial(armorTrim.getPattern().getKey().getKey() +
 | 
			
		||||
                "_ARMOR_TRIM_SMITHING_TEMPLATE");
 | 
			
		||||
        if (patternMaterial != null) {
 | 
			
		||||
            result.add(new ItemStack(patternMaterial, 1));
 | 
			
		||||
        } else {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Return a clone of the input item, with the armor trim removed
 | 
			
		||||
        ItemStack strippedItem = item.clone();
 | 
			
		||||
        armorMeta.setTrim(null);
 | 
			
		||||
        strippedItem.setItemMeta(armorMeta);
 | 
			
		||||
        result.add(strippedItem);
 | 
			
		||||
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets whether the given item has a valid crafting recipe
 | 
			
		||||
 
 | 
			
		||||
@@ -167,6 +167,9 @@ scrapper:
 | 
			
		||||
    # salvage items with very good enchantments.
 | 
			
		||||
    salvageEnchanted: false
 | 
			
		||||
    
 | 
			
		||||
    # Whether to enable salvaging of armor trims
 | 
			
		||||
    salvageArmorTrims: true
 | 
			
		||||
    
 | 
			
		||||
    # Default values for messages used by NPCs
 | 
			
		||||
    messages:
 | 
			
		||||
      # The message to display when another player is using the scrapper
 | 
			
		||||
@@ -202,6 +205,9 @@ scrapper:
 | 
			
		||||
      # The message to display when explaining the shown item's salvage cost
 | 
			
		||||
      costMessage: "&eIt will cost &a{cost}&e to salvage that item! {yield} &eClick again to salvage!"
 | 
			
		||||
      
 | 
			
		||||
      # The message to display when explaining the shown item's armor trim's salvage cost
 | 
			
		||||
      costMessageArmorTrim: "&eIt will cost &a{cost}&e to salvage that armor trim!"
 | 
			
		||||
      
 | 
			
		||||
      # The yield message to display if trying to salvage a non-damaged item
 | 
			
		||||
      fullSalvageMessage: "&aI should be able to extract all components from that pristine item.&r"
 | 
			
		||||
      
 | 
			
		||||
@@ -209,4 +215,10 @@ scrapper:
 | 
			
		||||
      partialSalvageMessage: "&cI cannot extract all components from that damaged item.&r"
 | 
			
		||||
      
 | 
			
		||||
      # The message to display when asked to salvage an enchanted item, and that option is disabled
 | 
			
		||||
      cannotSalvageEnchantedMessage: "&cI'm sorry, but I'm unable to salvage enchanted items!"
 | 
			
		||||
      cannotSalvageEnchantedMessage: "&cI'm sorry, but I'm unable to salvage enchanted items!"
 | 
			
		||||
      
 | 
			
		||||
      # The message to display when asked to salvage an armor trim, and that option is disabled
 | 
			
		||||
      cannotSalvageArmorTrimMessage: "&cI'm sorry, but I'm unable to salvage armor trims!"
 | 
			
		||||
      
 | 
			
		||||
      # The message to display if the correct materials to return for the armor trim are unknown
 | 
			
		||||
      armorTrimSalvageNotFoundMessage: "&cI'm sorry, but I don't know how to salvage that armor trim!"
 | 
			
		||||
@@ -6,43 +6,43 @@ main: net.knarcraft.blacksmith.BlacksmithPlugin
 | 
			
		||||
depend: [ Citizens, Vault ]
 | 
			
		||||
prefix: "Blacksmith"
 | 
			
		||||
 | 
			
		||||
api-version: 1.19
 | 
			
		||||
api-version: 1.20
 | 
			
		||||
 | 
			
		||||
commands:
 | 
			
		||||
  blacksmith:
 | 
			
		||||
    permission: blacksmith.edit
 | 
			
		||||
    usage: /<command> <option> [new value]
 | 
			
		||||
    description: Used for configuring the selected blacksmith NPC
 | 
			
		||||
    description: Used for configuring the selected blacksmith NPC.
 | 
			
		||||
  blacksmithConfig:
 | 
			
		||||
    permission: blacksmith.admin
 | 
			
		||||
    usage: /<command> <option/reload> [new value]
 | 
			
		||||
    description: Used for configuring default blacksmith settings, or global blacksmith settings
 | 
			
		||||
    description: Used for configuring default blacksmith settings, or global blacksmith settings.
 | 
			
		||||
  scrapper:
 | 
			
		||||
    permission: blacksmith.edit
 | 
			
		||||
    usage: /<command> <option> [new value]
 | 
			
		||||
    description: Used for configuring the selected scrapper NPC
 | 
			
		||||
    description: Used for configuring the selected scrapper NPC.
 | 
			
		||||
  scrapperConfig:
 | 
			
		||||
    permission: blacksmith.admin
 | 
			
		||||
    usage: /<command> <option/reload> [new value]
 | 
			
		||||
    description: Used for configuring default scrapper settings, or global scrapper settings
 | 
			
		||||
    description: Used for configuring default scrapper settings, or global scrapper settings.
 | 
			
		||||
  preset:
 | 
			
		||||
    permission: blacksmith.preset
 | 
			
		||||
    usage: /<command> <preset>[:filter]
 | 
			
		||||
    description: Used to display which materials are part of a given preset. If a filter, such as diamond is used, the result of applying the filter is shown.
 | 
			
		||||
permissions:
 | 
			
		||||
  blacksmith.admin:
 | 
			
		||||
    description: Allows overall blacksmith configuration
 | 
			
		||||
    description: Allows overall blacksmith and scrapper configuration.
 | 
			
		||||
    default: op
 | 
			
		||||
    children:
 | 
			
		||||
      blacksmith.edit: true
 | 
			
		||||
      blacksmith.use: true
 | 
			
		||||
      blacksmith.preset: true
 | 
			
		||||
  blacksmith.edit:
 | 
			
		||||
    description: Allows changing settings for the selected blacksmith NPC
 | 
			
		||||
    description: Allows changing settings for the selected blacksmith or scrapper NPC.
 | 
			
		||||
    default: op
 | 
			
		||||
  blacksmith.use:
 | 
			
		||||
    description: Allows the player to repair items using blacksmiths
 | 
			
		||||
    description: Allows the player to repair items using blacksmiths and salvage items using scrappers.
 | 
			
		||||
    default: true
 | 
			
		||||
  blacksmith.preset:
 | 
			
		||||
    description: Allows the player to use the /preset command
 | 
			
		||||
    description: Allows the player to use the /preset command.
 | 
			
		||||
    default: op
 | 
			
		||||
		Reference in New Issue
	
	Block a user