may help #284 Cleans up the lighting queue system, reducing diff and improving implementation. We no longer stop chunk unloads due to lighting updates, and instead simply flush the lighting queue. The cost of forcing the chunk (and its neighbors!) to stay loaded waiting for its lighting work to finish is much greater than simply taking the hit and doing the work. This change also helps reduce the diff and avoid bugs with missed diffs by removing duplicated logic. Also switches to a more effecient data structure (ArrayDeque instead of LinkedList) for the queue itself.
86 lines
3.3 KiB
Diff
86 lines
3.3 KiB
Diff
From acf9844949fec83fbc827beef334a584b9b28f2e 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 751e07d..c6fe888 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -119,9 +119,9 @@ 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);
|
|
public boolean aa;
|
|
- public int ab;
|
|
- public int ac;
|
|
- public int ad;
|
|
+ public int ab;public int getChunkX() { return ab; } // Paper
|
|
+ public int ac;public int getChunkY() { return ac; } // Paper
|
|
+ public int ad;public int getChunkZ() { return ad; } // Paper
|
|
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 b7f45b6..26352d2 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -31,6 +31,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;
|
|
@@ -61,11 +66,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();
|
|
@@ -1390,19 +1395,20 @@ public abstract class World implements IBlockAccess {
|
|
|
|
int j;
|
|
|
|
- for (i = 0; i < this.f.size(); ++i) {
|
|
- entity = (Entity) this.f.get(i);
|
|
- int k = entity.ab;
|
|
+ // Paper start - Set based removal lists
|
|
+ for (Entity e : this.f) {
|
|
+ j = e.getChunkX();
|
|
+ int k = e.getChunkZ();
|
|
|
|
- j = entity.ad;
|
|
- if (entity.aa && this.isChunkLoaded(k, j, true)) {
|
|
- this.getChunkAt(k, j).b(entity);
|
|
+ if (e.aa && this.isChunkLoaded(j, k, true)) {
|
|
+ this.getChunkAt(j, k).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.8.2
|
|
|