aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0615-Optimise-BlockSoil-nearby-water-lookup.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0615-Optimise-BlockSoil-nearby-water-lookup.patch')
-rw-r--r--patches/server/0615-Optimise-BlockSoil-nearby-water-lookup.patch52
1 files changed, 52 insertions, 0 deletions
diff --git a/patches/server/0615-Optimise-BlockSoil-nearby-water-lookup.patch b/patches/server/0615-Optimise-BlockSoil-nearby-water-lookup.patch
new file mode 100644
index 0000000000..81b199a243
--- /dev/null
+++ b/patches/server/0615-Optimise-BlockSoil-nearby-water-lookup.patch
@@ -0,0 +1,52 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Thu, 10 Jun 2021 14:36:00 -0700
+Subject: [PATCH] Optimise BlockSoil nearby water lookup
+
+Apparently the abstract block iteration was taking about
+75% of the method call.
+
+diff --git a/src/main/java/net/minecraft/world/level/block/FarmBlock.java b/src/main/java/net/minecraft/world/level/block/FarmBlock.java
+index 529f9f57249bd1ffa2698da76ffa9d4a284088db..d59e33e7326489c6d55d316d0130f22235f4c63c 100644
+--- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java
+@@ -152,19 +152,28 @@ public class FarmBlock extends Block {
+ }
+
+ private static boolean isNearWater(LevelReader world, BlockPos pos) {
+- Iterator iterator = BlockPos.betweenClosed(pos.offset(-4, 0, -4), pos.offset(4, 1, 4)).iterator();
+-
+- BlockPos blockposition1;
+-
+- do {
+- if (!iterator.hasNext()) {
+- return false;
++ // Paper start - Perf: remove abstract block iteration
++ int xOff = pos.getX();
++ int yOff = pos.getY();
++ int zOff = pos.getZ();
++
++ for (int dz = -4; dz <= 4; ++dz) {
++ int z = dz + zOff;
++ for (int dx = -4; dx <= 4; ++dx) {
++ int x = xOff + dx;
++ for (int dy = 0; dy <= 1; ++dy) {
++ int y = dy + yOff;
++ net.minecraft.world.level.chunk.LevelChunk chunk = (net.minecraft.world.level.chunk.LevelChunk)world.getChunk(x >> 4, z >> 4);
++ net.minecraft.world.level.material.FluidState fluid = chunk.getBlockStateFinal(x, y, z).getFluidState();
++ if (fluid.is(FluidTags.WATER)) {
++ return true;
++ }
++ }
+ }
++ }
+
+- blockposition1 = (BlockPos) iterator.next();
+- } while (!world.getFluidState(blockposition1).is(FluidTags.WATER));
+-
+- return true;
++ return false;
++ // Paper end - Perf: remove abstract block iteration
+ }
+
+ @Override