1
0
mirror of https://github.com/mcMMO-Dev/mcMMO.git synced 2026-02-17 17:32:36 +01:00

Fix archery entity tracking failing often on Folia (#5260)

This commit is contained in:
Warrior
2026-02-13 22:14:54 +01:00
committed by GitHub
parent 99c2ec2959
commit be613bc9b6

View File

@@ -6,9 +6,10 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import java.util.ArrayList; import java.util.Map;
import java.util.Iterator; import java.util.UUID;
import java.util.List; import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -16,7 +17,7 @@ import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class Archery { public class Archery {
private static final List<TrackedEntity> trackedEntities = new ArrayList<>(); private static final Map<UUID, TrackedEntity> trackedEntities = new ConcurrentHashMap<>();
public static double skillShotMaxBonusDamage = mcMMO.p.getAdvancedConfig() public static double skillShotMaxBonusDamage = mcMMO.p.getAdvancedConfig()
.getSkillShotDamageMax(); .getSkillShotDamageMax();
@@ -27,25 +28,12 @@ public class Archery {
.getArcheryDistanceMultiplier(); .getArcheryDistanceMultiplier();
protected static void incrementTrackerValue(LivingEntity livingEntity) { protected static void incrementTrackerValue(LivingEntity livingEntity) {
for (TrackedEntity trackedEntity : trackedEntities) { final TrackedEntity trackedEntity = trackedEntities.computeIfAbsent(livingEntity.getUniqueId(), k -> new TrackedEntity(livingEntity));
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);
trackedEntity.incrementArrowCount(); trackedEntity.incrementArrowCount();
trackedEntities.add(trackedEntity);
} }
protected static void removeFromTracker(TrackedEntity 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 * @param livingEntity The entity hit by the arrows
*/ */
public static void arrowRetrievalCheck(@NotNull LivingEntity livingEntity) { public static void arrowRetrievalCheck(@NotNull LivingEntity livingEntity) {
for (Iterator<TrackedEntity> entityIterator = trackedEntities.iterator(); final TrackedEntity trackedEntity = trackedEntities.remove(livingEntity.getUniqueId());
entityIterator.hasNext(); ) { if (trackedEntity != null) {
TrackedEntity trackedEntity = entityIterator.next(); ItemUtils.spawnItems(null, livingEntity.getLocation(),
new ItemStack(Material.ARROW), trackedEntity.getArrowCount(),
if (trackedEntity.getID() == livingEntity.getUniqueId()) { ItemSpawnReason.ARROW_RETRIEVAL_ACTIVATED);
ItemUtils.spawnItems(null, livingEntity.getLocation(),
new ItemStack(Material.ARROW), trackedEntity.getArrowCount(),
ItemSpawnReason.ARROW_RETRIEVAL_ACTIVATED);
entityIterator.remove();
return;
}
} }
} }