From f13f17be5860e0efc7d494b8d9629e3b58202f5d Mon Sep 17 00:00:00 2001 From: hyperdefined Date: Sun, 30 Mar 2025 20:54:25 -0400 Subject: [PATCH] add remove stat token --- .../toolstats/commands/CommandToolStats.java | 6 + .../hyper/toolstats/events/AnvilEvent.java | 157 ++++++++++++++++++ .../hyper/toolstats/tools/TokenCrafting.java | 7 + .../toolstats/tools/config/TokenItems.java | 18 ++ 4 files changed, 188 insertions(+) diff --git a/src/main/java/lol/hyper/toolstats/commands/CommandToolStats.java b/src/main/java/lol/hyper/toolstats/commands/CommandToolStats.java index b69b3cc..c129b38 100644 --- a/src/main/java/lol/hyper/toolstats/commands/CommandToolStats.java +++ b/src/main/java/lol/hyper/toolstats/commands/CommandToolStats.java @@ -448,6 +448,12 @@ public class CommandToolStats implements TabExecutor { target.getInventory().addItem(itemStack); break; } + case "remove": { + ItemStack itemStack = toolStats.tokenItems.removeToken(); + itemStack.setAmount(amount); + target.getInventory().addItem(itemStack); + break; + } } } diff --git a/src/main/java/lol/hyper/toolstats/events/AnvilEvent.java b/src/main/java/lol/hyper/toolstats/events/AnvilEvent.java index 77b1146..ce7960a 100644 --- a/src/main/java/lol/hyper/toolstats/events/AnvilEvent.java +++ b/src/main/java/lol/hyper/toolstats/events/AnvilEvent.java @@ -18,6 +18,7 @@ package lol.hyper.toolstats.events; import lol.hyper.toolstats.ToolStats; +import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -89,6 +90,11 @@ public class AnvilEvent implements Listener { return; } + if (tokenType.equalsIgnoreCase("remove")) { + remove(event, clone); + return; + } + // if the item is a mining tool if (toolStats.itemChecker.isMineTool(firstSlotMaterial)) { if (firstSlotMaterial.toString().toLowerCase(Locale.ROOT).contains("hoe")) { @@ -385,4 +391,155 @@ public class AnvilEvent implements Listener { event.setResult(finalItem); event.getView().setRepairCost(toolStats.itemChecker.getCost("reset")); } + + /** + * Remove all stats from an item. + * + * @param event The PrepareAnvilEvent event. + * @param inputItem The input item to remove stats from. + */ + private void remove(PrepareAnvilEvent event, ItemStack inputItem) { + ItemStack finalItem = inputItem.clone(); + ItemMeta meta = finalItem.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + // remove the applied tokens + if (container.has(toolStats.tokenApplied)) { + container.remove(toolStats.tokenApplied); + } + + if (container.has(toolStats.playerKills)) { + Integer playerKills = container.get(toolStats.playerKills, PersistentDataType.INTEGER); + if (playerKills == null) { + return; + } + + container.remove(toolStats.playerKills); + + String playerKillsFormatted = toolStats.numberFormat.formatInt(playerKills); + Component lineToRemove = toolStats.configTools.formatLore("kills.player", "{kills}", playerKillsFormatted); + meta.lore(toolStats.itemLore.removeLore(meta.lore(), lineToRemove)); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.mobKills)) { + Integer mobKills = container.get(toolStats.mobKills, PersistentDataType.INTEGER); + if (mobKills == null) { + return; + } + + container.remove(toolStats.mobKills); + + String mobKillsFormatted = toolStats.numberFormat.formatInt(mobKills); + Component lineToRemove = toolStats.configTools.formatLore("kills.mob", "{kills}", mobKillsFormatted); + meta.lore(toolStats.itemLore.removeLore(meta.lore(), lineToRemove)); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.blocksMined)) { + Integer blocksMined = container.get(toolStats.blocksMined, PersistentDataType.INTEGER); + if (blocksMined == null) { + return; + } + + container.remove(toolStats.blocksMined); + + String blocksMinedFormatted = toolStats.numberFormat.formatInt(blocksMined); + Component lineToRemove = toolStats.configTools.formatLore("blocks-mined", "{blocks}", blocksMinedFormatted); + meta.lore(toolStats.itemLore.removeLore(meta.lore(), lineToRemove)); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.cropsHarvested)) { + Integer cropsHarvested = container.get(toolStats.playerKills, PersistentDataType.INTEGER); + if (cropsHarvested == null) { + return; + } + + container.remove(toolStats.cropsHarvested); + + String cropsHarvestedFormatted = toolStats.numberFormat.formatInt(cropsHarvested); + Component lineToRemove = toolStats.configTools.formatLore("crops-harvested", "{crops}", cropsHarvestedFormatted); + meta.lore(toolStats.itemLore.removeLore(meta.lore(), lineToRemove)); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.fishCaught)) { + Integer fishCaught = container.get(toolStats.fishCaught, PersistentDataType.INTEGER); + if (fishCaught == null) { + return; + } + + container.remove(toolStats.fishCaught); + + String fishCaughtFormatted = toolStats.numberFormat.formatInt(fishCaught); + Component lineToRemove = toolStats.configTools.formatLore("fished.fish-caught", "{fish}", fishCaughtFormatted); + meta.lore(toolStats.itemLore.removeLore(meta.lore(), lineToRemove)); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.sheepSheared)) { + Integer sheepSheared = container.get(toolStats.sheepSheared, PersistentDataType.INTEGER); + if (sheepSheared == null) { + return; + } + + container.remove(toolStats.sheepSheared); + + String sheepShearedFormatted = toolStats.numberFormat.formatInt(sheepSheared); + Component lineToRemove = toolStats.configTools.formatLore("sheep.sheared", "{sheep}", sheepShearedFormatted); + meta.lore(toolStats.itemLore.removeLore(meta.lore(), lineToRemove)); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.armorDamage)) { + Double armorDamage = container.get(toolStats.armorDamage, PersistentDataType.DOUBLE); + if (armorDamage == null) { + return; + } + + container.remove(toolStats.armorDamage); + + String armorDamageFormatted = toolStats.numberFormat.formatDouble(armorDamage); + Component lineToRemove = toolStats.configTools.formatLore("damage-taken", "{damage}", armorDamageFormatted); + meta.lore(toolStats.itemLore.removeLore(meta.lore(), lineToRemove)); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.damageDone)) { + Double damageDone = container.get(toolStats.damageDone, PersistentDataType.DOUBLE); + if (damageDone == null) { + return; + } + + container.remove(toolStats.damageDone); + + String damageDoneFormatted = toolStats.numberFormat.formatDouble(damageDone); + Component lineToRemove = toolStats.configTools.formatLore("damage-done", "{damage}", damageDoneFormatted); + meta.lore(toolStats.itemLore.removeLore(meta.lore(), lineToRemove)); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.arrowsShot)) { + Integer arrowsShot = container.get(toolStats.arrowsShot, PersistentDataType.INTEGER); + if (arrowsShot == null) { + return; + } + + container.remove(toolStats.arrowsShot); + + String arrowsShotFormatted = toolStats.numberFormat.formatInt(arrowsShot); + Component lineToRemove = toolStats.configTools.formatLore("arrows-shot", "{arrows}", arrowsShotFormatted); + meta.lore(toolStats.itemLore.removeLore(meta.lore(), lineToRemove)); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.flightTime)) { + Long flightTime = container.get(toolStats.flightTime, PersistentDataType.LONG); + if (flightTime == null) { + return; + } + + container.remove(toolStats.flightTime); + + String flightTimeFormatted = toolStats.numberFormat.formatDouble(flightTime); + Component lineToRemove = toolStats.configTools.formatLore("flight-time", "{time}", flightTimeFormatted); + meta.lore(toolStats.itemLore.removeLore(meta.lore(), lineToRemove)); + finalItem.setItemMeta(meta); + } + + event.setResult(finalItem); + event.getView().setRepairCost(toolStats.itemChecker.getCost("remove")); + } } diff --git a/src/main/java/lol/hyper/toolstats/tools/TokenCrafting.java b/src/main/java/lol/hyper/toolstats/tools/TokenCrafting.java index 274ac56..05f3102 100644 --- a/src/main/java/lol/hyper/toolstats/tools/TokenCrafting.java +++ b/src/main/java/lol/hyper/toolstats/tools/TokenCrafting.java @@ -113,6 +113,12 @@ public class TokenCrafting { resetRecipe.setIngredient('P', Material.PAPER); recipes.add(resetRecipe); + NamespacedKey removeKey = new NamespacedKey(toolStats, "remove-token"); + ShapedRecipe removeRecipe = new ShapedRecipe(removeKey, toolStats.tokenItems.removeToken()); + resetRecipe.shape(" P ", "P P", " P "); + resetRecipe.setIngredient('P', Material.PAPER); + recipes.add(removeRecipe); + tokenTypes.add("crops-mined"); tokenTypes.add("blocks-mined"); tokenTypes.add("damage-taken"); @@ -123,6 +129,7 @@ public class TokenCrafting { tokenTypes.add("flight-time"); tokenTypes.add("fish-caught"); tokenTypes.add("reset"); + tokenTypes.add("remove"); } public Set getRecipes() { diff --git a/src/main/java/lol/hyper/toolstats/tools/config/TokenItems.java b/src/main/java/lol/hyper/toolstats/tools/config/TokenItems.java index d735a2e..b8745cc 100644 --- a/src/main/java/lol/hyper/toolstats/tools/config/TokenItems.java +++ b/src/main/java/lol/hyper/toolstats/tools/config/TokenItems.java @@ -233,4 +233,22 @@ public class TokenItems { token.setItemMeta(tokenMeta); return token; } + + public ItemStack removeToken() { + // set up the item + ItemStack token = new ItemStack(Material.PAPER); + ItemMeta tokenMeta = token.getItemMeta(); + PersistentDataContainer tokenData = tokenMeta.getPersistentDataContainer(); + + // set the title and lore + Component title = toolStats.configTools.format("tokens.data.remove.title"); + List lore = toolStats.configTools.getTokenLore("remove"); + tokenMeta.displayName(title); + tokenMeta.lore(lore); + + // set the PDC + tokenData.set(toolStats.tokenType, PersistentDataType.STRING, "remove"); + token.setItemMeta(tokenMeta); + return token; + } }