From 70a75c0b48b119d32c37ad26dc24867a380678fe Mon Sep 17 00:00:00 2001 From: Ammar Askar Date: Sat, 3 Aug 2013 22:04:58 +0500 Subject: [PATCH] Guard entity list during ticking --- .../0069-Guard-entity-list.patch | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 CraftBukkit-Patches/0069-Guard-entity-list.patch diff --git a/CraftBukkit-Patches/0069-Guard-entity-list.patch b/CraftBukkit-Patches/0069-Guard-entity-list.patch new file mode 100644 index 000000000..ddc4dab67 --- /dev/null +++ b/CraftBukkit-Patches/0069-Guard-entity-list.patch @@ -0,0 +1,74 @@ +From 9acd15599ac94ac59fb7f387d299663b10d60afc Mon Sep 17 00:00:00 2001 +From: Ammar Askar +Date: Sat, 3 Aug 2013 21:42:00 +0500 +Subject: [PATCH] Guard entity list + + +diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java +index 15117e5..37d6e1a 100644 +--- a/src/main/java/net/minecraft/server/World.java ++++ b/src/main/java/net/minecraft/server/World.java +@@ -29,7 +29,25 @@ import java.util.concurrent.Callable; + public abstract class World implements IBlockAccess { + + public boolean d; +- public List entityList = new ArrayList(); ++ public List entityList = new ArrayList() { // Spigot start - guard entity list from removals ++ @Override ++ public Object remove(int index) { ++ guard(); ++ return super.remove(index); ++ } ++ ++ @Override ++ public boolean remove(Object o) { ++ guard(); ++ return super.remove(o); ++ } ++ ++ private void guard() { ++ if (guardEntityList) { ++ throw new java.util.ConcurrentModificationException(); ++ } ++ } ++ }; // Spigot end + protected List f = new ArrayList(); + public Set tileEntityList = new HashSet(); // CraftBukkit - ArrayList -> HashSet + private List a = new ArrayList(); +@@ -74,6 +92,7 @@ public abstract class World implements IBlockAccess { + int[] H; + public boolean isStatic; + // Spigot start ++ private boolean guardEntityList = false; + protected final gnu.trove.map.hash.TLongShortHashMap chunkTickList; + protected float growthOdds = 100; + protected float modifiedOdds = 100; +@@ -1285,6 +1304,7 @@ public abstract class World implements IBlockAccess { + + org.spigotmc.ActivationRange.activateEntities(this); // Spigot + timings.entityTick.startTiming(); // Spigot ++ guardEntityList = true; // Spigot + for (i = 0; i < this.entityList.size(); ++i) { + entity = (Entity) this.entityList.get(i); + +@@ -1331,14 +1351,16 @@ public abstract class World implements IBlockAccess { + if (entity.ai && this.isChunkLoaded(j, k)) { + this.getChunkAt(j, k).b(entity); + } +- ++ guardEntityList = false; // Spigot + this.entityList.remove(i--); ++ guardEntityList = true; // Spigot + this.b(entity); + } + + this.methodProfiler.b(); + } + lastChunk = Long.MIN_VALUE; // Spigot ++ guardEntityList = false; // Spigot + + timings.entityTick.stopTiming(); // Spigot + this.methodProfiler.c("tileEntities"); +-- +1.8.1.msysgit.1 +