mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-30 16:19:03 +01:00
2df786eb1f
In many places where we simply want the current chunk the entity is in, instead of doing a hashmap lookup for it, we now have access to the object directly on the Entity/TileEntity object we can directly grab. Use that local value instead to reduce lookups in many hot places.
114 lines
No EOL
5.2 KiB
Diff
114 lines
No EOL
5.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Wed, 4 Jul 2018 03:39:51 -0400
|
|
Subject: [PATCH] Avoid Chunk Lookups for Entity/TileEntity Current Chunk
|
|
|
|
In many places where we simply want the current chunk the entity
|
|
is in, instead of doing a hashmap lookup for it, we now have access
|
|
to the object directly on the Entity/TileEntity object we can directly grab.
|
|
|
|
Use that local value instead to reduce lookups in many hot places.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
|
index 71d0db3f3..a51b648c5 100644
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
|
@@ -0,0 +0,0 @@ public class Chunk {
|
|
// Spigot end
|
|
}
|
|
|
|
+ public void removeEntity(Entity entity) { b(entity); } // Paper - OBFHELPER
|
|
public void b(Entity entity) {
|
|
this.a(entity, entity.ac);
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index c0816b9f8..36818bf55 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess {
|
|
int j;
|
|
// Paper start - Set based removal lists
|
|
for (Entity e : this.f) {
|
|
+ /*
|
|
j = e.getChunkZ();
|
|
int k = e.getChunkX();
|
|
|
|
if (e.isAddedToChunk() && this.isChunkLoaded(k, j, true)) {
|
|
this.getChunkAt(k, j).b(e);
|
|
- }
|
|
+ }*/
|
|
+ Chunk chunk = e.getCurrentChunk();
|
|
+ if (chunk != null) chunk.removeEntity(e);
|
|
}
|
|
|
|
for (Entity e : this.f) {
|
|
@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess {
|
|
this.methodProfiler.b();
|
|
this.methodProfiler.a("remove");
|
|
if (entity.dead) {
|
|
+ // Paper start
|
|
+ /*
|
|
j = entity.ab;
|
|
int l = entity.ad;
|
|
|
|
- if (entity.aa && this.isChunkLoaded(j, l, true)) {
|
|
+ /*if (entity.aa && this.isChunkLoaded(j, l, true)) {
|
|
this.getChunkAt(j, l).b(entity);
|
|
- }
|
|
+ }*/
|
|
+ Chunk chunk = entity.getCurrentChunk();
|
|
+ if (chunk != null) chunk.removeEntity(entity);
|
|
+ // Paper end
|
|
|
|
guardEntityList = false; // Spigot
|
|
this.entityList.remove(this.tickPosition--); // CraftBukkit - Use field for loop variable
|
|
@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess {
|
|
BlockPosition blockposition = tileentity.getPosition();
|
|
|
|
// Paper start - Skip ticking in chunks scheduled for unload
|
|
- net.minecraft.server.Chunk chunk = this.getChunkIfLoaded(blockposition);
|
|
+ net.minecraft.server.Chunk chunk = tileentity.getCurrentChunk();
|
|
boolean shouldTick = chunk != null;
|
|
if(this.paperConfig.skipEntityTickingInChunksScheduledForUnload)
|
|
shouldTick = shouldTick && !chunk.isUnloading() && chunk.scheduledForUnload == null;
|
|
@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess {
|
|
tilesThisCycle--;
|
|
this.tileEntityListTick.remove(tileTickPosition--);
|
|
//this.tileEntityList.remove(tileentity); // Paper - remove unused list
|
|
- if (this.isLoaded(tileentity.getPosition())) {
|
|
+ // Paper start
|
|
+ net.minecraft.server.Chunk chunk = tileentity.getCurrentChunk();
|
|
+ if (chunk != null) {
|
|
+ // Paper end
|
|
this.getChunkAtWorldCoords(tileentity.getPosition()).d(tileentity.getPosition());
|
|
}
|
|
}
|
|
@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess {
|
|
}
|
|
// CraftBukkit end */
|
|
|
|
- if (this.isLoaded(tileentity1.getPosition())) {
|
|
- Chunk chunk = this.getChunkAtWorldCoords(tileentity1.getPosition());
|
|
+ // Paper
|
|
+ net.minecraft.server.Chunk chunk = tileentity1.getCurrentChunk();
|
|
+ if (chunk != null) {
|
|
+ //Chunk chunk = this.getChunkAtWorldCoords(tileentity1.getPosition());
|
|
+ // Paper end
|
|
IBlockData iblockdata = chunk.getBlockData(tileentity1.getPosition());
|
|
|
|
chunk.a(tileentity1.getPosition(), tileentity1);
|
|
@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess {
|
|
int k = MathHelper.floor(entity.locZ / 16.0D);
|
|
|
|
if (!entity.aa || entity.ab != i || entity.ac != j || entity.ad != k) {
|
|
- if (entity.aa && this.isChunkLoaded(entity.ab, entity.ad, true)) {
|
|
- this.getChunkAt(entity.ab, entity.ad).a(entity, entity.ac);
|
|
+ // Paper start
|
|
+ Chunk currentChunk = entity.getCurrentChunk();
|
|
+ if (entity.aa && currentChunk != null) {
|
|
+ currentChunk.removeEntity(entity);
|
|
+ // Paper end
|
|
}
|
|
|
|
if (!entity.bD() && !this.isChunkLoaded(i, k, true)) {
|
|
--
|