correctly do the reset token

This commit is contained in:
hyperdefined
2025-01-26 16:48:34 -05:00
parent e3629bf813
commit 3da98afd49
4 changed files with 109 additions and 7 deletions

View File

@@ -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"));
}
}

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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);