diff --git a/Spigot-Server-Patches/0343-Ignore-Dead-Entities-in-entityList-iteration.patch b/Spigot-Server-Patches/0343-Ignore-Dead-Entities-in-entityList-iteration.patch new file mode 100644 index 000000000..d891b6e9f --- /dev/null +++ b/Spigot-Server-Patches/0343-Ignore-Dead-Entities-in-entityList-iteration.patch @@ -0,0 +1,103 @@ +From 3e0a26eb873fcf1fa259f775320ae0a6a6346ec0 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sat, 28 Jul 2018 12:18:27 -0400 +Subject: [PATCH] Ignore Dead Entities in entityList iteration + +A spigot change delays removal of entities from the entity list. +This causes a change in behavior from Vanilla where getEntities type +methods will return dead entities that they shouldn't otherwise be doing. + +This will ensure that dead entities are skipped from iteration since +they shouldn't of been in the list in the first place. + +diff --git a/src/main/java/com/destroystokyo/paper/PaperCommand.java b/src/main/java/com/destroystokyo/paper/PaperCommand.java +index ecd1c65a9..1898ab897 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperCommand.java ++++ b/src/main/java/com/destroystokyo/paper/PaperCommand.java +@@ -128,6 +128,7 @@ public class PaperCommand extends Command { + List entities = world.entityList; + entities.forEach(e -> { + MinecraftKey key = EntityTypes.getKey(e); ++ if (e.shouldBeRemoved) return; // Paper + + MutablePair> info = list.computeIfAbsent(key, k -> MutablePair.of(0, Maps.newHashMap())); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(e.getChunkX(), e.getChunkZ()); +diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java +index 89f9bd347..d163acd8f 100644 +--- a/src/main/java/net/minecraft/server/Entity.java ++++ b/src/main/java/net/minecraft/server/Entity.java +@@ -124,6 +124,7 @@ public abstract class Entity implements ICommandListener, KeyedObject { // Paper + protected boolean E; + private boolean aw; + public boolean dead; ++ public boolean shouldBeRemoved; // Paper + public float width; + public float length; + public float I; +diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java +index df98a4f44..8f82fbf67 100644 +--- a/src/main/java/net/minecraft/server/World.java ++++ b/src/main/java/net/minecraft/server/World.java +@@ -1279,6 +1279,7 @@ public abstract class World implements IBlockAccess { + if (entity.aa && this.isChunkLoaded(i, j, true)) { + this.getChunkAt(i, j).b(entity); + } ++ entity.shouldBeRemoved = true; // Paper + + if (!guardEntityList) { // Spigot - It will get removed after the tick if we are ticking // Paper - always remove from current chunk above + // CraftBukkit start - Decrement loop variable field if we've already ticked this entity +@@ -2633,6 +2634,7 @@ public abstract class World implements IBlockAccess { + + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); ++ if (entity.shouldBeRemoved) continue; // Paper + + if (oclass.isAssignableFrom(entity.getClass()) && predicate.apply((T) entity)) { + arraylist.add(entity); +@@ -2719,6 +2721,7 @@ public abstract class World implements IBlockAccess { + + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); ++ if (entity.shouldBeRemoved) continue; // Paper + // CraftBukkit start - Split out persistent check, don't apply it to special persistent mobs + if (entity instanceof EntityInsentient) { + EntityInsentient entityinsentient = (EntityInsentient) entity; +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +index 210e3bc4e..e6ecd1796 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +@@ -678,6 +678,7 @@ public class CraftWorld implements World { + for (Object o : world.entityList) { + if (o instanceof net.minecraft.server.Entity) { + net.minecraft.server.Entity mcEnt = (net.minecraft.server.Entity) o; ++ if (mcEnt.shouldBeRemoved) continue; // Paper + Entity bukkitEntity = mcEnt.getBukkitEntity(); + + // Assuming that bukkitEntity isn't null +@@ -696,6 +697,7 @@ public class CraftWorld implements World { + for (Object o : world.entityList) { + if (o instanceof net.minecraft.server.Entity) { + net.minecraft.server.Entity mcEnt = (net.minecraft.server.Entity) o; ++ if (mcEnt.shouldBeRemoved) continue; // Paper + Entity bukkitEntity = mcEnt.getBukkitEntity(); + + // Assuming that bukkitEntity isn't null +@@ -720,6 +722,7 @@ public class CraftWorld implements World { + + for (Object entity: world.entityList) { + if (entity instanceof net.minecraft.server.Entity) { ++ if (((net.minecraft.server.Entity) entity).shouldBeRemoved) continue; // Paper + Entity bukkitEntity = ((net.minecraft.server.Entity) entity).getBukkitEntity(); + + if (bukkitEntity == null) { +@@ -742,6 +745,7 @@ public class CraftWorld implements World { + + for (Object entity: world.entityList) { + if (entity instanceof net.minecraft.server.Entity) { ++ if (((net.minecraft.server.Entity) entity).shouldBeRemoved) continue; // Paper + Entity bukkitEntity = ((net.minecraft.server.Entity) entity).getBukkitEntity(); + + if (bukkitEntity == null) { +-- +2.18.0 +