aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0987-Optimize-isInWorldBounds-and-getBlockState-for-inlin.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0987-Optimize-isInWorldBounds-and-getBlockState-for-inlin.patch')
-rw-r--r--patches/server/0987-Optimize-isInWorldBounds-and-getBlockState-for-inlin.patch99
1 files changed, 99 insertions, 0 deletions
diff --git a/patches/server/0987-Optimize-isInWorldBounds-and-getBlockState-for-inlin.patch b/patches/server/0987-Optimize-isInWorldBounds-and-getBlockState-for-inlin.patch
new file mode 100644
index 0000000000..474f3d6165
--- /dev/null
+++ b/patches/server/0987-Optimize-isInWorldBounds-and-getBlockState-for-inlin.patch
@@ -0,0 +1,99 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+Date: Thu, 3 Mar 2016 02:07:55 -0600
+Subject: [PATCH] Optimize isInWorldBounds and getBlockState for inlining
+
+Hot methods, so reduce # of instructions for the method.
+
+Move is valid location test to the BlockPosition class so that it can access local variables.
+
+Replace all calls to the new place to the unnecessary forward.
+
+Optimize getType and getBlockData to manually inline and optimize the calls
+
+diff --git a/src/main/java/net/minecraft/core/Vec3i.java b/src/main/java/net/minecraft/core/Vec3i.java
+index 02367ef1371dde94ff6c4cd40bd32e800d6ccaaf..7b0fc7135bc107103dcaed6dc0707b1829928fae 100644
+--- a/src/main/java/net/minecraft/core/Vec3i.java
++++ b/src/main/java/net/minecraft/core/Vec3i.java
+@@ -28,6 +28,12 @@ public class Vec3i implements Comparable<Vec3i> {
+ );
+ }
+
++ // Paper start
++ public final boolean isInsideBuildHeightAndWorldBoundsHorizontal(net.minecraft.world.level.LevelHeightAccessor levelHeightAccessor) {
++ return getX() >= -30000000 && getZ() >= -30000000 && getX() < 30000000 && getZ() < 30000000 && !levelHeightAccessor.isOutsideBuildHeight(getY());
++ }
++ // Paper end
++
+ public Vec3i(int x, int y, int z) {
+ this.x = x;
+ this.y = y;
+diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
+index d3137c9e5cc42ef191ea233b0d37eafeffc6f82c..eb7df68d146f9e841bdf99fa2d85fb4b04e603ce 100644
+--- a/src/main/java/net/minecraft/world/level/Level.java
++++ b/src/main/java/net/minecraft/world/level/Level.java
+@@ -339,7 +339,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+ // Paper end
+
+ public boolean isInWorldBounds(BlockPos pos) {
+- return !this.isOutsideBuildHeight(pos) && Level.isInWorldBoundsHorizontal(pos);
++ return pos.isInsideBuildHeightAndWorldBoundsHorizontal(this); // Paper - use better/optimized check
+ }
+
+ public static boolean isInSpawnableBounds(BlockPos pos) {
+diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
+index 1f8c72b6c7d8683d67880fa175843c73b3d39b78..383dc47c81b3f34e8166bce180a51a2ccbfaf6ca 100644
+--- a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
++++ b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
+@@ -175,6 +175,7 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom
+ return GameEventListenerRegistry.NOOP;
+ }
+
++ public abstract BlockState getBlockState(final int x, final int y, final int z); // Paper
+ @Nullable
+ public abstract BlockState setBlockState(BlockPos pos, BlockState state, boolean moved);
+
+diff --git a/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java b/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java
+index aa5dee839d4c0dbc3c2abee9b501ec250c575cb3..6359d2d80f4c1360f8450bf6555ccfea3b69daa5 100644
+--- a/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java
++++ b/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java
+@@ -99,6 +99,12 @@ public class ImposterProtoChunk extends ProtoChunk {
+ public BlockState getBlockState(BlockPos pos) {
+ return this.wrapped.getBlockState(pos);
+ }
++ // Paper start
++ @Override
++ public final BlockState getBlockState(final int x, final int y, final int z) {
++ return this.wrapped.getBlockStateFinal(x, y, z);
++ }
++ // Paper end
+
+ @Override
+ public FluidState getFluidState(BlockPos pos) {
+diff --git a/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java b/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
+index 576ae0cb138b265c8a3995de7b5ebc827d50949d..bfdee41d3095a869408abc89a6085556ff188d8d 100644
+--- a/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
++++ b/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
+@@ -97,14 +97,18 @@ public class ProtoChunk extends ChunkAccess {
+
+ @Override
+ public BlockState getBlockState(BlockPos pos) {
+- int i = pos.getY();
+- if (this.isOutsideBuildHeight(i)) {
++ // Paper start
++ return getBlockState(pos.getX(), pos.getY(), pos.getZ());
++ }
++ public BlockState getBlockState(final int x, final int y, final int z) {
++ if (this.isOutsideBuildHeight(y)) {
+ return Blocks.VOID_AIR.defaultBlockState();
+ } else {
+- LevelChunkSection levelChunkSection = this.getSection(this.getSectionIndex(i));
+- return levelChunkSection.hasOnlyAir() ? Blocks.AIR.defaultBlockState() : levelChunkSection.getBlockState(pos.getX() & 15, i & 15, pos.getZ() & 15);
++ LevelChunkSection levelChunkSection = this.getSections()[this.getSectionIndex(y)];
++ return levelChunkSection.hasOnlyAir() ? Blocks.AIR.defaultBlockState() : levelChunkSection.getBlockState(x & 15, y & 15, z & 15);
+ }
+ }
++ // Paper end
+
+ @Override
+ public FluidState getFluidState(BlockPos pos) {