From fdb6626c4266ee4d4924ec2f894df9f3cfdf6ec1 Mon Sep 17 00:00:00 2001 From: hyperdefined Date: Fri, 4 Nov 2022 20:26:55 -0400 Subject: [PATCH] update all items 1 tick later this should fix #18 --- .../hyper/toolstats/events/BlocksMined.java | 5 +- .../hyper/toolstats/events/EntityDamage.java | 92 ++++++++++--------- .../hyper/toolstats/events/PlayerFish.java | 13 ++- .../hyper/toolstats/events/SheepShear.java | 3 +- 4 files changed, 63 insertions(+), 50 deletions(-) diff --git a/src/main/java/lol/hyper/toolstats/events/BlocksMined.java b/src/main/java/lol/hyper/toolstats/events/BlocksMined.java index c05d329..977139e 100644 --- a/src/main/java/lol/hyper/toolstats/events/BlocksMined.java +++ b/src/main/java/lol/hyper/toolstats/events/BlocksMined.java @@ -20,6 +20,7 @@ package lol.hyper.toolstats.events; import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.tools.ItemChecker; import lol.hyper.toolstats.tools.NumberFormat; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -43,7 +44,7 @@ public class BlocksMined implements Listener { this.toolStats = toolStats; } - @EventHandler (priority = EventPriority.HIGHEST) + @EventHandler(priority = EventPriority.HIGHEST) public void onBreak(BlockBreakEvent event) { if (event.isCancelled()) { return; @@ -63,7 +64,7 @@ public class BlocksMined implements Listener { return; } // if it's an item we want, update the stats - updateBlocksMined(heldItem); + Bukkit.getScheduler().runTaskLater(toolStats, () -> updateBlocksMined(heldItem), 1); } private void updateBlocksMined(ItemStack playerTool) { diff --git a/src/main/java/lol/hyper/toolstats/events/EntityDamage.java b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java index 34f02e1..61ff38b 100644 --- a/src/main/java/lol/hyper/toolstats/events/EntityDamage.java +++ b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java @@ -20,6 +20,7 @@ package lol.hyper.toolstats.events; import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.tools.ItemChecker; import lol.hyper.toolstats.tools.NumberFormat; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.*; @@ -29,6 +30,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByBlockEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.ItemMeta; @@ -56,7 +58,7 @@ public class EntityDamage implements Listener { if (!(event.getEntity() instanceof LivingEntity)) { return; } - LivingEntity livingEntity = (LivingEntity) event.getEntity(); + LivingEntity mobBeingAttacked = (LivingEntity) event.getEntity(); // ignore void and /kill damage EntityDamageEvent.DamageCause cause = event.getCause(); @@ -65,15 +67,17 @@ public class EntityDamage implements Listener { } // mob is going to die - if (livingEntity.getHealth() - event.getFinalDamage() <= 0) { + if (mobBeingAttacked.getHealth() - event.getFinalDamage() <= 0) { // a player is killing something if (event.getDamager() instanceof Player) { - Player player = (Player) event.getDamager(); - if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) { + Player attackingPlayer = (Player) event.getDamager(); + if (attackingPlayer.getGameMode() == GameMode.CREATIVE || attackingPlayer.getGameMode() == GameMode.SPECTATOR) { return; } + PlayerInventory attackingPlayerInventory = attackingPlayer.getInventory(); + int heldItemSlot = attackingPlayerInventory.getHeldItemSlot(); + ItemStack heldItem = attackingPlayerInventory.getItem(attackingPlayer.getInventory().getHeldItemSlot()); // a player killed something with their fist - ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot()); if (heldItem == null || heldItem.getType() == Material.AIR) { return; } @@ -82,20 +86,20 @@ public class EntityDamage implements Listener { return; } // a player is killing another player - if (livingEntity instanceof Player) { - player.getInventory().setItem(player.getInventory().getHeldItemSlot(), updatePlayerKills(heldItem)); + if (mobBeingAttacked instanceof Player) { + Bukkit.getScheduler().runTaskLater(toolStats, () -> attackingPlayerInventory.setItem(heldItemSlot, updatePlayerKills(heldItem)), 1); return; } // player is killing regular mob - player.getInventory().setItem(player.getInventory().getHeldItemSlot(), updateMobKills(heldItem)); - trackedMobs.add(livingEntity.getUniqueId()); + Bukkit.getScheduler().runTaskLater(toolStats, () -> attackingPlayerInventory.setItem(heldItemSlot, updateMobKills(heldItem)), 1); + trackedMobs.add(mobBeingAttacked.getUniqueId()); } // trident is being thrown at something if (event.getDamager() instanceof Trident) { Trident trident = (Trident) event.getDamager(); ItemStack clone; // trident is killing player - if (livingEntity instanceof Player) { + if (mobBeingAttacked instanceof Player) { clone = updatePlayerKills(trident.getItem()); } else { clone = updateMobKills(trident.getItem()); @@ -103,44 +107,46 @@ public class EntityDamage implements Listener { if (clone == null) { return; } - trident.setItem(clone); + Bukkit.getScheduler().runTaskLater(toolStats, () -> trident.setItem(clone), 1); } // arrow is being shot if (event.getDamager() instanceof Arrow) { Arrow arrow = (Arrow) event.getDamager(); // if the shooter is a player if (arrow.getShooter() instanceof Player) { - Player player = (Player) arrow.getShooter(); - if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) { + Player shootingPlayer = (Player) arrow.getShooter(); + if (shootingPlayer.getGameMode() == GameMode.CREATIVE || shootingPlayer.getGameMode() == GameMode.SPECTATOR) { return; } - ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot()); + PlayerInventory shootingPlayerInventory = shootingPlayer.getInventory(); + int heldItemSlot = shootingPlayerInventory.getHeldItemSlot(); + ItemStack heldItem = shootingPlayerInventory.getItem(heldItemSlot); if (heldItem == null) { return; } // if the player is holding the bow/crossbow // if they switch then oh well if (heldItem.getType() == Material.BOW || heldItem.getType() == Material.CROSSBOW) { - if (livingEntity instanceof Player) { - player.getInventory().setItem(player.getInventory().getHeldItemSlot(), updatePlayerKills(heldItem)); + if (mobBeingAttacked instanceof Player) { + Bukkit.getScheduler().runTaskLater(toolStats, () -> shootingPlayerInventory.setItem(heldItemSlot, updatePlayerKills(heldItem)), 1); } else { - player.getInventory().setItem(player.getInventory().getHeldItemSlot(), updateMobKills(heldItem)); + Bukkit.getScheduler().runTaskLater(toolStats, () -> shootingPlayerInventory.setItem(heldItemSlot, updateMobKills(heldItem)), 1); } } } } } // player is taken damage but not being killed - if (livingEntity instanceof Player) { - Player player = (Player) livingEntity; - if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) { + if (mobBeingAttacked instanceof Player) { + Player playerTakingDamage = (Player) mobBeingAttacked; + if (playerTakingDamage.getGameMode() == GameMode.CREATIVE || playerTakingDamage.getGameMode() == GameMode.SPECTATOR) { return; } - PlayerInventory inventory = player.getInventory(); - for (ItemStack armor : inventory.getArmorContents()) { - if (armor != null) { - if (ItemChecker.isArmor(armor.getType())) { - updateArmorDamage(armor, event.getFinalDamage()); + PlayerInventory inventory = playerTakingDamage.getInventory(); + for (ItemStack armorPiece : inventory.getArmorContents()) { + if (armorPiece != null) { + if (ItemChecker.isArmor(armorPiece.getType())) { + Bukkit.getScheduler().runTaskLater(toolStats, () -> updateArmorDamage(armorPiece, event.getFinalDamage()), 1); } } } @@ -159,18 +165,18 @@ public class EntityDamage implements Listener { return; } - LivingEntity livingEntity = (LivingEntity) event.getEntity(); + LivingEntity mobBeingAttacked = (LivingEntity) event.getEntity(); // player is taken damage but not being killed - if (livingEntity instanceof Player) { - Player player = (Player) livingEntity; - if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) { + if (mobBeingAttacked instanceof Player) { + Player playerTakingDamage = (Player) mobBeingAttacked; + if (playerTakingDamage.getGameMode() == GameMode.CREATIVE || playerTakingDamage.getGameMode() == GameMode.SPECTATOR) { return; } - PlayerInventory inventory = player.getInventory(); - for (ItemStack armor : inventory.getArmorContents()) { - if (armor != null) { - if (ItemChecker.isArmor(armor.getType())) { - updateArmorDamage(armor, event.getFinalDamage()); + PlayerInventory inventory = playerTakingDamage.getInventory(); + for (ItemStack armorPiece : inventory.getArmorContents()) { + if (armorPiece != null) { + if (ItemChecker.isArmor(armorPiece.getType())) { + Bukkit.getScheduler().runTaskLater(toolStats, () -> updateArmorDamage(armorPiece, event.getFinalDamage()), 1); } } } @@ -189,18 +195,18 @@ public class EntityDamage implements Listener { return; } - LivingEntity livingEntity = (LivingEntity) event.getEntity(); + LivingEntity mobBeingAttacked = (LivingEntity) event.getEntity(); // player is taken damage but not being killed - if (livingEntity instanceof Player) { - Player player = (Player) livingEntity; - if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) { + if (mobBeingAttacked instanceof Player) { + Player playerTakingDamage = (Player) mobBeingAttacked; + if (playerTakingDamage.getGameMode() == GameMode.CREATIVE || playerTakingDamage.getGameMode() == GameMode.SPECTATOR) { return; } - PlayerInventory inventory = player.getInventory(); - for (ItemStack armor : inventory.getArmorContents()) { - if (armor != null) { - if (ItemChecker.isArmor(armor.getType())) { - updateArmorDamage(armor, event.getFinalDamage()); + PlayerInventory inventory = playerTakingDamage.getInventory(); + for (ItemStack armorPiece : inventory.getArmorContents()) { + if (armorPiece != null) { + if (ItemChecker.isArmor(armorPiece.getType())) { + Bukkit.getScheduler().runTaskLater(toolStats, () -> updateArmorDamage(armorPiece, event.getFinalDamage()), 1); } } } diff --git a/src/main/java/lol/hyper/toolstats/events/PlayerFish.java b/src/main/java/lol/hyper/toolstats/events/PlayerFish.java index 8dc85c8..f3012c2 100644 --- a/src/main/java/lol/hyper/toolstats/events/PlayerFish.java +++ b/src/main/java/lol/hyper/toolstats/events/PlayerFish.java @@ -21,6 +21,7 @@ import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.tools.ItemChecker; import lol.hyper.toolstats.tools.NumberFormat; import lol.hyper.toolstats.tools.UUIDDataType; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.Item; @@ -46,7 +47,7 @@ public class PlayerFish implements Listener { this.toolStats = toolStats; } - @EventHandler(priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.HIGHEST) public void onFish(PlayerFishEvent event) { if (event.isCancelled()) { return; @@ -65,8 +66,10 @@ public class PlayerFish implements Listener { if (heldItem == null || heldItem.getType() == Material.AIR || heldItem.getType() != Material.FISHING_ROD) { return; } - // update the fishing rod to the new one - updateFishCount(heldItem); + + // fix compatability issues by running 1 tick later + Bukkit.getScheduler().runTaskLater(toolStats, () -> updateFishCount(heldItem), 1); + // check if the player caught an item if (event.getCaught() == null) { return; @@ -83,6 +86,7 @@ public class PlayerFish implements Listener { /** * Update a fishing rod's fish count. + * * @param fishingRod The fishing rod to update. */ private void updateFishCount(ItemStack fishingRod) { @@ -157,8 +161,9 @@ public class PlayerFish implements Listener { /** * Add lore to newly caught item. + * * @param originalItem The original item to add lore. - * @param owner The player who caught it. + * @param owner The player who caught it. * @return A copy of the new item with lore. */ private ItemStack addNewLore(ItemStack originalItem, Player owner) { diff --git a/src/main/java/lol/hyper/toolstats/events/SheepShear.java b/src/main/java/lol/hyper/toolstats/events/SheepShear.java index c30cdd3..3ee8a84 100644 --- a/src/main/java/lol/hyper/toolstats/events/SheepShear.java +++ b/src/main/java/lol/hyper/toolstats/events/SheepShear.java @@ -19,6 +19,7 @@ package lol.hyper.toolstats.events; import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.tools.NumberFormat; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.Entity; @@ -69,7 +70,7 @@ public class SheepShear implements Listener { if (!sheep.isSheared()) { ItemStack newShears = addLore(heldItem); if (newShears != null) { - player.getInventory().setItem(heldItemSlot, newShears); + Bukkit.getScheduler().runTaskLater(toolStats, () -> player.getInventory().setItem(heldItemSlot, newShears), 1); } } }