From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Spottedleaf 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