From cc904e78d6ac8ef143d1b4adacc5b7058af19f72 Mon Sep 17 00:00:00 2001 From: md_5 Date: Mon, 10 Mar 2014 09:03:28 +1100 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 e09ddf7..d9da020 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -33,7 +33,32 @@ public abstract class World implements IBlockAccess { private int a = 63; protected boolean d; - public final List entityList = Lists.newArrayList(); + // Spigot start - guard entity list from removals + public final List entityList = new java.util.ArrayList() + { + @Override + public Entity 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 final List f = Lists.newArrayList(); public final List tileEntityList = Lists.newArrayList(); public final List tileEntityListTick = Lists.newArrayList(); @@ -101,6 +126,7 @@ public abstract class World implements IBlockAccess { public final org.spigotmc.SpigotWorldConfig spigotConfig; // Spigot public final SpigotTimings.WorldTimingsHandler timings; // Spigot + private boolean guardEntityList; // Spigot public CraftWorld getWorld() { return this.world; @@ -1338,6 +1364,7 @@ public abstract class World implements IBlockAccess { org.spigotmc.ActivationRange.activateEntities(this); // Spigot timings.entityTick.startTiming(); // Spigot + guardEntityList = true; // Spigot // CraftBukkit start - Use field for loop variable for (this.tickPosition = 0; this.tickPosition < this.entityList.size(); ++this.tickPosition) { entity = (Entity) this.entityList.get(this.tickPosition); @@ -1376,12 +1403,15 @@ public abstract class World implements IBlockAccess { this.getChunkAt(j, l).b(entity); } + guardEntityList = false; // Spigot this.entityList.remove(this.tickPosition--); // CraftBukkit - Use field for loop variable + guardEntityList = true; // Spigot this.c(entity); } this.methodProfiler.b(); } + guardEntityList = false; // Spigot timings.entityTick.stopTiming(); // Spigot this.methodProfiler.c("blockEntities"); -- 2.5.0