diff --git a/patches/server/Optimize-ServerLevels-chunk-level-checking-methods.patch b/patches/server/Optimize-ServerLevels-chunk-level-checking-methods.patch new file mode 100644 index 0000000000..81488f2648 --- /dev/null +++ b/patches/server/Optimize-ServerLevels-chunk-level-checking-methods.patch @@ -0,0 +1,64 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Spottedleaf +Date: Thu, 16 Apr 2020 16:13:59 -0700 +Subject: [PATCH] Optimize ServerLevels chunk level checking methods + +These can be hot functions (i.e entity ticking and block ticking), +so inline where possible, and avoid the abstraction of the +Either class. + +diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/server/level/ServerLevel.java ++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java +@@ -0,0 +0,0 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl + public boolean isPositionTickingWithEntitiesLoaded(BlockPos blockposition) { + long i = ChunkPos.asLong(blockposition); + +- return this.chunkSource.isPositionTicking(i) && this.areEntitiesLoaded(i); ++ // Paper start - optimize is ticking ready type functions ++ ChunkHolder chunkHolder = this.chunkSource.chunkMap.getVisibleChunkIfPresent(i); ++ return chunkHolder != null && chunkHolder.isTickingReady() && this.areEntitiesLoaded(i); ++ // Paper end + } + + public boolean isPositionEntityTicking(BlockPos blockposition) { +- return this.entityManager.isPositionTicking(blockposition); ++ return this.entityManager.isPositionTicking(ChunkPos.asLong(blockposition)); // Paper + } + + public boolean isPositionEntityTicking(ChunkPos chunkcoordintpair) { +- return this.entityManager.isPositionTicking(chunkcoordintpair); ++ return this.entityManager.isPositionTicking(chunkcoordintpair.toLong()); // Paper + } + + private final class EntityCallbacks implements LevelCallback { +diff --git a/src/main/java/net/minecraft/world/level/ChunkPos.java b/src/main/java/net/minecraft/world/level/ChunkPos.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/world/level/ChunkPos.java ++++ b/src/main/java/net/minecraft/world/level/ChunkPos.java +@@ -0,0 +0,0 @@ public class ChunkPos { + } + + public static long asLong(BlockPos blockPos) { +- return asLong(SectionPos.blockToSectionCoord(blockPos.getX()), SectionPos.blockToSectionCoord(blockPos.getZ())); ++ return (((long)blockPos.getX() >> 4) & 4294967295L) | ((((long)blockPos.getZ() >> 4) & 4294967295L) << 32); // Paper - inline + } + + public static int getX(long pos) { +diff --git a/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java b/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java ++++ b/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java +@@ -0,0 +0,0 @@ public class PersistentEntitySectionManager implements A + public LevelEntityGetter getEntityGetter() { + return this.entityGetter; + } ++ // Paper start ++ public final boolean isPositionTicking(long position) { ++ return this.chunkVisibility.get(position).isTicking(); ++ } ++ // Paper end + + public boolean isPositionTicking(BlockPos blockPos) { + return this.chunkVisibility.get(ChunkPos.asLong(blockPos)).isTicking();