diff --git a/src/main/java/lol/hyper/toolstats/ToolStats.java b/src/main/java/lol/hyper/toolstats/ToolStats.java index 3ad5c91..4070d34 100644 --- a/src/main/java/lol/hyper/toolstats/ToolStats.java +++ b/src/main/java/lol/hyper/toolstats/ToolStats.java @@ -105,6 +105,7 @@ public final class ToolStats extends JavaPlugin { public CommandToolStats commandToolStats; public ItemLore itemLore; public InventoryOpen inventoryOpen; + public PlayerJoin playerJoin; public NumberFormat numberFormat; public final Logger logger = this.getLogger(); @@ -139,6 +140,7 @@ public final class ToolStats extends JavaPlugin { commandToolStats = new CommandToolStats(this); itemLore = new ItemLore(this); inventoryOpen = new InventoryOpen(this); + playerJoin = new PlayerJoin(this); Bukkit.getServer().getPluginManager().registerEvents(blocksMined, this); Bukkit.getServer().getPluginManager().registerEvents(chunkPopulate, this); @@ -152,6 +154,7 @@ public final class ToolStats extends JavaPlugin { Bukkit.getServer().getPluginManager().registerEvents(sheepShear, this); Bukkit.getServer().getPluginManager().registerEvents(villagerTrade, this); Bukkit.getServer().getPluginManager().registerEvents(inventoryOpen, this); + Bukkit.getServer().getPluginManager().registerEvents(playerJoin, this); this.getCommand("toolstats").setExecutor(commandToolStats); @@ -310,25 +313,14 @@ public final class ToolStats extends JavaPlugin { } public void scheduleEntity(BukkitRunnable runnable, Entity entity, int delay) { - if (Bukkit.getServer().getVersion().contains("Folia")) { - morePaperLib.scheduling().entitySpecificScheduler(entity).runDelayed(runnable, null, delay); - } else { - runnable.runTaskLater(this, delay); - } + morePaperLib.scheduling().entitySpecificScheduler(entity).runDelayed(runnable, null, delay); } public void scheduleGlobal(BukkitRunnable runnable, int delay) { - if (Bukkit.getServer().getVersion().contains("Folia")) { - morePaperLib.scheduling().globalRegionalScheduler().runDelayed(runnable, delay); - } else { - runnable.runTaskLater(this, delay); - } + morePaperLib.scheduling().globalRegionalScheduler().runDelayed(runnable, delay); } + public void scheduleRegion(BukkitRunnable runnable, World world, Chunk chunk, int delay) { - if (Bukkit.getServer().getVersion().contains("Folia")) { - morePaperLib.scheduling().regionSpecificScheduler(world, chunk.getX(), chunk.getZ()).runDelayed(runnable, delay); - } else { - runnable.runTaskLater(this, delay); - } + morePaperLib.scheduling().regionSpecificScheduler(world, chunk.getX(), chunk.getZ()).runDelayed(runnable, delay); } } diff --git a/src/main/java/lol/hyper/toolstats/events/InventoryOpen.java b/src/main/java/lol/hyper/toolstats/events/InventoryOpen.java index 0a3a3a8..8992e3b 100644 --- a/src/main/java/lol/hyper/toolstats/events/InventoryOpen.java +++ b/src/main/java/lol/hyper/toolstats/events/InventoryOpen.java @@ -19,6 +19,7 @@ package lol.hyper.toolstats.events; import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.tools.ItemChecker; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -47,8 +48,6 @@ public class InventoryOpen implements Listener { return; } - Player player = (Player) event.getPlayer(); - Inventory inventory = event.getInventory(); for (ItemStack itemStack : inventory) { if (itemStack == null) { @@ -68,7 +67,7 @@ public class InventoryOpen implements Listener { continue; } - ItemMeta newMeta = getOrigin(itemMeta, itemStack.getType() == Material.ELYTRA); + ItemMeta newMeta = toolStats.itemLore.getOrigin(itemMeta, itemStack.getType() == Material.ELYTRA); if (newMeta == null) { continue; } @@ -78,66 +77,11 @@ public class InventoryOpen implements Listener { itemStack.setItemMeta(newMeta); } }; - toolStats.scheduleEntity(runnable, player, 1); - } - } - - /** - * Determine an item's origin based on lore. - * - * @param itemMeta The item's meta. - * @param elytra If they item is an elytra. - * @return The new item meta with the new origin tag. Returns null if origin cannot be determined. - */ - private ItemMeta getOrigin(ItemMeta itemMeta, boolean elytra) { - List lore; - if (!itemMeta.hasLore()) { - return null; - } - lore = itemMeta.getLore(); - Integer origin = null; - - for (String line : lore) { - // this is the worst code I have ever written - String createdBy = toolStats.getLoreFromConfig("created.created-by", false); - String createdOn = toolStats.getLoreFromConfig("created.created-on", false); - String caughtBy = toolStats.getLoreFromConfig("fished.caught-by", false); - String lootedBy = toolStats.getLoreFromConfig("looted.looted-by", false); - String foundBy = toolStats.getLoreFromConfig("looted.found-by", false); - String tradedBy = toolStats.getLoreFromConfig("traded.traded-by", false); - - if (createdBy != null && line.contains(createdBy)) { - origin = 0; - } - if (createdOn != null && line.contains(createdOn)) { - origin = 0; - } - if (caughtBy != null && line.contains(caughtBy)) { - origin = 5; - } - if (lootedBy != null && line.contains(lootedBy)) { - origin = 2; - } - // because the config changed, "found-by" was being used for ALL looted items - // this includes elytras, so we have to check for this mistake - if (foundBy != null && line.contains(foundBy)) { - if (elytra) { - origin = 4; - } else { - origin = 5; - } - } - if (tradedBy != null && line.contains(tradedBy)) { - origin = 3; + Location location = inventory.getLocation(); + // only run for actual inventories + if (location != null) { + toolStats.scheduleRegion(runnable, location.getWorld(), location.getChunk(), 1); } } - - if (origin == null) { - return null; - } - - PersistentDataContainer container = itemMeta.getPersistentDataContainer(); - container.set(toolStats.originType, PersistentDataType.INTEGER, origin); - return itemMeta; } } diff --git a/src/main/java/lol/hyper/toolstats/events/PlayerJoin.java b/src/main/java/lol/hyper/toolstats/events/PlayerJoin.java new file mode 100644 index 0000000..08d754d --- /dev/null +++ b/src/main/java/lol/hyper/toolstats/events/PlayerJoin.java @@ -0,0 +1,83 @@ +/* + * This file is part of ToolStats. + * + * ToolStats is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ToolStats is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ToolStats. If not, see . + */ + +package lol.hyper.toolstats.events; + +import lol.hyper.toolstats.ToolStats; +import lol.hyper.toolstats.tools.ItemChecker; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.scheduler.BukkitRunnable; + +public class PlayerJoin implements Listener { + + private final ToolStats toolStats; + + public PlayerJoin(ToolStats toolStats) { + this.toolStats = toolStats; + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + Inventory inventory = player.getInventory(); + for (ItemStack itemStack : inventory) { + if (itemStack == null) { + continue; + } + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta == null) { + continue; + } + PersistentDataContainer container = itemMeta.getPersistentDataContainer(); + // ignore any items that already have the origin tag + if (container.has(toolStats.originType, PersistentDataType.INTEGER)) { + continue; + } + // ignore items that are not the right type + if (!ItemChecker.isValidItem(itemStack.getType())) { + continue; + } + + ItemMeta newMeta = toolStats.itemLore.getOrigin(itemMeta, itemStack.getType() == Material.ELYTRA); + if (newMeta == null) { + continue; + } + BukkitRunnable runnable = new BukkitRunnable() { + @Override + public void run() { + itemStack.setItemMeta(newMeta); + } + }; + Location location = inventory.getLocation(); + // only run for actual inventories + if (location != null) { + toolStats.scheduleRegion(runnable, location.getWorld(), location.getChunk(), 1); + } + } + } +} diff --git a/src/main/java/lol/hyper/toolstats/tools/ItemLore.java b/src/main/java/lol/hyper/toolstats/tools/ItemLore.java index d851bd1..eba3c33 100644 --- a/src/main/java/lol/hyper/toolstats/tools/ItemLore.java +++ b/src/main/java/lol/hyper/toolstats/tools/ItemLore.java @@ -138,4 +138,63 @@ public class ItemLore { newLore.add(itemOwner.replace("{player}", playerName)); return newLore; } + + /** + * Determine an item's origin based on lore. + * + * @param itemMeta The item's meta. + * @param elytra If they item is an elytra. + * @return The new item meta with the new origin tag. Returns null if origin cannot be determined. + */ + public ItemMeta getOrigin(ItemMeta itemMeta, boolean elytra) { + List lore; + if (!itemMeta.hasLore()) { + return null; + } + lore = itemMeta.getLore(); + Integer origin = null; + + for (String line : lore) { + // this is the worst code I have ever written + String createdBy = toolStats.getLoreFromConfig("created.created-by", false); + String createdOn = toolStats.getLoreFromConfig("created.created-on", false); + String caughtBy = toolStats.getLoreFromConfig("fished.caught-by", false); + String lootedBy = toolStats.getLoreFromConfig("looted.looted-by", false); + String foundBy = toolStats.getLoreFromConfig("looted.found-by", false); + String tradedBy = toolStats.getLoreFromConfig("traded.traded-by", false); + + if (createdBy != null && line.contains(createdBy)) { + origin = 0; + } + if (createdOn != null && line.contains(createdOn)) { + origin = 0; + } + if (caughtBy != null && line.contains(caughtBy)) { + origin = 5; + } + if (lootedBy != null && line.contains(lootedBy)) { + origin = 2; + } + // because the config changed, "found-by" was being used for ALL looted items + // this includes elytras, so we have to check for this mistake + if (foundBy != null && line.contains(foundBy)) { + if (elytra) { + origin = 4; + } else { + origin = 5; + } + } + if (tradedBy != null && line.contains(tradedBy)) { + origin = 3; + } + } + + if (origin == null) { + return null; + } + + PersistentDataContainer container = itemMeta.getPersistentDataContainer(); + container.set(toolStats.originType, PersistentDataType.INTEGER, origin); + return itemMeta; + } }