-
Notifications
You must be signed in to change notification settings - Fork 59
Expand file tree
/
Copy pathRayTracer.java
More file actions
92 lines (77 loc) · 3.75 KB
/
RayTracer.java
File metadata and controls
92 lines (77 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package codechicken.lib.raytracer;
import codechicken.lib.vec.Vector3;
import net.covers1624.quack.annotation.ReplaceWith;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.ClipContext;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.ForgeMod;
public class RayTracer {
@Deprecated (forRemoval = true, since = "1.18.2") // Unnecessarily specific level type.
public static BlockHitResult retraceBlock(LevelReader level, Player player, BlockPos pos) {
return retraceBlock((BlockGetter) level, player, pos);
}
public static BlockHitResult retraceBlock(BlockGetter level, Player player, BlockPos pos) {
Vec3 startVec = getStartVec(player);
Vec3 endVec = getEndVec(player);
BlockState state = level.getBlockState(pos);
VoxelShape baseShape = state.getShape(level, pos);
BlockHitResult baseTraceResult = baseShape.clip(startVec, endVec, pos);
if (baseTraceResult != null) {
BlockHitResult raytraceTraceShape = state.getVisualShape(level, pos, CollisionContext.of(player)).clip(startVec, endVec, pos);
if (raytraceTraceShape != null) {
return raytraceTraceShape;
}
}
return baseTraceResult;
}
public static BlockHitResult retrace(Player player) {
return retrace(player, ClipContext.Block.OUTLINE);
}
public static BlockHitResult retrace(Player player, ClipContext.Block blockMode) {
return retrace(player, player.getReachDistance(), blockMode, ClipContext.Fluid.NONE);
}
public static BlockHitResult retrace(Player player, ClipContext.Block blockMode, ClipContext.Fluid fluidMode) {
return retrace(player, player.getReachDistance(), blockMode, fluidMode);
}
public static BlockHitResult retrace(Player player, double reach, ClipContext.Block blockMode) {
return retrace(player, reach, blockMode, ClipContext.Fluid.NONE);
}
public static BlockHitResult retrace(Player player, double reach, ClipContext.Block blockMode, ClipContext.Fluid fluidMode) {
Vec3 startVec = getStartVec(player);
Vec3 endVec = getEndVec(player, reach);
return player.level.clip(new ClipContext(startVec, endVec, blockMode, fluidMode, player));
}
public static Vec3 getCorrectedHeadVec(Player player) {
Vector3 v = Vector3.fromEntity(player).add(0, player.getEyeHeight(), 0);
return v.vec3();
}
public static Vec3 getStartVec(Player player) {
return getCorrectedHeadVec(player);
}
@Deprecated // Replace with player.getReachDistance()
public static double getBlockReachDistance(Player player) {
return player.getReachDistance();
}
public static Vec3 getEndVec(Player player) {
Vec3 headVec = getCorrectedHeadVec(player);
Vec3 lookVec = player.getViewVector(1.0F);
double reach = player.getReachDistance();
return headVec.add(lookVec.x * reach, lookVec.y * reach, lookVec.z * reach);
}
public static Vec3 getEndVec(Player player, double reach) {
Vec3 headVec = getCorrectedHeadVec(player);
Vec3 lookVec = player.getViewVector(1.0F);
return headVec.add(lookVec.x * reach, lookVec.y * reach, lookVec.z * reach);
}
}