--- a/net/minecraft/world/level/IBlockAccess.java
+++ b/net/minecraft/world/level/IBlockAccess.java
@@ -26,7 +26,7 @@
     default <T extends TileEntity> Optional<T> getBlockEntity(BlockPosition blockposition, TileEntityTypes<T> tileentitytypes) {
         TileEntity tileentity = this.getBlockEntity(blockposition);
 
-        return tileentity != null && tileentity.getType() == tileentitytypes ? Optional.of(tileentity) : Optional.empty();
+        return tileentity != null && tileentity.getType() == tileentitytypes ? (Optional<T>) Optional.of(tileentity) : Optional.empty(); // CraftBukkit - decompile error
     }
 
     IBlockData getBlockState(BlockPosition blockposition);
@@ -58,8 +58,8 @@
         });
     }
 
-    default MovingObjectPositionBlock clip(RayTrace raytrace) {
-        return (MovingObjectPositionBlock) traverseBlocks(raytrace.getFrom(), raytrace.getTo(), raytrace, (raytrace1, blockposition) -> {
+    // CraftBukkit start - moved block handling into separate method for use by Block#rayTrace
+    default MovingObjectPositionBlock clip(RayTrace raytrace1, BlockPosition blockposition) {
             IBlockData iblockdata = this.getBlockState(blockposition);
             Fluid fluid = this.getFluidState(blockposition);
             Vec3D vec3d = raytrace1.getFrom();
@@ -72,6 +72,12 @@
             double d1 = movingobjectpositionblock1 == null ? Double.MAX_VALUE : raytrace1.getFrom().distanceToSqr(movingobjectpositionblock1.getLocation());
 
             return d0 <= d1 ? movingobjectpositionblock : movingobjectpositionblock1;
+    }
+    // CraftBukkit end
+
+    default MovingObjectPositionBlock clip(RayTrace raytrace) {
+        return (MovingObjectPositionBlock) traverseBlocks(raytrace.getFrom(), raytrace.getTo(), raytrace, (raytrace1, blockposition) -> {
+            return this.clip(raytrace1, blockposition); // CraftBukkit - moved into separate method
         }, (raytrace1) -> {
             Vec3D vec3d = raytrace1.getFrom().subtract(raytrace1.getTo());
 
@@ -144,7 +150,7 @@
                 double d13 = d10 * (i1 > 0 ? 1.0D - MathHelper.frac(d4) : MathHelper.frac(d4));
                 double d14 = d11 * (j1 > 0 ? 1.0D - MathHelper.frac(d5) : MathHelper.frac(d5));
 
-                Object object;
+                T object; // CraftBukkit - decompile error
 
                 do {
                     if (d12 > 1.0D && d13 > 1.0D && d14 > 1.0D) {
