|
25 | 25 | FluidState getFluidState(BlockPos pos);
|
26 | 26 |
|
27 | 27 | default int getLightEmission(BlockPos pos) {
|
28 |
| -@@ -66,19 +_,46 @@ |
| 28 | +@@ -66,10 +_,25 @@ |
29 | 29 | );
|
30 | 30 | }
|
31 | 31 |
|
32 | 32 | - default BlockHitResult clip(ClipContext context) {
|
33 | 33 | - return traverseBlocks(context.getFrom(), context.getTo(), context, (traverseContext, traversePos) -> {
|
34 | 34 | - BlockState blockState = this.getBlockState(traversePos);
|
35 | 35 | - FluidState fluidState = this.getFluidState(traversePos);
|
36 |
| -- Vec3 from = traverseContext.getFrom(); |
37 |
| -- Vec3 to = traverseContext.getTo(); |
38 |
| -- VoxelShape blockShape = traverseContext.getBlockShape(blockState, this, traversePos); |
39 | 36 | + // CraftBukkit start - moved block handling into separate method for use by Block#rayTrace
|
40 |
| -+ default BlockHitResult clip(ClipContext context, BlockPos traversePos) { |
| 37 | ++ default BlockHitResult clip(ClipContext traverseContext, BlockPos traversePos) { |
41 | 38 | + // Paper start - Add predicate for blocks when raytracing
|
42 |
| -+ return clip(context, traversePos, null); |
| 39 | ++ return clip(traverseContext, traversePos, null); |
43 | 40 | + }
|
44 | 41 | +
|
45 |
| -+ default BlockHitResult clip(ClipContext context, BlockPos traversePos, java.util.function.Predicate<? super org.bukkit.block.Block> canCollide) { |
| 42 | ++ default BlockHitResult clip(ClipContext traverseContext, BlockPos traversePos, java.util.function.Predicate<? super org.bukkit.block.Block> canCollide) { |
46 | 43 | + // Paper end - Add predicate for blocks when raytracing
|
47 | 44 | + // Paper start - Prevent raytrace from loading chunks
|
48 | 45 | + BlockState blockState = this.getBlockStateIfLoaded(traversePos);
|
49 | 46 | + if (blockState == null) {
|
50 | 47 | + // copied the last function parameter (listed below)
|
51 |
| -+ Vec3 vec3d = context.getFrom().subtract(context.getTo()); |
| 48 | ++ Vec3 vec3d = traverseContext.getFrom().subtract(traverseContext.getTo()); |
52 | 49 | +
|
53 |
| -+ return BlockHitResult.miss(context.getTo(), Direction.getApproximateNearest(vec3d.x, vec3d.y, vec3d.z), BlockPos.containing(context.getTo())); |
| 50 | ++ return BlockHitResult.miss(traverseContext.getTo(), Direction.getApproximateNearest(vec3d.x, vec3d.y, vec3d.z), BlockPos.containing(traverseContext.getTo())); |
54 | 51 | + }
|
55 | 52 | + // Paper end - Prevent raytrace from loading chunks
|
56 | 53 | + if (blockState.isAir() || (canCollide != null && this instanceof LevelAccessor levelAccessor && !canCollide.test(org.bukkit.craftbukkit.block.CraftBlock.at(levelAccessor, traversePos)))) return null; // Paper - Perf: optimise air cases & check canCollide predicate
|
57 | 54 | + FluidState fluidState = blockState.getFluidState(); // Paper - Perf: don't need to go to world state again
|
58 |
| -+ Vec3 from = context.getFrom(); |
59 |
| -+ Vec3 to = context.getTo(); |
60 |
| -+ VoxelShape blockShape = context.getBlockShape(blockState, this, traversePos); |
61 |
| - BlockHitResult blockHitResult = this.clipWithInteractionOverride(from, to, traversePos, blockShape, blockState); |
62 |
| -- VoxelShape fluidShape = traverseContext.getFluidShape(fluidState, this, traversePos); |
63 |
| -+ VoxelShape fluidShape = context.getFluidShape(fluidState, this, traversePos); |
64 |
| - BlockHitResult blockHitResult1 = fluidShape.clip(from, to, traversePos); |
65 |
| -- double d = blockHitResult == null ? Double.MAX_VALUE : traverseContext.getFrom().distanceToSqr(blockHitResult.getLocation()); |
66 |
| -- double d1 = blockHitResult1 == null ? Double.MAX_VALUE : traverseContext.getFrom().distanceToSqr(blockHitResult1.getLocation()); |
67 |
| -+ double d = blockHitResult == null ? Double.MAX_VALUE : context.getFrom().distanceToSqr(blockHitResult.getLocation()); |
68 |
| -+ double d1 = blockHitResult1 == null ? Double.MAX_VALUE : context.getFrom().distanceToSqr(blockHitResult1.getLocation()); |
| 55 | + Vec3 from = traverseContext.getFrom(); |
| 56 | + Vec3 to = traverseContext.getTo(); |
| 57 | + VoxelShape blockShape = traverseContext.getBlockShape(blockState, this, traversePos); |
| 58 | +@@ -79,6 +_,18 @@ |
| 59 | + double d = blockHitResult == null ? Double.MAX_VALUE : traverseContext.getFrom().distanceToSqr(blockHitResult.getLocation()); |
| 60 | + double d1 = blockHitResult1 == null ? Double.MAX_VALUE : traverseContext.getFrom().distanceToSqr(blockHitResult1.getLocation()); |
69 | 61 | return d <= d1 ? blockHitResult : blockHitResult1;
|
70 | 62 | + }
|
71 | 63 | + // CraftBukkit end
|
|
0 commit comments