974b0afca9
CraftBukkit removed their implementation that caused this issue, switching to Mojang's implementation which doesn't appear to share it. I already removed the important bit in the last upstream merge, this is just unused and unnecessary now. So we remove it.
88 lines
3.6 KiB
Diff
88 lines
3.6 KiB
Diff
From 19528dbbeee2a72cb791ff414a47e84fd9e30efb Mon Sep 17 00:00:00 2001
|
|
From: Joseph Hirschfeld <joe@ibj.io>
|
|
Date: Thu, 3 Mar 2016 02:39:54 -0600
|
|
Subject: [PATCH] Change implementation of (tile)entity removal list
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 7feed2995..5b5e0e73c 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -121,10 +121,10 @@ public abstract class Entity implements ICommandListener {
|
|
private static final DataWatcherObject<Boolean> aB = DataWatcher.a(Entity.class, DataWatcherRegistry.h);
|
|
private static final DataWatcherObject<Boolean> aC = DataWatcher.a(Entity.class, DataWatcherRegistry.h);
|
|
private static final DataWatcherObject<Boolean> aD = DataWatcher.a(Entity.class, DataWatcherRegistry.h);
|
|
- public boolean aa;
|
|
- public int ab;
|
|
- public int ac;
|
|
- public int ad;
|
|
+ public boolean aa; public boolean isAddedToChunk() { return aa; } // Paper - OBFHELPER
|
|
+ public int ab; public int getChunkX() { return ab; } // Paper - OBFHELPER
|
|
+ public int ac; public int getChunkY() { return ac; } // Paper - OBFHELPER
|
|
+ public int ad; public int getChunkZ() { return ad; } // Paper - OBFHELPER
|
|
public boolean ah;
|
|
public boolean impulse;
|
|
public int portalCooldown;
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index a1cdcd71b..354a7309b 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -30,6 +30,11 @@ import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
|
|
import org.bukkit.generator.ChunkGenerator;
|
|
// CraftBukkit end
|
|
|
|
+// Paper start
|
|
+import java.util.Set;
|
|
+import com.google.common.collect.Sets;
|
|
+// Paper end
|
|
+
|
|
public abstract class World implements IBlockAccess {
|
|
|
|
private int a = 63;
|
|
@@ -60,11 +65,11 @@ public abstract class World implements IBlockAccess {
|
|
}
|
|
};
|
|
// Spigot end
|
|
- protected final List<Entity> f = Lists.newArrayList();
|
|
+ protected final Set<Entity> f = Sets.newHashSet(); // Paper
|
|
public final List<TileEntity> tileEntityList = Lists.newArrayList();
|
|
public final List<TileEntity> tileEntityListTick = Lists.newArrayList();
|
|
private final List<TileEntity> b = Lists.newArrayList();
|
|
- private final List<TileEntity> tileEntityListUnload = Lists.newArrayList();
|
|
+ private final Set<TileEntity> tileEntityListUnload = Sets.newHashSet(); // Paper
|
|
public final List<EntityHuman> players = Lists.newArrayList();
|
|
public final List<Entity> j = Lists.newArrayList();
|
|
protected final IntHashMap<Entity> entitiesById = new IntHashMap();
|
|
@@ -1394,20 +1399,20 @@ public abstract class World implements IBlockAccess {
|
|
this.entityList.removeAll(this.f);
|
|
|
|
int j;
|
|
+ // Paper start - Set based removal lists
|
|
+ for (Entity e : this.f) {
|
|
+ j = e.getChunkZ();
|
|
+ int k = e.getChunkX();
|
|
|
|
- for (i = 0; i < this.f.size(); ++i) {
|
|
- entity = (Entity) this.f.get(i);
|
|
- int k = entity.ab;
|
|
-
|
|
- j = entity.ad;
|
|
- if (entity.aa && this.isChunkLoaded(k, j, true)) {
|
|
- this.getChunkAt(k, j).b(entity);
|
|
+ if (e.isAddedToChunk() && this.isChunkLoaded(k, j, true)) {
|
|
+ this.getChunkAt(k, j).b(e);
|
|
}
|
|
}
|
|
|
|
- for (i = 0; i < this.f.size(); ++i) {
|
|
- this.c((Entity) this.f.get(i));
|
|
+ for (Entity e : this.f) {
|
|
+ this.c(e);
|
|
}
|
|
+ // Paper end
|
|
|
|
this.f.clear();
|
|
this.l();
|
|
--
|
|
2.12.2.windows.2
|
|
|