From 12321d761e328bb867a6b9c3448adead166d3381 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Fri, 28 Aug 2020 12:33:47 -0700
Subject: [PATCH] Don't lookup fluid state when raytracing, skip air blocks

Just use the iblockdata already retrieved, removes a getType call.

Also save approx. 5% for the raytrace call, as most (expensive)
raytracing tends to go through air and returning early is an
easy win. The remaining problems with this function
are mostly with the block getting itself.
---
 .../net/minecraft/world/level/BlockGetter.java.patch  | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/paper-server/patches/sources/net/minecraft/world/level/BlockGetter.java.patch b/paper-server/patches/sources/net/minecraft/world/level/BlockGetter.java.patch
index 2047ce0c32..07f7382aca 100644
--- a/paper-server/patches/sources/net/minecraft/world/level/BlockGetter.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/level/BlockGetter.java.patch
@@ -30,13 +30,14 @@
      FluidState getFluidState(BlockPos pos);
  
      default int getLightEmission(BlockPos pos) {
-@@ -59,9 +69,17 @@
+@@ -59,10 +69,19 @@
          });
      }
  
 -    default BlockHitResult clip(ClipContext context) {
 -        return (BlockHitResult) BlockGetter.traverseBlocks(context.getFrom(), context.getTo(), context, (raytrace1, blockposition) -> {
 -            BlockState iblockdata = this.getBlockState(blockposition);
+-            FluidState fluid = this.getFluidState(blockposition);
 +    // CraftBukkit start - moved block handling into separate method for use by Block#rayTrace
 +    default BlockHitResult clip(ClipContext raytrace1, BlockPos blockposition) {
 +            // Paper start - Prevent raytrace from loading chunks
@@ -48,10 +49,12 @@
 +                return BlockHitResult.miss(raytrace1.getTo(), Direction.getApproximateNearest(vec3d.x, vec3d.y, vec3d.z), BlockPos.containing(raytrace1.getTo()));
 +            }
 +            // Paper end - Prevent raytrace from loading chunks
-             FluidState fluid = this.getFluidState(blockposition);
++            if (iblockdata.isAir()) return null; // Paper - Perf: optimise air cases
++            FluidState fluid = iblockdata.getFluidState(); // Paper - Perf: don't need to go to world state again
              Vec3 vec3d = raytrace1.getFrom();
              Vec3 vec3d1 = raytrace1.getTo();
-@@ -73,6 +91,12 @@
+             VoxelShape voxelshape = raytrace1.getBlockShape(iblockdata, this, blockposition);
+@@ -73,6 +92,12 @@
              double d1 = movingobjectpositionblock1 == null ? Double.MAX_VALUE : raytrace1.getFrom().distanceToSqr(movingobjectpositionblock1.getLocation());
  
              return d0 <= d1 ? movingobjectpositionblock : movingobjectpositionblock1;
@@ -64,7 +67,7 @@
          }, (raytrace1) -> {
              Vec3 vec3d = raytrace1.getFrom().subtract(raytrace1.getTo());
  
-@@ -145,7 +169,7 @@
+@@ -145,7 +170,7 @@
                  double d13 = d10 * (i1 > 0 ? 1.0D - Mth.frac(d4) : Mth.frac(d4));
                  double d14 = d11 * (j1 > 0 ? 1.0D - Mth.frac(d5) : Mth.frac(d5));