From b596310bfe39f7472191650274d23073dcf1bb58 Mon Sep 17 00:00:00 2001 From: hyperdefined Date: Fri, 6 Sep 2024 17:47:07 -0400 Subject: [PATCH] redo lore replacement Instead of partially matching the old lore, build the old lore and match it instead. --- .../toolstats/commands/CommandToolStats.java | 60 ++++---- .../hyper/toolstats/events/BlocksMined.java | 26 +++- .../lol/hyper/toolstats/events/CraftItem.java | 17 +-- .../hyper/toolstats/events/EntityDamage.java | 65 +++++--- .../hyper/toolstats/events/EntityDeath.java | 3 +- .../hyper/toolstats/events/InventoryOpen.java | 9 -- .../hyper/toolstats/events/PlayerFish.java | 53 ++++--- .../hyper/toolstats/events/PlayerJoin.java | 9 -- .../hyper/toolstats/events/PlayerMove.java | 14 +- .../hyper/toolstats/events/SheepShear.java | 54 ++++--- .../lol/hyper/toolstats/events/ShootBow.java | 33 ++-- .../lol/hyper/toolstats/tools/ItemLore.java | 141 ++++++------------ .../toolstats/tools/config/ConfigTools.java | 94 ++++-------- .../tools/config/versions/Version7.java | 3 - 14 files changed, 269 insertions(+), 312 deletions(-) diff --git a/src/main/java/lol/hyper/toolstats/commands/CommandToolStats.java b/src/main/java/lol/hyper/toolstats/commands/CommandToolStats.java index e0eb957..3aafaa6 100644 --- a/src/main/java/lol/hyper/toolstats/commands/CommandToolStats.java +++ b/src/main/java/lol/hyper/toolstats/commands/CommandToolStats.java @@ -121,16 +121,6 @@ public class CommandToolStats implements TabExecutor { PersistentDataContainer container = finalMeta.getPersistentDataContainer(); List lore = new ArrayList<>(); - String caughtByLore = toolStats.configTools.getLoreFromConfig("fished.caught-by", false); - String lootedByLore = toolStats.configTools.getLoreFromConfig("looted.found-by", false); - String tradedByLore = toolStats.configTools.getLoreFromConfig("traded.traded-by", false); - String spawnedByLore = toolStats.configTools.getLoreFromConfig("spawned-in.spawned-by", false); - - // make sure the config messages are not null - if (caughtByLore == null || lootedByLore == null || tradedByLore == null || spawnedByLore == null) { - return; - } - // set how the item was obtained Integer origin = -1; if (container.has(toolStats.originType, PersistentDataType.INTEGER)) { @@ -155,13 +145,16 @@ public class CommandToolStats implements TabExecutor { if (flightTime != null) { if (toolStats.config.getBoolean("enabled.flight-time")) { - lore.add(toolStats.configTools.getLoreFromConfig("flight-time", true).replace("{time}", toolStats.numberFormat.formatDouble((double) flightTime / 1000))); + String line = toolStats.configTools.formatLore("flight-time", "{time}", toolStats.numberFormat.formatDouble((double) flightTime / 1000)); + lore.add(line); } } if (timeCreated != null) { - lore.add(toolStats.configTools.getLoreFromConfig("looted.found-by", true).replace("{player}", player.getName())); - lore.add(toolStats.configTools.getLoreFromConfig("looted.found-on", true).replace("{date}", toolStats.numberFormat.formatDate(new Date(timeCreated)))); + String timeCreatedLine = toolStats.configTools.formatLore("looted.found-by", "{player}", player.getName()); + String playerOwnerLine = toolStats.configTools.formatLore("looted.found-on", "{date}", toolStats.numberFormat.formatDate(new Date(timeCreated))); + lore.add(timeCreatedLine); + lore.add(playerOwnerLine); } finalMeta.setLore(lore); @@ -191,27 +184,27 @@ public class CommandToolStats implements TabExecutor { // show how the item was created based on the previous lore switch (origin) { case 0: { - lore.add(toolStats.configTools.getLoreFromConfig("created.created-by", true).replace("{player}", ownerName)); + lore.add(toolStats.configTools.formatLore("created.created-by", "{player}", ownerName)); break; } case 2: { - lore.add(toolStats.configTools.getLoreFromConfig("looted.looted-by", true).replace("{player}", ownerName)); + lore.add(toolStats.configTools.formatLore("looted.looted-by", "{player}", ownerName)); break; } case 3: { - lore.add(toolStats.configTools.getLoreFromConfig("traded.traded-by", true).replace("{player}", ownerName)); + lore.add(toolStats.configTools.formatLore("traded.traded-by", "{player}", ownerName)); break; } case 4: { - lore.add(toolStats.configTools.getLoreFromConfig("looted.found-by", true).replace("{player}", ownerName)); + lore.add(toolStats.configTools.formatLore("looted.found-by", "{player}", ownerName)); break; } case 5: { - lore.add(toolStats.configTools.getLoreFromConfig("fished.caught-by", true).replace("{player}", ownerName)); + lore.add(toolStats.configTools.formatLore("fished.caught-by", "{player}", ownerName)); break; } case 6: { - lore.add(toolStats.configTools.getLoreFromConfig("spawned-in.spawned-by", true).replace("{player}", ownerName)); + lore.add(toolStats.configTools.formatLore("spawned-in.spawned-by", "{player}", ownerName)); break; } } @@ -221,30 +214,31 @@ public class CommandToolStats implements TabExecutor { if (container.has(toolStats.timeCreated, PersistentDataType.LONG)) { Long time = container.get(toolStats.timeCreated, PersistentDataType.LONG); if (time != null) { + String date = toolStats.numberFormat.formatDate(new Date(time)); // show how when the item was created based on the previous lore switch (origin) { case 0: { - lore.add(toolStats.configTools.getLoreFromConfig("created.created-on", true).replace("{date}", toolStats.numberFormat.formatDate(new Date(time)))); + lore.add(toolStats.configTools.formatLore("created.created-on", "{date}", date)); break; } case 2: { - lore.add(toolStats.configTools.getLoreFromConfig("looted.looted-on", true).replace("{date}", toolStats.numberFormat.formatDate(new Date(time)))); + lore.add(toolStats.configTools.formatLore("looted.looted-on", "{date}", date)); break; } case 3: { - lore.add(toolStats.configTools.getLoreFromConfig("traded.traded-on", true).replace("{date}", toolStats.numberFormat.formatDate(new Date(time)))); + lore.add(toolStats.configTools.formatLore("traded.traded-on", "{date}", date)); break; } case 4: { - lore.add(toolStats.configTools.getLoreFromConfig("looted.found-on", true).replace("{date}", toolStats.numberFormat.formatDate(new Date(time)))); + lore.add(toolStats.configTools.formatLore("looted.found-on", "{date}", date)); break; } case 5: { - lore.add(toolStats.configTools.getLoreFromConfig("fished.caught-on", true).replace("{date}", toolStats.numberFormat.formatDate(new Date(time)))); + lore.add(toolStats.configTools.formatLore("fished.caught-on", "{date}", date)); break; } case 6: { - lore.add(toolStats.configTools.getLoreFromConfig("spawned-in.spawned-on", true).replace("{date}", toolStats.numberFormat.formatDate(new Date(time)))); + lore.add(toolStats.configTools.formatLore("spawned-in.spawned-on", "{date}", date)); break; } } @@ -255,7 +249,7 @@ public class CommandToolStats implements TabExecutor { if (container.has(toolStats.swordPlayerKills, PersistentDataType.INTEGER)) { Integer kills = container.get(toolStats.swordPlayerKills, PersistentDataType.INTEGER); if (kills != null) { - lore.add(toolStats.configTools.getLoreFromConfig("kills.player", true).replace("{kills}", toolStats.numberFormat.formatInt(kills))); + lore.add(toolStats.configTools.formatLore("kills.player", "{kills}", toolStats.numberFormat.formatInt(kills))); } } } @@ -263,7 +257,7 @@ public class CommandToolStats implements TabExecutor { if (container.has(toolStats.swordMobKills, PersistentDataType.INTEGER)) { Integer kills = container.get(toolStats.swordMobKills, PersistentDataType.INTEGER); if (kills != null) { - lore.add(toolStats.configTools.getLoreFromConfig("kills.mob", true).replace("{kills}", toolStats.numberFormat.formatInt(kills))); + lore.add(toolStats.configTools.formatLore("kills.mob", "{kills}", toolStats.numberFormat.formatInt(kills))); } } } @@ -272,14 +266,14 @@ public class CommandToolStats implements TabExecutor { if (container.has(toolStats.cropsHarvested, PersistentDataType.INTEGER)) { Integer crops = container.get(toolStats.cropsHarvested, PersistentDataType.INTEGER); if (crops != null) { - lore.add(toolStats.configTools.getLoreFromConfig("crops-harvested", true).replace("{crops}", toolStats.numberFormat.formatInt(crops))); + lore.add(toolStats.configTools.formatLore("crops-harvested", "{crops}", toolStats.numberFormat.formatInt(crops))); } } } if (container.has(toolStats.genericMined, PersistentDataType.INTEGER)) { Integer blocksMined = container.get(toolStats.genericMined, PersistentDataType.INTEGER); if (blocksMined != null) { - lore.add(toolStats.configTools.getLoreFromConfig("blocks-mined", true).replace("{blocks}", toolStats.numberFormat.formatInt(blocksMined))); + lore.add(toolStats.configTools.formatLore("blocks-mined", "{blocks}", toolStats.numberFormat.formatInt(blocksMined))); } } } @@ -287,7 +281,7 @@ public class CommandToolStats implements TabExecutor { if (container.has(toolStats.fishingRodCaught, PersistentDataType.INTEGER)) { Integer fish = container.get(toolStats.fishingRodCaught, PersistentDataType.INTEGER); if (fish != null) { - lore.add(toolStats.configTools.getLoreFromConfig("fished.fish-caught", true).replace("{fish}", toolStats.numberFormat.formatInt(fish))); + lore.add(toolStats.configTools.formatLore("fished.fish-caught", "{fish}", toolStats.numberFormat.formatInt(fish))); } } } @@ -295,7 +289,7 @@ public class CommandToolStats implements TabExecutor { if (container.has(toolStats.shearsSheared, PersistentDataType.INTEGER)) { Integer sheep = container.get(toolStats.shearsSheared, PersistentDataType.INTEGER); if (sheep != null) { - lore.add(toolStats.configTools.getLoreFromConfig("sheep-sheared", true).replace("{sheep}", toolStats.numberFormat.formatInt(sheep))); + lore.add(toolStats.configTools.formatLore("sheep-sheared", "{sheep}", toolStats.numberFormat.formatInt(sheep))); } } } @@ -303,7 +297,7 @@ public class CommandToolStats implements TabExecutor { if (container.has(toolStats.armorDamage, PersistentDataType.DOUBLE)) { Double damage = container.get(toolStats.armorDamage, PersistentDataType.DOUBLE); if (damage != null) { - lore.add(toolStats.configTools.getLoreFromConfig("damage-taken", true).replace("{damage}", toolStats.numberFormat.formatDouble(damage))); + toolStats.configTools.formatLore("damage-taken", "{damage}", toolStats.numberFormat.formatDouble(damage)); } } } @@ -311,7 +305,7 @@ public class CommandToolStats implements TabExecutor { if (container.has(toolStats.arrowsShot, PersistentDataType.INTEGER)) { Integer arrows = container.get(toolStats.arrowsShot, PersistentDataType.INTEGER); if (arrows != null) { - lore.add(toolStats.configTools.getLoreFromConfig("arrows-shot", true).replace("{arrows}", toolStats.numberFormat.formatInt(arrows))); + toolStats.configTools.formatLore("arrows-shot", "{arrows}", toolStats.numberFormat.formatInt(arrows)); } } } diff --git a/src/main/java/lol/hyper/toolstats/events/BlocksMined.java b/src/main/java/lol/hyper/toolstats/events/BlocksMined.java index ced0124..d44e817 100644 --- a/src/main/java/lol/hyper/toolstats/events/BlocksMined.java +++ b/src/main/java/lol/hyper/toolstats/events/BlocksMined.java @@ -104,13 +104,18 @@ public class BlocksMined implements Listener { toolStats.logger.warning(playerTool + " does not have valid generic-mined set! Resting to zero. This should NEVER happen."); } - blocksMined++; - container.set(toolStats.genericMined, PersistentDataType.INTEGER, blocksMined); + container.set(toolStats.genericMined, PersistentDataType.INTEGER, blocksMined + 1); // do we add the lore based on the config? if (toolStats.configTools.checkConfig(playerTool.getType(), "blocks-mined")) { - String blocksMinedFormatted = toolStats.numberFormat.formatInt(blocksMined); - List newLore = toolStats.itemLore.addItemLore(meta, "{blocks}", blocksMinedFormatted, "blocks-mined"); + String oldBlocksMinedFormatted = toolStats.numberFormat.formatInt(blocksMined); + String newBlocksMinedFormatted = toolStats.numberFormat.formatInt(blocksMined + 1); + String oldLine = toolStats.configTools.formatLore("blocks-mined", "{blocks}", oldBlocksMinedFormatted); + String newLine = toolStats.configTools.formatLore("blocks-mined", "{blocks}", newBlocksMinedFormatted); + if (oldLine == null || newLine == null) { + return; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } playerTool.setItemMeta(meta); @@ -140,13 +145,18 @@ public class BlocksMined implements Listener { toolStats.logger.warning(playerTool + " does not have valid crops-mined set! Resting to zero. This should NEVER happen."); } - cropsMined++; - container.set(toolStats.cropsHarvested, PersistentDataType.INTEGER, cropsMined); + container.set(toolStats.cropsHarvested, PersistentDataType.INTEGER, cropsMined + 1); // do we add the lore based on the config? if (toolStats.configTools.checkConfig(playerTool.getType(), "blocks-mined")) { - String cropsMinedFormatted = toolStats.numberFormat.formatInt(cropsMined); - List newLore = toolStats.itemLore.addItemLore(meta, "{crops}", cropsMinedFormatted, "crops-harvested"); + String oldCropsMinedFormatted = toolStats.numberFormat.formatInt(cropsMined); + String newCropsMinedFormatted = toolStats.numberFormat.formatInt(cropsMined + 1); + String oldLine = toolStats.configTools.formatLore("crops-harvested", "{crops}", oldCropsMinedFormatted); + String newLine = toolStats.configTools.formatLore("crops-harvested", "{crops}", newCropsMinedFormatted); + if (oldLine == null || newLine == null) { + return; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } playerTool.setItemMeta(meta); diff --git a/src/main/java/lol/hyper/toolstats/events/CraftItem.java b/src/main/java/lol/hyper/toolstats/events/CraftItem.java index a26a790..f165d06 100644 --- a/src/main/java/lol/hyper/toolstats/events/CraftItem.java +++ b/src/main/java/lol/hyper/toolstats/events/CraftItem.java @@ -64,7 +64,7 @@ public class CraftItem implements Listener { if (event.isShiftClick()) { String configMessage = toolStats.config.getString("messages.shift-click-warning.crafting"); if (configMessage != null) { - if (configMessage.length() != 0) { + if (!configMessage.isEmpty()) { event.getWhoClicked().sendMessage(ChatColor.translateAlternateColorCodes('&', configMessage)); } } @@ -122,21 +122,20 @@ public class CraftItem implements Listener { } // do we add the lore based on the config? if (toolStats.configTools.checkConfig(itemStack.getType(), "created-date")) { - String createdOnRaw = toolStats.configTools.getLoreFromConfig("created.created-on", true); - if (createdOnRaw == null) { - toolStats.logger.warning("There is no lore message for messages.created.created-on!"); + String date = toolStats.numberFormat.formatDate(finalDate); + String newLine = toolStats.configTools.formatLore("created.created-on", "{date}", date); + if (newLine == null) { return null; } - lore.add(createdOnRaw.replace("{date}", toolStats.numberFormat.formatDate(finalDate))); + lore.add(newLine); meta.setLore(lore); } if (toolStats.configTools.checkConfig(itemStack.getType(), "created-by")) { - String createdByRaw = toolStats.configTools.getLoreFromConfig("created.created-by", true); - if (createdByRaw == null) { - toolStats.logger.warning("There is no lore message for messages.created.created-by!"); + String newLine = toolStats.configTools.formatLore("created.created-by", "{player}", owner.getName()); + if (newLine == null) { return null; } - lore.add(createdByRaw.replace("{player}", owner.getName())); + lore.add(newLine); meta.setLore(lore); } newItem.setItemMeta(meta); diff --git a/src/main/java/lol/hyper/toolstats/events/EntityDamage.java b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java index eda4a1d..8f37b2c 100644 --- a/src/main/java/lol/hyper/toolstats/events/EntityDamage.java +++ b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java @@ -241,13 +241,18 @@ public class EntityDamage implements Listener { toolStats.logger.warning(itemStack + " does not have valid player-kills set! Resting to zero. This should NEVER happen."); } - playerKills++; - container.set(toolStats.swordPlayerKills, PersistentDataType.INTEGER, playerKills); + container.set(toolStats.swordPlayerKills, PersistentDataType.INTEGER, playerKills + 1); // do we add the lore based on the config? if (toolStats.configTools.checkConfig(itemStack.getType(), "player-kills")) { - String playerKillsFormatted = toolStats.numberFormat.formatInt(playerKills); - List newLore = toolStats.itemLore.addItemLore(meta, "{kills}", playerKillsFormatted, "kills.player"); + String oldPlayerKillsFormatted = toolStats.numberFormat.formatInt(playerKills); + String newPlayerKillsFormatted = toolStats.numberFormat.formatInt(playerKills + 1); + String oldLine = toolStats.configTools.formatLore("kills.player", "{kills}", oldPlayerKillsFormatted); + String newLine = toolStats.configTools.formatLore("kills.player", "{kills}", newPlayerKillsFormatted); + if (oldLine == null || newLine == null) { + return; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } itemStack.setItemMeta(meta); @@ -275,13 +280,18 @@ public class EntityDamage implements Listener { toolStats.logger.warning(itemStack + " does not have valid mob-kills set! Resting to zero. This should NEVER happen."); } - mobKills++; - container.set(toolStats.swordMobKills, PersistentDataType.INTEGER, mobKills); + container.set(toolStats.swordMobKills, PersistentDataType.INTEGER, mobKills + 1); // do we add the lore based on the config? if (toolStats.configTools.checkConfig(itemStack.getType(), "mob-kills")) { - String mobKillsFormatted = toolStats.numberFormat.formatInt(mobKills); - List newLore = toolStats.itemLore.addItemLore(meta, "{kills}", mobKillsFormatted, "kills.mob"); + String oldMobKillsFormatted = toolStats.numberFormat.formatInt(mobKills); + String newMobKillsFormatted = toolStats.numberFormat.formatInt(mobKills + 1); + String oldLine = toolStats.configTools.formatLore("kills.mob", "{kills}", oldMobKillsFormatted); + String newLine = toolStats.configTools.formatLore("kills.mob", "{kills}", newMobKillsFormatted); + if (oldLine == null || newLine == null) { + return; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } itemStack.setItemMeta(meta); @@ -315,12 +325,17 @@ public class EntityDamage implements Listener { } damageTaken = damageTaken + damage; - container.set(toolStats.armorDamage, PersistentDataType.DOUBLE, damageTaken); - container.set(toolStats.armorDamageInt, PersistentDataType.INTEGER, damageTaken.intValue()); + container.set(toolStats.armorDamage, PersistentDataType.DOUBLE, damageTaken + damage); if (toolStats.config.getBoolean("enabled.armor-damage")) { - String damageTakenFormatted = toolStats.numberFormat.formatDouble(damageTaken); - List newLore = toolStats.itemLore.addItemLore(meta, "{damage}", damageTakenFormatted, "damage-taken"); + String oldDamageFormatted = toolStats.numberFormat.formatDouble(damageTaken); + String newDamageFormatted = toolStats.numberFormat.formatDouble(damageTaken + damage); + String oldLine = toolStats.configTools.formatLore("damage-taken", "{damage}", oldDamageFormatted); + String newLine = toolStats.configTools.formatLore("damage-taken", "{damage}", newDamageFormatted); + if (oldLine == null || newLine == null) { + return; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } itemStack.setItemMeta(meta); @@ -349,13 +364,18 @@ public class EntityDamage implements Listener { toolStats.logger.warning(newTrident + " does not have valid mob-kills set! Resting to zero. This should NEVER happen."); } - mobKills++; - container.set(toolStats.swordMobKills, PersistentDataType.INTEGER, mobKills); + container.set(toolStats.swordMobKills, PersistentDataType.INTEGER, mobKills + 1); // do we add the lore based on the config? if (toolStats.configTools.checkConfig(newTrident.getType(), "mob-kills")) { - String mobKillsFormatted = toolStats.numberFormat.formatInt(mobKills); - List newLore = toolStats.itemLore.addItemLore(meta, "{kills}", mobKillsFormatted, "kills.mob"); + String oldMobKillsFormatted = toolStats.numberFormat.formatDouble(mobKills); + String newMobKillsFormatted = toolStats.numberFormat.formatDouble(mobKills + 1); + String oldLine = toolStats.configTools.formatLore("kills.mob", "{kills}", oldMobKillsFormatted); + String newLine = toolStats.configTools.formatLore("kills.mob", "{kills}", newMobKillsFormatted); + if (oldLine == null || newLine == null) { + return null; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } newTrident.setItemMeta(meta); @@ -385,13 +405,18 @@ public class EntityDamage implements Listener { toolStats.logger.warning(newTrident + " does not have valid player-kills set! Resting to zero. This should NEVER happen."); } - playerKills++; - container.set(toolStats.swordPlayerKills, PersistentDataType.INTEGER, playerKills); + container.set(toolStats.swordPlayerKills, PersistentDataType.INTEGER, playerKills + 1); // do we add the lore based on the config? if (toolStats.configTools.checkConfig(newTrident.getType(), "player-kills")) { - String playerKillsFormatted = toolStats.numberFormat.formatInt(playerKills); - List newLore = toolStats.itemLore.addItemLore(meta, "{kills}", playerKillsFormatted, "kills.player"); + String oldPlayerKillsFormatted = toolStats.numberFormat.formatDouble(playerKills); + String newPlayerKillsFormatted = toolStats.numberFormat.formatDouble(playerKills + 1); + String oldLine = toolStats.configTools.formatLore("kills.player", "{kills}", oldPlayerKillsFormatted); + String newLine = toolStats.configTools.formatLore("kills.player", "{kills}", newPlayerKillsFormatted); + if (oldLine == null || newLine == null) { + return null; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } newTrident.setItemMeta(meta); diff --git a/src/main/java/lol/hyper/toolstats/events/EntityDeath.java b/src/main/java/lol/hyper/toolstats/events/EntityDeath.java index 9492d26..fdd6677 100644 --- a/src/main/java/lol/hyper/toolstats/events/EntityDeath.java +++ b/src/main/java/lol/hyper/toolstats/events/EntityDeath.java @@ -86,7 +86,8 @@ public class EntityDeath implements Listener { container.set(toolStats.originType, PersistentDataType.INTEGER, 1); if (toolStats.config.getBoolean("enabled.dropped-by")) { - List newLore = toolStats.itemLore.addItemLore(meta, "{name}", mob, "dropped-by"); + String newLine = toolStats.configTools.formatLore("dropped-by", "{name}", mob); + List newLore = toolStats.itemLore.addItemLore(meta, newLine); meta.setLore(newLore); } newItem.setItemMeta(meta); diff --git a/src/main/java/lol/hyper/toolstats/events/InventoryOpen.java b/src/main/java/lol/hyper/toolstats/events/InventoryOpen.java index 865a95e..72a0402 100644 --- a/src/main/java/lol/hyper/toolstats/events/InventoryOpen.java +++ b/src/main/java/lol/hyper/toolstats/events/InventoryOpen.java @@ -20,7 +20,6 @@ package lol.hyper.toolstats.events; import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.tools.UUIDDataType; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryOpenEvent; @@ -83,14 +82,6 @@ public class InventoryOpen implements Listener { container.set(toolStats.hash, PersistentDataType.STRING, hash); } } - - // add origin tag - if (!container.has(toolStats.originType, PersistentDataType.INTEGER)) { - itemMeta = toolStats.itemLore.getOrigin(itemMeta, itemStack.getType() == Material.ELYTRA); - if (itemMeta == null) { - continue; - } - } ItemMeta clone = itemMeta.clone(); BukkitRunnable runnable = new BukkitRunnable() { @Override diff --git a/src/main/java/lol/hyper/toolstats/events/PlayerFish.java b/src/main/java/lol/hyper/toolstats/events/PlayerFish.java index 64d0e2a..f7b053c 100644 --- a/src/main/java/lol/hyper/toolstats/events/PlayerFish.java +++ b/src/main/java/lol/hyper/toolstats/events/PlayerFish.java @@ -32,6 +32,7 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.Nullable; import java.util.Date; import java.util.List; @@ -58,25 +59,8 @@ public class PlayerFish implements Listener { if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) { return; } - // make sure the player is holding a fishing rod - // player can fish with their offhand - PlayerInventory inventory = player.getInventory(); - boolean isMainHand = inventory.getItemInMainHand().getType() == Material.FISHING_ROD; - boolean isOffHand = inventory.getItemInOffHand().getType() == Material.FISHING_ROD; - ItemStack fishingRod = null; - if (isMainHand) { - fishingRod = inventory.getItemInMainHand(); - } - if (isOffHand) { - fishingRod = inventory.getItemInOffHand(); - } - - // if the player is hold fishing rods in both hands - // default to main hand since that takes priority - if (isMainHand && isOffHand) { - fishingRod = inventory.getItemInMainHand(); - } + ItemStack fishingRod = getItemStack(player); // player swapped items? if (fishingRod == null) { return; @@ -99,6 +83,26 @@ public class PlayerFish implements Listener { } } + private static @Nullable ItemStack getItemStack(Player player) { + PlayerInventory inventory = player.getInventory(); + boolean isMainHand = inventory.getItemInMainHand().getType() == Material.FISHING_ROD; + boolean isOffHand = inventory.getItemInOffHand().getType() == Material.FISHING_ROD; + ItemStack fishingRod = null; + if (isMainHand) { + fishingRod = inventory.getItemInMainHand(); + } + if (isOffHand) { + fishingRod = inventory.getItemInOffHand(); + } + + // if the player is hold fishing rods in both hands + // default to main hand since that takes priority + if (isMainHand && isOffHand) { + fishingRod = inventory.getItemInMainHand(); + } + return fishingRod; + } + /** * Update a fishing rod's fish count. * @@ -121,12 +125,17 @@ public class PlayerFish implements Listener { toolStats.logger.warning(fishingRod + " does not have valid fish-caught set! Resting to zero. This should NEVER happen."); } - fishCaught++; - container.set(toolStats.fishingRodCaught, PersistentDataType.INTEGER, fishCaught); + container.set(toolStats.fishingRodCaught, PersistentDataType.INTEGER, fishCaught + 1); if (toolStats.config.getBoolean("enabled.fish-caught")) { - String fishCaughtFormatted = toolStats.numberFormat.formatInt(fishCaught); - List newLore = toolStats.itemLore.addItemLore(meta, "{fish}", fishCaughtFormatted, "fished.fish-caught"); + String oldFishFormatted = toolStats.numberFormat.formatInt(fishCaught); + String newFishFormatted = toolStats.numberFormat.formatInt(fishCaught + 1); + String oldLine = toolStats.configTools.formatLore("fished.fish-caught", "{fish}", oldFishFormatted); + String newLine = toolStats.configTools.formatLore("fished.fish-caught", "{fish}", newFishFormatted); + if (oldLine == null || newLine == null) { + return; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } fishingRod.setItemMeta(meta); diff --git a/src/main/java/lol/hyper/toolstats/events/PlayerJoin.java b/src/main/java/lol/hyper/toolstats/events/PlayerJoin.java index 4e821f0..a2020d5 100644 --- a/src/main/java/lol/hyper/toolstats/events/PlayerJoin.java +++ b/src/main/java/lol/hyper/toolstats/events/PlayerJoin.java @@ -19,7 +19,6 @@ package lol.hyper.toolstats.events; import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.tools.UUIDDataType; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -77,14 +76,6 @@ public class PlayerJoin implements Listener { String hash = toolStats.hashMaker.makeHash(itemStack.getType(), owner, timestamp); container.set(toolStats.hash, PersistentDataType.STRING, hash); } - - // add origin tag - if (!container.has(toolStats.originType, PersistentDataType.INTEGER)) { - itemMeta = toolStats.itemLore.getOrigin(itemMeta, itemStack.getType() == Material.ELYTRA); - if (itemMeta == null) { - continue; - } - } ItemMeta clone = itemMeta.clone(); BukkitRunnable runnable = new BukkitRunnable() { @Override diff --git a/src/main/java/lol/hyper/toolstats/events/PlayerMove.java b/src/main/java/lol/hyper/toolstats/events/PlayerMove.java index ddd1503..9e07168 100644 --- a/src/main/java/lol/hyper/toolstats/events/PlayerMove.java +++ b/src/main/java/lol/hyper/toolstats/events/PlayerMove.java @@ -86,13 +86,19 @@ public class PlayerMove implements Listener { } // get the duration of the flight - flightTime = (System.currentTimeMillis() - startTime) + flightTime; - container.set(toolStats.flightTime, PersistentDataType.LONG, flightTime); + long duration = (System.currentTimeMillis() - startTime) + flightTime; + container.set(toolStats.flightTime, PersistentDataType.LONG, flightTime + duration); // do we add the lore based on the config? if (toolStats.config.getBoolean("enabled.flight-time")) { - String flightTimeFormatted = toolStats.numberFormat.formatDouble((double) flightTime / 1000); - List newLore = toolStats.itemLore.addItemLore(meta, "{time}", flightTimeFormatted, "flight-time"); + String oldFlightFormatted = toolStats.numberFormat.formatDouble((double) flightTime / 1000); + String newFlightFormatted = toolStats.numberFormat.formatDouble((double) (flightTime + duration) / 1000); + String oldLine = toolStats.configTools.formatLore("flight-time", "{time}", oldFlightFormatted); + String newLine = toolStats.configTools.formatLore("flight-time", "{time}", newFlightFormatted); + if (oldLine == null || newLine == null) { + return; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } chest.setItemMeta(meta); diff --git a/src/main/java/lol/hyper/toolstats/events/SheepShear.java b/src/main/java/lol/hyper/toolstats/events/SheepShear.java index 39441d1..0d57a71 100644 --- a/src/main/java/lol/hyper/toolstats/events/SheepShear.java +++ b/src/main/java/lol/hyper/toolstats/events/SheepShear.java @@ -32,6 +32,7 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -57,25 +58,7 @@ public class SheepShear implements Listener { return; } - // make sure the player is holding shears - // player can shear with their offhand - PlayerInventory inventory = player.getInventory(); - boolean isMainHand = inventory.getItemInMainHand().getType() == Material.SHEARS; - boolean isOffHand = inventory.getItemInOffHand().getType() == Material.SHEARS; - ItemStack shears = null; - if (isMainHand) { - shears = inventory.getItemInMainHand(); - } - if (isOffHand) { - shears = inventory.getItemInOffHand(); - } - - // if the player is hold fishing rods in both hands - // default to main hand since that takes priority - if (isMainHand && isOffHand) { - shears = inventory.getItemInMainHand(); - } - + ItemStack shears = getShears(player); // player swapped items? if (shears == null) { return; @@ -92,6 +75,26 @@ public class SheepShear implements Listener { addLore(finalShears); } + private static @Nullable ItemStack getShears(Player player) { + PlayerInventory inventory = player.getInventory(); + boolean isMainHand = inventory.getItemInMainHand().getType() == Material.SHEARS; + boolean isOffHand = inventory.getItemInOffHand().getType() == Material.SHEARS; + ItemStack shears = null; + if (isMainHand) { + shears = inventory.getItemInMainHand(); + } + if (isOffHand) { + shears = inventory.getItemInOffHand(); + } + + // if the player is hold shears in both hands + // default to main hand since that takes priority + if (isMainHand && isOffHand) { + shears = inventory.getItemInMainHand(); + } + return shears; + } + /** * Adds tags to shears. * @@ -114,12 +117,17 @@ public class SheepShear implements Listener { toolStats.logger.warning(newShears + " does not have valid sheared set! Resting to zero. This should NEVER happen."); } - sheepSheared++; - container.set(toolStats.shearsSheared, PersistentDataType.INTEGER, sheepSheared); + container.set(toolStats.shearsSheared, PersistentDataType.INTEGER, sheepSheared + 1); if (toolStats.config.getBoolean("enabled.sheep-sheared")) { - String sheepShearedFormatted = toolStats.numberFormat.formatInt(sheepSheared); - List newLore = toolStats.itemLore.addItemLore(meta, "{sheep}", sheepShearedFormatted, "sheep-sheared"); + String oldSheepFormatted = toolStats.numberFormat.formatInt(sheepSheared); + String newSheepFormatted = toolStats.numberFormat.formatInt(sheepSheared + 1); + String oldLine = toolStats.configTools.formatLore("sheep-sheared", "{sheep}", oldSheepFormatted); + String newLine = toolStats.configTools.formatLore("sheep-sheared", "{sheep}", newSheepFormatted); + if (oldLine == null || newLine == null) { + return; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } newShears.setItemMeta(meta); diff --git a/src/main/java/lol/hyper/toolstats/events/ShootBow.java b/src/main/java/lol/hyper/toolstats/events/ShootBow.java index 8cb4282..23ec2c5 100644 --- a/src/main/java/lol/hyper/toolstats/events/ShootBow.java +++ b/src/main/java/lol/hyper/toolstats/events/ShootBow.java @@ -31,6 +31,7 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -56,6 +57,17 @@ public class ShootBow implements Listener { } PlayerInventory inventory = player.getInventory(); + ItemStack heldBow = getBow(inventory); + + // player swapped + if (heldBow == null) { + return; + } + + updateArrowsShot(heldBow); + } + + private static @Nullable ItemStack getBow(PlayerInventory inventory) { boolean isMainHand = inventory.getItemInMainHand().getType() == Material.BOW || inventory.getItemInMainHand().getType() == Material.CROSSBOW; boolean isOffHand = inventory.getItemInOffHand().getType() == Material.BOW || inventory.getItemInMainHand().getType() == Material.CROSSBOW; ItemStack heldBow = null; @@ -71,13 +83,7 @@ public class ShootBow implements Listener { if (isMainHand && isOffHand) { heldBow = inventory.getItemInMainHand(); } - - // player swapped - if (heldBow == null) { - return; - } - - updateArrowsShot(heldBow); + return heldBow; } private void updateArrowsShot(ItemStack bow) { @@ -99,13 +105,18 @@ public class ShootBow implements Listener { toolStats.logger.warning(arrowsShot + " does not have valid arrows-shot set! Resting to zero. This should NEVER happen."); } - arrowsShot++; - container.set(toolStats.arrowsShot, PersistentDataType.INTEGER, arrowsShot); + container.set(toolStats.arrowsShot, PersistentDataType.INTEGER, arrowsShot + 1); // do we add the lore based on the config? if (toolStats.config.getBoolean("enabled.arrows-shot")) { - String arrowsShotFormatted = toolStats.numberFormat.formatInt(arrowsShot); - List newLore = toolStats.itemLore.addItemLore(meta, "{arrows}", arrowsShotFormatted, "arrows-shot"); + String oldArrowsFormatted = toolStats.numberFormat.formatInt(arrowsShot); + String newArrowsFormatted = toolStats.numberFormat.formatInt(arrowsShot + 1); + String oldLine = toolStats.configTools.formatLore("arrows-shot", "{arrows}", oldArrowsFormatted); + String newLine = toolStats.configTools.formatLore("arrows-shot", "{arrows}", newArrowsFormatted); + if (oldLine == null || newLine == null) { + return; + } + List newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine); meta.setLore(newLore); } bow.setItemMeta(meta); diff --git a/src/main/java/lol/hyper/toolstats/tools/ItemLore.java b/src/main/java/lol/hyper/toolstats/tools/ItemLore.java index 4692dff..b1d92c6 100644 --- a/src/main/java/lol/hyper/toolstats/tools/ItemLore.java +++ b/src/main/java/lol/hyper/toolstats/tools/ItemLore.java @@ -18,66 +18,68 @@ package lol.hyper.toolstats.tools; import lol.hyper.toolstats.ToolStats; -import org.bukkit.ChatColor; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; import java.util.ArrayList; import java.util.List; +import java.util.regex.Pattern; public class ItemLore { private final ToolStats toolStats; + public static final Pattern COLOR_CODES = Pattern.compile("[&§]([0-9a-fk-or])"); + public static final Pattern HEX_PATTERN = Pattern.compile("[&§]#([A-Fa-f0-9]{6})"); public ItemLore(ToolStats toolStats) { this.toolStats = toolStats; } /** - * Adds/updates lore for an item. + * Updates existing lore on an item. * - * @param placeholder The placeholder from the config. ex: {kills} - * @param placeholderValue The value to replace the placeholder. - * @param configLorePath The path to the config message. + * @param itemMeta The item's meta. + * @param oldLine The old line to replace. + * @param newLine The new line to replace oldLine. * @return The item's new lore. */ - public List addItemLore(ItemMeta itemMeta, String placeholder, String placeholderValue, String configLorePath) { - String configLore = toolStats.configTools.getLoreFromConfig(configLorePath, false); - String configLoreRaw = toolStats.configTools.getLoreFromConfig(configLorePath, true); - - if (configLore == null || configLoreRaw == null) { - toolStats.logger.warning("There is no lore message for messages." + configLorePath + "!"); - toolStats.logger.warning("Unable to update lore for item."); - return itemMeta.getLore(); - } - - List newLore; - // replace the placeholder with the value - // ex: {kills} -> a number - String newLine = configLoreRaw.replace(placeholder, placeholderValue); - + public List updateItemLore(ItemMeta itemMeta, String oldLine, String newLine) { + List itemLore; + oldLine = toolStats.configTools.removeColor(oldLine); if (itemMeta.hasLore()) { - newLore = itemMeta.getLore(); + itemLore = itemMeta.getLore(); // keep track of line index // this doesn't mess the lore of existing items - for (int x = 0; x < newLore.size(); x++) { + for (int x = 0; x < itemLore.size(); x++) { // check to see if the line matches the config value // this means we update this line only! - String line = ChatColor.stripColor(newLore.get(x)); - if (line.contains(configLore)) { - newLore.set(x, newLine); - return newLore; + String line = toolStats.configTools.removeColor(itemLore.get(x)); + if (line.equals(oldLine)) { + itemLore.set(x, newLine); + return itemLore; } } // if the item has lore, but we didn't find the line - newLore.add(newLine); + itemLore.add(newLine); } else { // if the item has no lore, create a new list and add the line - newLore = new ArrayList<>(); - newLore.add(newLine); + itemLore = new ArrayList<>(); + itemLore.add(newLine); } - return newLore; + return itemLore; + } + + public List addItemLore(ItemMeta itemMeta, String newLine) { + List itemLore; + if (itemMeta.hasLore()) { + itemLore = itemMeta.getLore(); + itemLore.add(newLine); + } else { + itemLore = new ArrayList<>(); + itemLore.add(newLine); + } + return itemLore; } /** @@ -107,8 +109,8 @@ public class ItemLore { // set the lore based on the origin switch (origin) { case 2: { - dateCreatedLore = toolStats.configTools.getLoreFromConfig("looted.looted-on", true); - itemOwnerLore = toolStats.configTools.getLoreFromConfig("looted.looted-by", true); + dateCreatedLore = toolStats.configTools.formatLore("looted.looted-on", "{date}", formattedDate); + itemOwnerLore = toolStats.configTools.formatLore("looted.looted-by", "{player}", playerName); if (dateCreatedLore == null) { toolStats.logger.warning("messages.looted.looted-on is not set in your config!"); @@ -123,8 +125,8 @@ public class ItemLore { break; } case 3: { - dateCreatedLore = toolStats.configTools.getLoreFromConfig("traded.traded-on", true); - itemOwnerLore = toolStats.configTools.getLoreFromConfig("traded.traded-by", true); + dateCreatedLore = toolStats.configTools.formatLore("traded.traded-on", "{date}", formattedDate); + itemOwnerLore = toolStats.configTools.formatLore("traded.traded-by", "{player}", playerName); if (dateCreatedLore == null) { toolStats.logger.warning("messages.traded.traded-on is not set in your config!"); @@ -139,8 +141,8 @@ public class ItemLore { break; } case 4: { - dateCreatedLore = toolStats.configTools.getLoreFromConfig("looted.found-on", true); - itemOwnerLore = toolStats.configTools.getLoreFromConfig("looted.found-by", true); + dateCreatedLore = toolStats.configTools.formatLore("looted.found-on", "{date}", formattedDate); + itemOwnerLore = toolStats.configTools.formatLore("looted.found-by", "{player}", playerName); if (dateCreatedLore == null) { toolStats.logger.warning("messages.looted.found-on is not set in your config!"); @@ -155,8 +157,8 @@ public class ItemLore { break; } case 5: { - dateCreatedLore = toolStats.configTools.getLoreFromConfig("fished.caught-on", true); - itemOwnerLore = toolStats.configTools.getLoreFromConfig("fished.caught-by", true); + dateCreatedLore = toolStats.configTools.formatLore("fished.caught-on", "{date}", formattedDate); + itemOwnerLore = toolStats.configTools.formatLore("fished.caught-by", "{player}", playerName); if (dateCreatedLore == null) { toolStats.logger.warning("messages.fished.caught-on is not set in your config!"); @@ -171,8 +173,8 @@ public class ItemLore { break; } case 6: { - dateCreatedLore = toolStats.configTools.getLoreFromConfig("spawned-in.spawned-on", true); - itemOwnerLore = toolStats.configTools.getLoreFromConfig("spawned-in.spawned-by", true); + dateCreatedLore = toolStats.configTools.formatLore("spawned-in.spawned-on", "{date}", formattedDate); + itemOwnerLore = toolStats.configTools.formatLore("spawned-in.spawned-by", "{player}", playerName); if (dateCreatedLore == null) { toolStats.logger.warning("messages.spawned-in.spawned-on is not set in your config!"); @@ -204,63 +206,4 @@ public class ItemLore { newLore.add(itemOwnerLore.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; - - String createdBy = toolStats.configTools.getLoreFromConfig("created.created-by", false); - String createdOn = toolStats.configTools.getLoreFromConfig("created.created-on", false); - String caughtBy = toolStats.configTools.getLoreFromConfig("fished.caught-by", false); - String lootedBy = toolStats.configTools.getLoreFromConfig("looted.looted-by", false); - String foundBy = toolStats.configTools.getLoreFromConfig("looted.found-by", false); - String tradedBy = toolStats.configTools.getLoreFromConfig("traded.traded-by", false); - - for (String line : lore) { - // this is the worst code I have ever written - 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; - } } diff --git a/src/main/java/lol/hyper/toolstats/tools/config/ConfigTools.java b/src/main/java/lol/hyper/toolstats/tools/config/ConfigTools.java index 6a43447..e818709 100644 --- a/src/main/java/lol/hyper/toolstats/tools/config/ConfigTools.java +++ b/src/main/java/lol/hyper/toolstats/tools/config/ConfigTools.java @@ -18,17 +18,15 @@ package lol.hyper.toolstats.tools.config; import lol.hyper.toolstats.ToolStats; +import lol.hyper.toolstats.tools.ItemLore; import org.bukkit.ChatColor; import org.bukkit.Material; import java.util.regex.Matcher; -import java.util.regex.Pattern; public class ConfigTools { private final ToolStats toolStats; - private final Pattern COLOR_CODES = Pattern.compile("&([0-9a-fk-or])"); - private final Pattern HEX_PATTERN = Pattern.compile("&#([A-Fa-f0-9]{6})"); public ConfigTools(ToolStats toolStats) { this.toolStats = toolStats; @@ -109,72 +107,46 @@ public class ConfigTools { } /** - * Gets the lore message from the config. + * Format a string to be ready for lore usage. * - * @param configName The config name, "messages." is already in front. - * @param raw If you want the raw message. False if you want no placeholders. - * @return The lore message. + * @param configName The message to use. + * @param placeHolder The placeholder text in the message. + * @param value The value to set the placeholder. + * @return Formatted string, null if the configName doesn't exist. */ - public String getLoreFromConfig(String configName, boolean raw) { + public String formatLore(String configName, String placeHolder, Object value) { String lore = toolStats.config.getString("messages." + configName); if (lore == null) { return null; } - if (raw) { - Matcher hexMatcher = HEX_PATTERN.matcher(lore); - while (hexMatcher.find()) { - String hexCode = hexMatcher.group(1); - lore = lore.replaceAll(hexMatcher.group(), net.md_5.bungee.api.ChatColor.of("#" + hexCode).toString()); - } - Matcher colorMatcher = COLOR_CODES.matcher(lore); - while (colorMatcher.find()) { - String colorCode = colorMatcher.group(1); - lore = lore.replaceAll("&" + colorCode, ChatColor.getByChar(colorCode).toString()); - } + // set the placeholder to the value + lore = lore.replace(placeHolder, String.valueOf(value)); - return ChatColor.translateAlternateColorCodes('§', lore); - } else { - // remove all color codes - // this is used to compare the current lore on the item - // Example: [§7Arrows shot: §8] is on the lore - // this will return [Arrows shot: ] so we can match it - lore = COLOR_CODES.matcher(lore).replaceAll(""); - lore = HEX_PATTERN.matcher(lore).replaceAll(""); - if (lore.contains("{player}")) { - lore = lore.replace("{player}", ""); - } - if (lore.contains("{date}")) { - lore = lore.replace("{date}", ""); - } - if (lore.contains("{name}")) { - lore = lore.replace("{name}", ""); - } - if (lore.contains("{kills}")) { - lore = lore.replace("{kills}", ""); - } - if (lore.contains("{blocks}")) { - lore = lore.replace("{blocks}", ""); - } - if (lore.contains("{sheep}")) { - lore = lore.replace("{sheep}", ""); - } - if (lore.contains("{damage}")) { - lore = lore.replace("{damage}", ""); - } - if (lore.contains("{fish}")) { - lore = lore.replace("{fish}", ""); - } - if (lore.contains("{crops}")) { - lore = lore.replace("{crops}", ""); - } - if (lore.contains("{arrows}")) { - lore = lore.replace("{arrows}", ""); - } - if (lore.contains("{time}")) { - lore = lore.replace("{time}", ""); - } + Matcher hexMatcher = ItemLore.HEX_PATTERN.matcher(lore); + while (hexMatcher.find()) { + String hexCode = hexMatcher.group(1); + lore = lore.replaceAll(hexMatcher.group(), net.md_5.bungee.api.ChatColor.of("#" + hexCode).toString()); } - return lore; + + Matcher colorMatcher = ItemLore.COLOR_CODES.matcher(lore); + while (colorMatcher.find()) { + String colorCode = colorMatcher.group(1); + lore = lore.replaceAll("&" + colorCode, ChatColor.getByChar(colorCode).toString()); + } + + return ChatColor.translateAlternateColorCodes('§', lore); + } + + /** + * Remove all color codes from a message. + * + * @param message The message. + * @return The message without color codes. + */ + public String removeColor(String message) { + message = ItemLore.COLOR_CODES.matcher(message).replaceAll(""); + message = ItemLore.HEX_PATTERN.matcher(message).replaceAll(""); + return message; } } diff --git a/src/main/java/lol/hyper/toolstats/tools/config/versions/Version7.java b/src/main/java/lol/hyper/toolstats/tools/config/versions/Version7.java index f8746af..3d8c2ae 100644 --- a/src/main/java/lol/hyper/toolstats/tools/config/versions/Version7.java +++ b/src/main/java/lol/hyper/toolstats/tools/config/versions/Version7.java @@ -21,9 +21,6 @@ import lol.hyper.toolstats.ToolStats; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; public class Version7 {