From be613bc9b63cb01e03b098045cfba5fb04e04023 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Fri, 13 Feb 2026 22:14:54 +0100 Subject: [PATCH] Fix archery entity tracking failing often on Folia (#5260) --- .../gmail/nossr50/skills/archery/Archery.java | 42 ++++++------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java index b5e2c5737..efd704f0e 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java @@ -6,9 +6,10 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.skills.RankUtils; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -16,7 +17,7 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; public class Archery { - private static final List trackedEntities = new ArrayList<>(); + private static final Map trackedEntities = new ConcurrentHashMap<>(); public static double skillShotMaxBonusDamage = mcMMO.p.getAdvancedConfig() .getSkillShotDamageMax(); @@ -27,25 +28,12 @@ public class Archery { .getArcheryDistanceMultiplier(); protected static void incrementTrackerValue(LivingEntity livingEntity) { - for (TrackedEntity trackedEntity : trackedEntities) { - if (trackedEntity.getLivingEntity().getEntityId() == livingEntity.getEntityId()) { - trackedEntity.incrementArrowCount(); - return; - } - } - - addToTracker(livingEntity); // If the entity isn't tracked yet - } - - protected static void addToTracker(LivingEntity livingEntity) { - TrackedEntity trackedEntity = new TrackedEntity(livingEntity); - + final TrackedEntity trackedEntity = trackedEntities.computeIfAbsent(livingEntity.getUniqueId(), k -> new TrackedEntity(livingEntity)); trackedEntity.incrementArrowCount(); - trackedEntities.add(trackedEntity); } protected static void removeFromTracker(TrackedEntity trackedEntity) { - trackedEntities.remove(trackedEntity); + trackedEntities.remove(trackedEntity.getID()); } /** @@ -54,17 +42,11 @@ public class Archery { * @param livingEntity The entity hit by the arrows */ public static void arrowRetrievalCheck(@NotNull LivingEntity livingEntity) { - for (Iterator entityIterator = trackedEntities.iterator(); - entityIterator.hasNext(); ) { - TrackedEntity trackedEntity = entityIterator.next(); - - if (trackedEntity.getID() == livingEntity.getUniqueId()) { - ItemUtils.spawnItems(null, livingEntity.getLocation(), - new ItemStack(Material.ARROW), trackedEntity.getArrowCount(), - ItemSpawnReason.ARROW_RETRIEVAL_ACTIVATED); - entityIterator.remove(); - return; - } + final TrackedEntity trackedEntity = trackedEntities.remove(livingEntity.getUniqueId()); + if (trackedEntity != null) { + ItemUtils.spawnItems(null, livingEntity.getLocation(), + new ItemStack(Material.ARROW), trackedEntity.getArrowCount(), + ItemSpawnReason.ARROW_RETRIEVAL_ACTIVATED); } }