diff --git a/README.md b/README.md index 3c1e12e..712e3f6 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,6 @@ A simple plugin to track cool stats for your tools and armor! ## Todo * Track trident throw kills. * Track armor damage. -* Track fish caught. -* Track sheep sheared. +* ~~Track fish caught.~~ +* ~~Track sheep sheared.~~ * Properly handle combing of tools. Stats should combine together. \ No newline at end of file diff --git a/src/main/java/lol/hyper/toolstats/ToolStats.java b/src/main/java/lol/hyper/toolstats/ToolStats.java index 8deaff7..a14d6fe 100644 --- a/src/main/java/lol/hyper/toolstats/ToolStats.java +++ b/src/main/java/lol/hyper/toolstats/ToolStats.java @@ -2,10 +2,7 @@ package lol.hyper.toolstats; import lol.hyper.githubreleaseapi.GitHubRelease; import lol.hyper.githubreleaseapi.GitHubReleaseAPI; -import lol.hyper.toolstats.events.BlocksMined; -import lol.hyper.toolstats.events.CraftItem; -import lol.hyper.toolstats.events.EntityDeath; -import lol.hyper.toolstats.events.MobKill; +import lol.hyper.toolstats.events.*; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; @@ -30,11 +27,15 @@ public final class ToolStats extends JavaPlugin { public final NamespacedKey fishingRodCaught = new NamespacedKey(this, "fish-caught"); // stores how many times sheep were sheared public final NamespacedKey shearsSheared = new NamespacedKey(this, "sheared"); + // stores how much damage armor has taken + public final NamespacedKey armorDamage = new NamespacedKey(this, "damage-taken"); public BlocksMined blocksMined; public CraftItem craftItem; public EntityDeath entityDeath; - public MobKill mobKill; + public EntityDamage mobKill; + public PlayerFish playerFish; + public SheepShear sheepShear; public Logger logger = this.getLogger(); @@ -43,12 +44,16 @@ public final class ToolStats extends JavaPlugin { blocksMined = new BlocksMined(this); craftItem = new CraftItem(this); entityDeath = new EntityDeath(this); - mobKill = new MobKill(this); + mobKill = new EntityDamage(this); + playerFish = new PlayerFish(this); + sheepShear = new SheepShear(this); Bukkit.getServer().getPluginManager().registerEvents(blocksMined, this); Bukkit.getServer().getPluginManager().registerEvents(craftItem, this); Bukkit.getServer().getPluginManager().registerEvents(entityDeath, this); Bukkit.getServer().getPluginManager().registerEvents(mobKill, this); + Bukkit.getServer().getPluginManager().registerEvents(playerFish, this); + Bukkit.getServer().getPluginManager().registerEvents(sheepShear, this); new Metrics(this, 14110); diff --git a/src/main/java/lol/hyper/toolstats/events/AnvilCombine.java b/src/main/java/lol/hyper/toolstats/events/AnvilCombine.java new file mode 100644 index 0000000..b2e90f4 --- /dev/null +++ b/src/main/java/lol/hyper/toolstats/events/AnvilCombine.java @@ -0,0 +1,31 @@ +package lol.hyper.toolstats.events; + +import lol.hyper.toolstats.ToolStats; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.PrepareAnvilEvent; +import org.bukkit.inventory.AnvilInventory; +import org.bukkit.inventory.ItemStack; + +public class AnvilCombine implements Listener { + + private final ToolStats toolStats; + + public AnvilCombine(ToolStats toolStats) { + this.toolStats = toolStats; + } + + @EventHandler + public void onCombine(PrepareAnvilEvent event) { + AnvilInventory inventory = event.getInventory(); + ItemStack firstSlot = inventory.getItem(0); + ItemStack secondSlot = inventory.getItem(1); + if (firstSlot == null || secondSlot == null) { + return; + } + + if (firstSlot.getType() == secondSlot.getType()) { + // combine the tool stats + } + } +} diff --git a/src/main/java/lol/hyper/toolstats/events/MobKill.java b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java similarity index 98% rename from src/main/java/lol/hyper/toolstats/events/MobKill.java rename to src/main/java/lol/hyper/toolstats/events/EntityDamage.java index c08db1a..a4cb9c1 100644 --- a/src/main/java/lol/hyper/toolstats/events/MobKill.java +++ b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java @@ -16,7 +16,7 @@ import org.bukkit.persistence.PersistentDataType; import java.util.*; -public class MobKill implements Listener { +public class EntityDamage implements Listener { private final ToolStats toolStats; private final String[] validTools = {"sword", "trident", "axe"}; @@ -24,7 +24,7 @@ public class MobKill implements Listener { private final String mobKillsLore = ChatColor.GRAY + "Mob kills: " + ChatColor.DARK_GRAY + "X"; public Set trackedMobs = new HashSet<>(); - public MobKill(ToolStats toolStats) { + public EntityDamage(ToolStats toolStats) { this.toolStats = toolStats; } diff --git a/src/main/java/lol/hyper/toolstats/events/PlayerFish.java b/src/main/java/lol/hyper/toolstats/events/PlayerFish.java new file mode 100644 index 0000000..1930f8e --- /dev/null +++ b/src/main/java/lol/hyper/toolstats/events/PlayerFish.java @@ -0,0 +1,86 @@ +package lol.hyper.toolstats.events; + +import lol.hyper.toolstats.ToolStats; +import lol.hyper.toolstats.UUIDDataType; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class PlayerFish implements Listener { + + private final ToolStats toolStats; + private final String fishCaughtLore = ChatColor.GRAY + "Fish caught: " + ChatColor.DARK_GRAY + "X"; + + public PlayerFish(ToolStats toolStats) { + this.toolStats = toolStats; + } + + @EventHandler + public void onFish(PlayerFishEvent event) { + // only listen to when a player catches a fish + if (event.getState() != PlayerFishEvent.State.CAUGHT_FISH) { + return; + } + + Player player = event.getPlayer(); + ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot()); + if (heldItem == null || heldItem.getType() == Material.AIR || heldItem.getType() != Material.FISHING_ROD) { + return; + } + addLore(heldItem); + } + + private void addLore(ItemStack itemStack) { + ItemMeta meta = itemStack.getItemMeta(); + if (meta == null) { + return; + } + Integer fishCaught = 0; + PersistentDataContainer container = meta.getPersistentDataContainer(); + if (container.has(toolStats.fishingRodCaught, PersistentDataType.INTEGER)) { + fishCaught = container.get(toolStats.fishingRodCaught, PersistentDataType.INTEGER); + } + if (fishCaught == null) { + return; + } else { + fishCaught++; + } + container.set(toolStats.fishingRodCaught, PersistentDataType.INTEGER, fishCaught); + List lore; + if (meta.hasLore()) { + lore = meta.getLore(); + assert lore != null; + boolean hasLore = false; + // we do a for loop like this, we can keep track of index + // this doesn't mess the lore up of existing items + for (int x = 0; x < lore.size(); x++) { + if (lore.get(x).contains("Fish caught")) { + hasLore = true; + lore.set(x, fishCaughtLore.replace("X", Integer.toString(fishCaught))); + break; + } + } + // if the item has lore but doesn't have the tag, add it + if (!hasLore) { + lore.add(fishCaughtLore.replace("X", Integer.toString(fishCaught))); + } + } else { + // if the item has no lore, create a new list and add the string + lore = new ArrayList<>(); + lore.add(fishCaughtLore.replace("X", Integer.toString(fishCaught))); + } + meta.setLore(lore); + itemStack.setItemMeta(meta); + } +} diff --git a/src/main/java/lol/hyper/toolstats/events/SheepShear.java b/src/main/java/lol/hyper/toolstats/events/SheepShear.java new file mode 100644 index 0000000..761e342 --- /dev/null +++ b/src/main/java/lol/hyper/toolstats/events/SheepShear.java @@ -0,0 +1,85 @@ +package lol.hyper.toolstats.events; + +import lol.hyper.toolstats.ToolStats; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Sheep; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; + +import java.util.ArrayList; +import java.util.List; + +public class SheepShear implements Listener { + + private final ToolStats toolStats; + private final String sheepShearLore = ChatColor.GRAY + "Sheep sheared: " + ChatColor.DARK_GRAY + "X"; + + public SheepShear(ToolStats toolStats) { + this.toolStats = toolStats; + } + + @EventHandler + public void onShear(PlayerInteractEntityEvent event) { + Player player = event.getPlayer(); + Entity entity = event.getRightClicked(); + if (!(entity instanceof Sheep)) { + return; + } + ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot()); + if (heldItem == null || heldItem.getType() == Material.AIR || heldItem.getType() != Material.SHEARS) { + return; + } + addLore(heldItem); + } + + private void addLore(ItemStack itemStack) { + ItemMeta meta = itemStack.getItemMeta(); + if (meta == null) { + return; + } + Integer sheepSheared = 0; + PersistentDataContainer container = meta.getPersistentDataContainer(); + if (container.has(toolStats.shearsSheared, PersistentDataType.INTEGER)) { + sheepSheared = container.get(toolStats.shearsSheared, PersistentDataType.INTEGER); + } + if (sheepSheared == null) { + return; + } else { + sheepSheared++; + } + container.set(toolStats.shearsSheared, PersistentDataType.INTEGER, sheepSheared); + List lore; + if (meta.hasLore()) { + lore = meta.getLore(); + assert lore != null; + boolean hasLore = false; + // we do a for loop like this, we can keep track of index + // this doesn't mess the lore up of existing items + for (int x = 0; x < lore.size(); x++) { + if (lore.get(x).contains("Sheep sheared")) { + hasLore = true; + lore.set(x, sheepShearLore.replace("X", Integer.toString(sheepSheared))); + break; + } + } + // if the item has lore but doesn't have the tag, add it + if (!hasLore) { + lore.add(sheepShearLore.replace("X", Integer.toString(sheepSheared))); + } + } else { + // if the item has no lore, create a new list and add the string + lore = new ArrayList<>(); + lore.add(sheepShearLore.replace("X", Integer.toString(sheepSheared))); + } + meta.setLore(lore); + itemStack.setItemMeta(meta); + } +}