mirror of
https://github.com/hyperdefined/ToolStats.git
synced 2025-12-10 14:44:58 +00:00
correctly do the reset token
This commit is contained in:
@@ -25,6 +25,7 @@ import org.bukkit.event.Listener;
|
|||||||
import org.bukkit.event.inventory.PrepareAnvilEvent;
|
import org.bukkit.event.inventory.PrepareAnvilEvent;
|
||||||
import org.bukkit.inventory.AnvilInventory;
|
import org.bukkit.inventory.AnvilInventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.bukkit.persistence.PersistentDataContainer;
|
import org.bukkit.persistence.PersistentDataContainer;
|
||||||
import org.bukkit.persistence.PersistentDataType;
|
import org.bukkit.persistence.PersistentDataType;
|
||||||
|
|
||||||
@@ -83,6 +84,11 @@ public class AnvilEvent implements Listener {
|
|||||||
// clone the item
|
// clone the item
|
||||||
ItemStack clone = firstSlot.clone();
|
ItemStack clone = firstSlot.clone();
|
||||||
|
|
||||||
|
if (tokenType.equalsIgnoreCase("reset")) {
|
||||||
|
reset(event, clone);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// if the item is a mining tool
|
// if the item is a mining tool
|
||||||
if (toolStats.itemChecker.isMineTool(firstSlotMaterial)) {
|
if (toolStats.itemChecker.isMineTool(firstSlotMaterial)) {
|
||||||
if (firstSlotMaterial.toString().toLowerCase(Locale.ROOT).contains("hoe")) {
|
if (firstSlotMaterial.toString().toLowerCase(Locale.ROOT).contains("hoe")) {
|
||||||
@@ -186,7 +192,7 @@ public class AnvilEvent implements Listener {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "damage-taken": {
|
case "damage-taken": {
|
||||||
newItem.setItemMeta(toolStats.itemLore.updateDamage(newItem, 0.0));
|
newItem.setItemMeta(toolStats.itemLore.updateDamage(newItem, 0.0, false));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "mob-kills": {
|
case "mob-kills": {
|
||||||
@@ -217,4 +223,96 @@ public class AnvilEvent implements Listener {
|
|||||||
event.setResult(newItem);
|
event.setResult(newItem);
|
||||||
event.getView().setRepairCost(toolStats.itemChecker.getCost(targetToken));
|
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"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ public class EntityDamage implements Listener {
|
|||||||
for (ItemStack armorPiece : armorContents) {
|
for (ItemStack armorPiece : armorContents) {
|
||||||
if (armorPiece != null) {
|
if (armorPiece != null) {
|
||||||
if (toolStats.itemChecker.isArmor(armorPiece.getType())) {
|
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) {
|
if (newItem != null) {
|
||||||
armorPiece.setItemMeta(newItem);
|
armorPiece.setItemMeta(newItem);
|
||||||
}
|
}
|
||||||
@@ -181,7 +181,7 @@ public class EntityDamage implements Listener {
|
|||||||
for (ItemStack armorPiece : armorContents) {
|
for (ItemStack armorPiece : armorContents) {
|
||||||
if (armorPiece != null) {
|
if (armorPiece != null) {
|
||||||
if (toolStats.itemChecker.isArmor(armorPiece.getType())) {
|
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) {
|
if (newItem != null) {
|
||||||
armorPiece.setItemMeta(newItem);
|
armorPiece.setItemMeta(newItem);
|
||||||
}
|
}
|
||||||
@@ -216,7 +216,7 @@ public class EntityDamage implements Listener {
|
|||||||
for (ItemStack armorPiece : armorContents) {
|
for (ItemStack armorPiece : armorContents) {
|
||||||
if (armorPiece != null) {
|
if (armorPiece != null) {
|
||||||
if (toolStats.itemChecker.isArmor(armorPiece.getType())) {
|
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) {
|
if (newItem != null) {
|
||||||
armorPiece.setItemMeta(newItem);
|
armorPiece.setItemMeta(newItem);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -425,12 +425,16 @@ public class ItemLore {
|
|||||||
* Add damage to an armor piece.
|
* Add damage to an armor piece.
|
||||||
*
|
*
|
||||||
* @param armorPiece The armor to update.
|
* @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
|
// ignore if the damage is zero or negative
|
||||||
if (damage < 0) {
|
if (damage < 0) {
|
||||||
|
if (!bypass) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ItemStack clone = armorPiece.clone();
|
ItemStack clone = armorPiece.clone();
|
||||||
ItemMeta meta = clone.getItemMeta();
|
ItemMeta meta = clone.getItemMeta();
|
||||||
if (meta == null) {
|
if (meta == null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user