diff --git a/src/main/java/lol/hyper/toolstats/events/AnvilEvent.java b/src/main/java/lol/hyper/toolstats/events/AnvilEvent.java index a9e3629..e1a603a 100644 --- a/src/main/java/lol/hyper/toolstats/events/AnvilEvent.java +++ b/src/main/java/lol/hyper/toolstats/events/AnvilEvent.java @@ -25,6 +25,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.inventory.AnvilInventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; @@ -83,6 +84,11 @@ public class AnvilEvent implements Listener { // clone the item ItemStack clone = firstSlot.clone(); + if (tokenType.equalsIgnoreCase("reset")) { + reset(event, clone); + return; + } + // if the item is a mining tool if (toolStats.itemChecker.isMineTool(firstSlotMaterial)) { if (firstSlotMaterial.toString().toLowerCase(Locale.ROOT).contains("hoe")) { @@ -186,7 +192,7 @@ public class AnvilEvent implements Listener { break; } case "damage-taken": { - newItem.setItemMeta(toolStats.itemLore.updateDamage(newItem, 0.0)); + newItem.setItemMeta(toolStats.itemLore.updateDamage(newItem, 0.0, false)); break; } case "mob-kills": { @@ -217,4 +223,96 @@ public class AnvilEvent implements Listener { event.setResult(newItem); event.getView().setRepairCost(toolStats.itemChecker.getCost(targetToken)); } + + /** + * Reset an item's stats. This function is... gross. + * Because of how the lore system is set up, we have to basically revert the stats. + * The lore function requires the old value, then adds x to the current stat. + * This is required, so it can find the old line in the lore and update it. + * So we simply make the stat negative, and add it to reset it to zero. + * Gross? Yeah, but I don't want to rewrite the lore system again... + * + * @param event The PrepareAnvilEvent event. + * @param inputItem The input item to reset. + */ + private void reset(PrepareAnvilEvent event, ItemStack inputItem) { + ItemStack finalItem = inputItem.clone(); + ItemMeta meta = finalItem.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + if (container.has(toolStats.playerKills)) { + Integer playerKills = container.get(toolStats.playerKills, PersistentDataType.INTEGER); + if (playerKills == null) { + return; + } + meta = toolStats.itemLore.updatePlayerKills(finalItem, -playerKills); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.mobKills)) { + Integer mobKills = container.get(toolStats.mobKills, PersistentDataType.INTEGER); + if (mobKills == null) { + return; + } + meta = toolStats.itemLore.updateMobKills(finalItem, -mobKills); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.blocksMined)) { + Integer blocksMined = container.get(toolStats.blocksMined, PersistentDataType.INTEGER); + if (blocksMined == null) { + return; + } + meta = toolStats.itemLore.updateBlocksMined(finalItem, -blocksMined); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.cropsHarvested)) { + Integer cropsHarvested = container.get(toolStats.playerKills, PersistentDataType.INTEGER); + if (cropsHarvested == null) { + return; + } + meta = toolStats.itemLore.updateCropsMined(finalItem, -cropsHarvested); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.fishCaught)) { + Integer fishCaught = container.get(toolStats.fishCaught, PersistentDataType.INTEGER); + if (fishCaught == null) { + return; + } + meta = toolStats.itemLore.updateFishCaught(finalItem, -fishCaught); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.sheepSheared)) { + Integer sheepSheared = container.get(toolStats.sheepSheared, PersistentDataType.INTEGER); + if (sheepSheared == null) { + return; + } + meta = toolStats.itemLore.updateSheepSheared(finalItem, -sheepSheared); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.armorDamage)) { + Double armorDamage = container.get(toolStats.armorDamage, PersistentDataType.DOUBLE); + if (armorDamage == null) { + return; + } + meta = toolStats.itemLore.updateDamage(finalItem, -armorDamage, true); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.arrowsShot)) { + Integer arrowsShot = container.get(toolStats.arrowsShot, PersistentDataType.INTEGER); + if (arrowsShot == null) { + return; + } + meta = toolStats.itemLore.updateArrowsShot(finalItem, -arrowsShot); + finalItem.setItemMeta(meta); + } + if (container.has(toolStats.flightTime)) { + Long flightTime = container.get(toolStats.flightTime, PersistentDataType.LONG); + if (flightTime == null) { + return; + } + meta = toolStats.itemLore.updateFlightTime(finalItem, -flightTime); + finalItem.setItemMeta(meta); + } + event.setResult(finalItem); + event.getView().setRepairCost(toolStats.itemChecker.getCost("reset")); + } } diff --git a/src/main/java/lol/hyper/toolstats/events/EntityDamage.java b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java index b637476..2d77a0b 100644 --- a/src/main/java/lol/hyper/toolstats/events/EntityDamage.java +++ b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java @@ -146,7 +146,7 @@ public class EntityDamage implements Listener { for (ItemStack armorPiece : armorContents) { if (armorPiece != null) { if (toolStats.itemChecker.isArmor(armorPiece.getType())) { - ItemMeta newItem = toolStats.itemLore.updateDamage(armorPiece, event.getFinalDamage()); + ItemMeta newItem = toolStats.itemLore.updateDamage(armorPiece, event.getFinalDamage(), false); if (newItem != null) { armorPiece.setItemMeta(newItem); } @@ -181,7 +181,7 @@ public class EntityDamage implements Listener { for (ItemStack armorPiece : armorContents) { if (armorPiece != null) { if (toolStats.itemChecker.isArmor(armorPiece.getType())) { - ItemMeta newItem = toolStats.itemLore.updateDamage(armorPiece, event.getFinalDamage()); + ItemMeta newItem = toolStats.itemLore.updateDamage(armorPiece, event.getFinalDamage(),false); if (newItem != null) { armorPiece.setItemMeta(newItem); } @@ -216,7 +216,7 @@ public class EntityDamage implements Listener { for (ItemStack armorPiece : armorContents) { if (armorPiece != null) { if (toolStats.itemChecker.isArmor(armorPiece.getType())) { - ItemMeta newItem = toolStats.itemLore.updateDamage(armorPiece, event.getFinalDamage()); + ItemMeta newItem = toolStats.itemLore.updateDamage(armorPiece, event.getFinalDamage(), false); if (newItem != null) { armorPiece.setItemMeta(newItem); } diff --git a/src/main/java/lol/hyper/toolstats/tools/ItemLore.java b/src/main/java/lol/hyper/toolstats/tools/ItemLore.java index 65fa58d..3fb5927 100644 --- a/src/main/java/lol/hyper/toolstats/tools/ItemLore.java +++ b/src/main/java/lol/hyper/toolstats/tools/ItemLore.java @@ -425,11 +425,15 @@ public class ItemLore { * Add damage to an armor piece. * * @param armorPiece The armor to update. + * @param damage The amount of damage to apply. + * @param bypass Bypass the negative damage check. */ - public ItemMeta updateDamage(ItemStack armorPiece, double damage) { + public ItemMeta updateDamage(ItemStack armorPiece, double damage, boolean bypass) { // ignore if the damage is zero or negative if (damage < 0) { - return null; + if (!bypass) { + return null; + } } ItemStack clone = armorPiece.clone(); ItemMeta meta = clone.getItemMeta(); 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 10b07b1..c875464 100644 --- a/src/main/java/lol/hyper/toolstats/tools/config/TokenItems.java +++ b/src/main/java/lol/hyper/toolstats/tools/config/TokenItems.java @@ -215,7 +215,7 @@ public class TokenItems { token.setItemMeta(tokenMeta); return token; } - + public ItemStack resetToken() { // set up the item ItemStack token = new ItemStack(Material.PAPER);