222147db5d
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing
Bukkit Changes:
8ab814cd Add getFacing method to get the current cardinal direction an entity is facing.
CraftBukkit Changes:
ee5efeb0
Add getFacing method to get the current cardinal direction an entity is facing.
Spigot Changes:
0ede7d0e Rebuild patches
197 Zeilen
8.1 KiB
Diff
197 Zeilen
8.1 KiB
Diff
From adb1bf0b7b613b6d5da49bef66002db629bb0377 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Wed, 4 Jul 2018 02:10:36 -0400
|
|
Subject: [PATCH] Store reference to current Chunk for Entity and Block
|
|
Entities
|
|
|
|
This enables us a fast reference to the entities current chunk instead
|
|
of having to look it up by hashmap lookups.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
|
index b7c40d5ce6..238139c73a 100644
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
|
@@ -33,7 +33,7 @@ public class Chunk implements IChunkAccess {
|
|
private final BiomeBase[] f;
|
|
private final boolean[] g;
|
|
private final Map<BlockPosition, NBTTagCompound> h;
|
|
- private boolean i;
|
|
+ private boolean i;public boolean isLoaded() { return i; } // Paper - OBFHELPER
|
|
public final World world;
|
|
public final Map<HeightMap.Type, HeightMap> heightMap;
|
|
public final int locX;
|
|
@@ -62,7 +62,30 @@ public class Chunk implements IChunkAccess {
|
|
// CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking
|
|
private int neighbors = 0x1 << 12;
|
|
public long chunkKey;
|
|
+ // Paper start
|
|
+ private class TileEntityHashMap extends java.util.HashMap<BlockPosition, TileEntity> {
|
|
+ @Override
|
|
+ public TileEntity put(BlockPosition key, TileEntity value) {
|
|
+ TileEntity replaced = super.put(key, value);
|
|
+ if (replaced != null) {
|
|
+ replaced.setCurrentChunk(null);
|
|
+ }
|
|
+ if (value != null) {
|
|
+ value.setCurrentChunk(Chunk.this);
|
|
+ }
|
|
+ return replaced;
|
|
+ }
|
|
|
|
+ @Override
|
|
+ public TileEntity remove(Object key) {
|
|
+ TileEntity removed = super.remove(key);
|
|
+ if (removed != null) {
|
|
+ removed.setCurrentChunk(null);
|
|
+ }
|
|
+ return removed;
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
public boolean areNeighborsLoaded(final int radius) {
|
|
switch (radius) {
|
|
case 2:
|
|
@@ -93,7 +116,7 @@ public class Chunk implements IChunkAccess {
|
|
this.g = new boolean[256];
|
|
this.h = Maps.newHashMap();
|
|
this.heightMap = Maps.newHashMap();
|
|
- this.tileEntities = Maps.newHashMap();
|
|
+ this.tileEntities = new TileEntityHashMap(); // Paper
|
|
this.p = Maps.newHashMap();
|
|
this.q = Maps.newHashMap();
|
|
this.r = new ShortList[16];
|
|
@@ -652,6 +675,9 @@ public class Chunk implements IChunkAccess {
|
|
entity.af = k;
|
|
entity.ag = this.locZ;
|
|
this.entitySlices[k].add(entity);
|
|
+ // Paper start
|
|
+ entity.setCurrentChunk(this);
|
|
+ // Paper end
|
|
}
|
|
|
|
public void a(HeightMap.Type heightmap_type, long[] along) {
|
|
@@ -670,8 +696,12 @@ public class Chunk implements IChunkAccess {
|
|
if (i >= this.entitySlices.length) {
|
|
i = this.entitySlices.length - 1;
|
|
}
|
|
-
|
|
- this.entitySlices[i].remove(entity);
|
|
+ // Paper start
|
|
+ if (!this.entitySlices[i].remove(entity)) {
|
|
+ return;
|
|
+ }
|
|
+ entity.setCurrentChunk(null);
|
|
+ // Paper end
|
|
}
|
|
|
|
public boolean c(BlockPosition blockposition) {
|
|
@@ -837,6 +867,7 @@ public class Chunk implements IChunkAccess {
|
|
}
|
|
}
|
|
// Spigot End
|
|
+ entity.setCurrentChunk(null); // Paper
|
|
|
|
// Do not pass along players, as doing so can get them stuck outside of time.
|
|
// (which for example disables inventory icon updates and prevents block breaking)
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 044f7b5aa0..591ae114cf 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -134,7 +134,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
private static final DataWatcherObject<Boolean> aF = DataWatcher.a(Entity.class, DataWatcherRegistry.i);
|
|
private static final DataWatcherObject<Boolean> aG = DataWatcher.a(Entity.class, DataWatcherRegistry.i);
|
|
private static final DataWatcherObject<Boolean> aH = DataWatcher.a(Entity.class, DataWatcherRegistry.i);
|
|
- public boolean inChunk;
|
|
+ public boolean inChunk; public boolean isAddedToChunk() { return inChunk; } // Paper - OBFHELPER
|
|
public int ae; public int getChunkX() { return ae; } // Paper - OBFHELPER
|
|
public int af; public int getChunkY() { return af; } // Paper - OBFHELPER
|
|
public int ag; public int getChunkZ() { return ag; } // Paper - OBFHELPER
|
|
@@ -1759,6 +1759,39 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
}
|
|
|
|
// Paper start
|
|
+ private java.lang.ref.WeakReference<Chunk> currentChunk = null;
|
|
+
|
|
+ public void setCurrentChunk(Chunk chunk) {
|
|
+ this.currentChunk = chunk != null ? new java.lang.ref.WeakReference<>(chunk) : null;
|
|
+ }
|
|
+ /**
|
|
+ * Returns the entities current registered chunk. If the entity is not added to a chunk yet, it will return null
|
|
+ */
|
|
+ public Chunk getCurrentChunk() {
|
|
+ final Chunk chunk = currentChunk != null ? currentChunk.get() : null;
|
|
+ return chunk != null && chunk.isLoaded() ? chunk : (isAddedToChunk() ? world.getChunkIfLoaded(getChunkX(), getChunkZ()) : null);
|
|
+ }
|
|
+ /**
|
|
+ * Returns the chunk at the location, using the entities local cache if avail
|
|
+ * Will only return null if the location specified is not loaded
|
|
+ */
|
|
+ public Chunk getCurrentChunkAt(int x, int z) {
|
|
+ if (getChunkX() == x && getChunkZ() == z) {
|
|
+ Chunk chunk = getCurrentChunk();
|
|
+ if (chunk != null) {
|
|
+ return chunk;
|
|
+ }
|
|
+ }
|
|
+ return world.getChunkIfLoaded(x, z);
|
|
+ }
|
|
+ /**
|
|
+ * Returns the chunk at the entities current location, using the entities local cache if avail
|
|
+ * Will only return null if the location specified is not loaded
|
|
+ */
|
|
+ public Chunk getChunkAtLocation() {
|
|
+ return getCurrentChunkAt((int)Math.floor(locX) >> 4, (int)Math.floor(locZ) >> 4);
|
|
+ }
|
|
+
|
|
private MinecraftKey entityKey;
|
|
private String entityKeyString;
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java
|
|
index 7390061bf0..c69209497b 100644
|
|
--- a/src/main/java/net/minecraft/server/TileEntity.java
|
|
+++ b/src/main/java/net/minecraft/server/TileEntity.java
|
|
@@ -41,6 +41,15 @@ public abstract class TileEntity implements KeyedObject { // Paper
|
|
getMinecraftKey(); // Try to load if it doesn't exists.
|
|
return tileEntityKeyString;
|
|
}
|
|
+
|
|
+ private java.lang.ref.WeakReference<Chunk> currentChunk = null;
|
|
+ public Chunk getCurrentChunk() {
|
|
+ final Chunk chunk = currentChunk != null ? currentChunk.get() : null;
|
|
+ return chunk != null && chunk.isLoaded() ? chunk : null;
|
|
+ }
|
|
+ public void setCurrentChunk(Chunk chunk) {
|
|
+ this.currentChunk = chunk != null ? new java.lang.ref.WeakReference<>(chunk) : null;
|
|
+ }
|
|
// Paper end
|
|
|
|
@Nullable
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
index 5cce3644d0..7a204e8edf 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
@@ -9,6 +9,7 @@ import java.util.UUID;
|
|
|
|
import net.minecraft.server.*;
|
|
|
|
+import org.bukkit.Chunk;
|
|
import org.bukkit.EntityEffect;
|
|
import org.bukkit.Location;
|
|
import org.bukkit.Server;
|
|
@@ -42,6 +43,12 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
|
this.entity = entity;
|
|
}
|
|
|
|
+ @Override
|
|
+ public Chunk getChunk() {
|
|
+ net.minecraft.server.Chunk currentChunk = entity.getCurrentChunk();
|
|
+ return currentChunk != null ? currentChunk.bukkitChunk : getLocation().getChunk();
|
|
+ }
|
|
+
|
|
public static CraftEntity getEntity(CraftServer server, Entity entity) {
|
|
/**
|
|
* Order is *EXTREMELY* important -- keep it right! =D
|
|
--
|
|
2.18.0
|
|
|