From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samsuik Date: Fri, 8 Nov 2024 19:35:49 +0000 Subject: [PATCH] Sakura: Optimise check inside blocks and traverse blocks Chunk cache is already removed from this patch, since we already have it in Leaf The JMH benchmark of this patch can be found in SunBox's `BetterBlocksTraverse` diff --git a/net/minecraft/world/entity/monster/Ghast.java b/net/minecraft/world/entity/monster/Ghast.java index 6f312f0b8ab60c839129ea671f2d9c128fa58e58..6ec83870c67810c7d0239ff7075549a93dc232eb 100644 --- a/net/minecraft/world/entity/monster/Ghast.java +++ b/net/minecraft/world/entity/monster/Ghast.java @@ -331,7 +331,7 @@ public class Ghast extends Mob implements Enemy { AABB boundingBox = this.ghast.getBoundingBox(); AABB aabb = boundingBox.move(delta); if (this.careful) { - for (BlockPos blockPos : BlockPos.betweenClosed(aabb.inflate(1.0))) { + for (BlockPos blockPos : org.dreeam.leaf.util.list.BlockPosIterator.iterable(aabb.inflate(1.0))) { // Leaf - Sakura - optimise check inside blocks if (!this.blockTraversalPossible(this.ghast.level(), null, null, blockPos, false, false)) { return false; } diff --git a/net/minecraft/world/entity/projectile/ThrowableProjectile.java b/net/minecraft/world/entity/projectile/ThrowableProjectile.java index 5104636be1de4bf1dc491673cad55854a106da53..4c61f4552dc64b1347c7b8dfe9502aac11c75888 100644 --- a/net/minecraft/world/entity/projectile/ThrowableProjectile.java +++ b/net/minecraft/world/entity/projectile/ThrowableProjectile.java @@ -93,7 +93,7 @@ public abstract class ThrowableProjectile extends Projectile { private void handleFirstTickBubbleColumn() { if (this.firstTick) { - for (BlockPos blockPos : BlockPos.betweenClosed(this.getBoundingBox())) { + for (BlockPos blockPos : org.dreeam.leaf.util.list.BlockPosIterator.iterable(this.getBoundingBox())) { // Leaf - Sakura - optimise check inside blocks BlockState blockState = this.level().getBlockState(blockPos); if (blockState.is(Blocks.BUBBLE_COLUMN)) { blockState.entityInside(this.level(), blockPos, this, InsideBlockEffectApplier.NOOP); diff --git a/net/minecraft/world/level/BlockGetter.java b/net/minecraft/world/level/BlockGetter.java index 2146efa860d8323a88f3ad365c0cdb66de42154a..eeddffbe6a47dc1a42c07f286bfec0cbde33fc17 100644 --- a/net/minecraft/world/level/BlockGetter.java +++ b/net/minecraft/world/level/BlockGetter.java @@ -215,7 +215,7 @@ public interface BlockGetter extends LevelHeightAccessor { static boolean forEachBlockIntersectedBetween(Vec3 from, Vec3 to, AABB boundingBox, BlockGetter.BlockStepVisitor visitor) { Vec3 vec3 = to.subtract(from); if (vec3.lengthSqr() < Mth.square(0.99999F)) { - for (BlockPos blockPos : BlockPos.betweenClosed(boundingBox)) { + for (BlockPos blockPos : org.dreeam.leaf.util.list.BlockPosIterator.iterable(boundingBox)) { // Leaf - Sakura - optimise check inside blocks if (!visitor.visit(blockPos, 0)) { return false; } @@ -223,6 +223,20 @@ public interface BlockGetter extends LevelHeightAccessor { return true; } else { + // Leaf start - Sakura - optimise check inside blocks + final boolean xZero = vec3.x() == 0.0; + final boolean yZero = vec3.y() == 0.0; + final boolean zZero = vec3.z() == 0.0; + if (xZero && yZero || yZero && zZero || xZero && zZero) { + int blockIndex = 0; + for (final BlockPos blockPos : org.dreeam.leaf.util.list.BlockPosIterator.traverseArea(vec3, boundingBox)) { + if (!visitor.visit(blockPos, blockIndex++)) { + return false; + } + } + return true; + } + // Leaf end - Sakura - optimise check inside blocks LongSet set = new LongOpenHashSet(); Vec3 minPosition = boundingBox.getMinPosition(); Vec3 vec31 = minPosition.subtract(vec3); @@ -230,7 +244,7 @@ public interface BlockGetter extends LevelHeightAccessor { if (i < 0) { return false; } else { - for (BlockPos blockPos1 : BlockPos.betweenClosed(boundingBox)) { + for (BlockPos blockPos1 : org.dreeam.leaf.util.list.BlockPosIterator.iterable(boundingBox)) { // Leaf - Sakura - optimise check inside blocks if (!set.contains(blockPos1.asLong()) && !visitor.visit(blockPos1, i + 1)) { return false; }