diff --git a/pom.xml b/pom.xml index 0a23b94..f93f381 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,10 @@ jitpack.io https://jitpack.io + + rosewood-repo + https://repo.rosewooddev.io/repository/public/ + @@ -90,5 +94,11 @@ 1.0.10 provided + + dev.rosewood + rosestacker + 1.5.39 + provided + diff --git a/src/main/java/lol/hyper/toolstats/ToolStats.java b/src/main/java/lol/hyper/toolstats/ToolStats.java index 9dda666..eb782f5 100644 --- a/src/main/java/lol/hyper/toolstats/ToolStats.java +++ b/src/main/java/lol/hyper/toolstats/ToolStats.java @@ -23,6 +23,7 @@ import lol.hyper.hyperlib.releases.HyperUpdater; import lol.hyper.hyperlib.utils.TextUtils; import lol.hyper.toolstats.commands.CommandToolStats; import lol.hyper.toolstats.events.*; +import lol.hyper.toolstats.support.rosestacker.RoseStacker; import lol.hyper.toolstats.tools.*; import lol.hyper.toolstats.tools.config.ConfigTools; import lol.hyper.toolstats.tools.config.ConfigUpdater; @@ -74,6 +75,7 @@ public final class ToolStats extends JavaPlugin { public ToolStatsKeys toolStatsKeys; public InventoryClose inventoryClose; public PlayerDrop playerDrop; + public RoseStacker roseStacker = null; @Override public void onEnable() { @@ -128,6 +130,10 @@ public final class ToolStats extends JavaPlugin { projectileShoot = new ProjectileShoot(this); inventoryClose = new InventoryClose(this); playerDrop = new PlayerDrop(this); + if (Bukkit.getPluginManager().isPluginEnabled("RoseStacker")) { + logger.info("RoseStacker has been detected, adding support!"); + roseStacker = new RoseStacker(); + } Bukkit.getServer().getPluginManager().registerEvents(blockBreak, this); Bukkit.getServer().getPluginManager().registerEvents(chunkPopulate, this); diff --git a/src/main/java/lol/hyper/toolstats/events/EntityDamage.java b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java index 8645473..f1616c4 100644 --- a/src/main/java/lol/hyper/toolstats/events/EntityDamage.java +++ b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java @@ -34,6 +34,7 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.projectiles.ProjectileSource; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; public class EntityDamage implements Listener { @@ -103,15 +104,15 @@ public class EntityDamage implements Listener { if (modDied) { // player killed another player if (playerBeingAttacked) { - updateWeaponKills(playerAttackingInventory, "player"); + updateWeaponKills(playerAttackingInventory, "player", null); } else { // player kills a regular mob - updateWeaponKills(playerAttackingInventory, "mob"); + updateWeaponKills(playerAttackingInventory, "mob", mobBeingAttacked); if (mobAttackedType == EntityType.WITHER) { - updateBossesKilled(playerAttackingInventory, "wither"); + updateBossesKilled(playerAttackingInventory, "wither", mobBeingAttacked); } if (mobAttackedType == EntityType.ENDER_DRAGON) { - updateBossesKilled(playerAttackingInventory, "enderdragon"); + updateBossesKilled(playerAttackingInventory, "enderdragon", mobBeingAttacked); } } } @@ -131,15 +132,15 @@ public class EntityDamage implements Listener { if (modDied) { // if the trident killed a player, update the kills if (playerBeingAttacked) { - updateTridentKills(trident, "player"); + updateTridentKills(trident, "player", null); } else { // the trident killed a mob, update the kills - updateTridentKills(trident, "mob"); + updateTridentKills(trident, "mob", mobBeingAttacked); if (mobAttackedType == EntityType.WITHER) { - updateBossesKilled(player.getInventory(), "wither"); + updateBossesKilled(player.getInventory(), "wither", mobBeingAttacked); } if (mobAttackedType == EntityType.ENDER_DRAGON) { - updateBossesKilled(player.getInventory(), "enderdragon"); + updateBossesKilled(player.getInventory(), "enderdragon", mobBeingAttacked); } } } @@ -162,15 +163,15 @@ public class EntityDamage implements Listener { if (modDied) { if (playerBeingAttacked) { // player killed another player with an arrow - updateBowKills(shootingPlayer.getInventory(), "player"); + updateBowKills(shootingPlayer.getInventory(), "player", null); } else { // player killed mob with an arrow - updateBowKills(shootingPlayer.getInventory(), "mob"); + updateBowKills(shootingPlayer.getInventory(), "mob", mobBeingAttacked); if (mobAttackedType == EntityType.WITHER) { - updateBossesKilledByBow(shootingPlayer.getInventory(), "wither"); + updateBossesKilledByBow(shootingPlayer.getInventory(), "wither", mobBeingAttacked); } if (mobAttackedType == EntityType.ENDER_DRAGON) { - updateBossesKilledByBow(shootingPlayer.getInventory(), "enderdragon"); + updateBossesKilledByBow(shootingPlayer.getInventory(), "enderdragon", mobBeingAttacked); } } } @@ -240,7 +241,7 @@ public class EntityDamage implements Listener { } } - private void updateBowKills(PlayerInventory playerInventory, String type) { + private void updateBowKills(PlayerInventory playerInventory, String type, LivingEntity entity) { ItemStack heldBow = toolStats.itemChecker.getBow(playerInventory); if (heldBow == null) { return; @@ -251,7 +252,12 @@ public class EntityDamage implements Listener { if (type.equalsIgnoreCase("mob")) { // player is shooting a mob - ItemMeta newBow = toolStats.itemLore.updateMobKills(heldBow, 1); + ItemMeta newBow; + int count = 1; + if (toolStats.roseStacker != null) { + count = toolStats.roseStacker.countMobs(entity); + } + newBow = toolStats.itemLore.updateMobKills(heldBow, count); if (newBow != null) { if (isMain && isOffHand) { playerInventory.getItemInMainHand().setItemMeta(newBow); @@ -277,16 +283,20 @@ public class EntityDamage implements Listener { } } - private void updateTridentKills(Trident trident, String type) { + private void updateTridentKills(Trident trident, String type, LivingEntity entity) { ItemStack newTrident = trident.getItemStack(); - ItemMeta newKills; + ItemMeta newTridentMeta; if (type.equalsIgnoreCase("player")) { - newKills = toolStats.itemLore.updatePlayerKills(trident.getItemStack(), 1); + newTridentMeta = toolStats.itemLore.updatePlayerKills(trident.getItemStack(), 1); } else { - newKills = toolStats.itemLore.updateMobKills(trident.getItemStack(), 1); + int count = 1; + if (toolStats.roseStacker != null) { + count = toolStats.roseStacker.countMobs(entity); + } + newTridentMeta = toolStats.itemLore.updateMobKills(newTrident, count); } - if (newKills != null) { - newTrident.setItemMeta(newKills); + if (newTridentMeta != null) { + newTrident.setItemMeta(newTridentMeta); trident.setItemStack(newTrident); } } @@ -308,29 +318,37 @@ public class EntityDamage implements Listener { } } - private void updateWeaponKills(PlayerInventory playerInventory, String type) { + private void updateWeaponKills(PlayerInventory playerInventory, String type, LivingEntity entity) { ItemStack heldWeapon = playerInventory.getItemInMainHand(); ItemMeta newHeldWeaponMeta = null; if (type.equalsIgnoreCase("player")) { newHeldWeaponMeta = toolStats.itemLore.updatePlayerKills(heldWeapon, 1); } if (type.equalsIgnoreCase("mob")) { - newHeldWeaponMeta = toolStats.itemLore.updateMobKills(heldWeapon, 1); + int count = 1; + if (toolStats.roseStacker != null) { + count = toolStats.roseStacker.countMobs(entity); + } + newHeldWeaponMeta = toolStats.itemLore.updateMobKills(heldWeapon, count); } if (newHeldWeaponMeta != null) { playerInventory.getItemInMainHand().setItemMeta(newHeldWeaponMeta); } } - private void updateBossesKilled(PlayerInventory playerInventory, String boss) { + private void updateBossesKilled(PlayerInventory playerInventory, String boss, LivingEntity entity) { ItemStack heldWeapon = playerInventory.getItemInMainHand(); - ItemMeta newHeldWeaponMeta = toolStats.itemLore.updateBossesKilled(heldWeapon, 1, boss); + int count = 1; + if (toolStats.roseStacker != null) { + count = toolStats.roseStacker.countMobs(entity); + } + ItemMeta newHeldWeaponMeta = toolStats.itemLore.updateBossesKilled(heldWeapon, count, boss); if (newHeldWeaponMeta != null) { playerInventory.getItemInMainHand().setItemMeta(newHeldWeaponMeta); } } - private void updateBossesKilledByBow(PlayerInventory playerInventory, String boss) { + private void updateBossesKilledByBow(PlayerInventory playerInventory, String boss, LivingEntity entity) { ItemStack heldBow = toolStats.itemChecker.getBow(playerInventory); if (heldBow == null) { return; @@ -339,7 +357,12 @@ public class EntityDamage implements Listener { boolean isMain = playerInventory.getItemInMainHand().getType() == Material.BOW || playerInventory.getItemInMainHand().getType() == Material.CROSSBOW; boolean isOffHand = playerInventory.getItemInOffHand().getType() == Material.BOW || playerInventory.getItemInOffHand().getType() == Material.CROSSBOW; - ItemMeta newHeldWeaponMeta = toolStats.itemLore.updateBossesKilled(heldBow, 1, boss); + int count = 1; + if (toolStats.roseStacker != null) { + count = toolStats.roseStacker.countMobs(entity); + } + + ItemMeta newHeldWeaponMeta = toolStats.itemLore.updateBossesKilled(heldBow, count, boss); if (newHeldWeaponMeta != null) { if (isMain && isOffHand) { playerInventory.getItemInMainHand().setItemMeta(newHeldWeaponMeta); diff --git a/src/main/java/lol/hyper/toolstats/support/rosestacker/RoseStacker.java b/src/main/java/lol/hyper/toolstats/support/rosestacker/RoseStacker.java new file mode 100644 index 0000000..7a3a1fa --- /dev/null +++ b/src/main/java/lol/hyper/toolstats/support/rosestacker/RoseStacker.java @@ -0,0 +1,67 @@ +/* + * 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 . + */ + +/* + * 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.support.rosestacker; + +import dev.rosewood.rosestacker.api.RoseStackerAPI; +import dev.rosewood.rosestacker.stack.StackedEntity; +import org.bukkit.entity.LivingEntity; + +public class RoseStacker { + + private final RoseStackerAPI rsAPI; + + public RoseStacker() { + this.rsAPI = RoseStackerAPI.getInstance(); + } + + public int countMobs(LivingEntity entity) { + if (!rsAPI.isEntityStacked(entity)) { + // if the entity is not stacked, ignore + return 1; + } + StackedEntity stackedEntity = rsAPI.getStackedEntity(entity); + if (stackedEntity == null) { + return 1; + } + + boolean killAll = stackedEntity.getStackSettings().shouldKillEntireStackOnDeath(); + // if we kill the entire stack, add the entire stack to the count + if (killAll) { + return stackedEntity.getStackSize(); + } + + return 1; + } +} diff --git a/src/main/java/lol/hyper/toolstats/tools/ItemLore.java b/src/main/java/lol/hyper/toolstats/tools/ItemLore.java index 2a56037..b802f8a 100644 --- a/src/main/java/lol/hyper/toolstats/tools/ItemLore.java +++ b/src/main/java/lol/hyper/toolstats/tools/ItemLore.java @@ -1410,7 +1410,6 @@ public class ItemLore { } List newLore = updateItemLore(meta, oldLine, newLine); meta.lore(newLore); - toolStats.logger.info(meta.toString()); return meta; } diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml index d31022f..437e0be 100644 --- a/src/main/resources/paper-plugin.yml +++ b/src/main/resources/paper-plugin.yml @@ -29,4 +29,10 @@ permissions: default: op toolstats.remove: description: Allows the usage of /toolstats remove. - default: op \ No newline at end of file + default: op + +dependencies: + server: + RoseStacker: + load: BEFORE + required: false \ No newline at end of file