tutorial:pixel_raycast
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
tutorial:pixel_raycast [2020/08/14 17:06] – emmanuelmess | tutorial:pixel_raycast [2023/02/22 08:23] – Minor formatting fix redgrapefruit | ||
---|---|---|---|
Line 5: | Line 5: | ||
All of this is client side. | All of this is client side. | ||
- | There are two types, center pixel (crosshair) and arbitrary pixel. | + | There are two cases, center pixel (crosshair) and arbitrary pixel. |
===== Special case: Center pixel ===== | ===== Special case: Center pixel ===== | ||
Line 31: | Line 31: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | ==== For arbitrary reach ==== | ||
+ | |||
+ | The code above allows for the normal reach, 3 blocks for survival and 4.5 in creative. If you want the raycast to reach farther you need to use the general case below. | ||
===== General case: Arbitrary pixel ===== | ===== General case: Arbitrary pixel ===== | ||
+ | |||
+ | Example [[https:// | ||
For this one we need to precalculate a few things: | For this one we need to precalculate a few things: | ||
Line 73: | Line 79: | ||
Then you have this reimplementation of the code at GameRenderer# | Then you have this reimplementation of the code at GameRenderer# | ||
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | private static HitResult | + | private static HitResult |
Entity entity = client.getCameraEntity(); | Entity entity = client.getCameraEntity(); | ||
if (entity == null || client.world == null) { | if (entity == null || client.world == null) { | ||
Line 79: | Line 85: | ||
} | } | ||
- | double reachDistance = client.interactionManager.getReachDistance(); | + | double reachDistance = client.interactionManager.getReachDistance(); |
- | HitResult target = rayTrace(entity, reachDistance, | + | HitResult target = raycast(entity, reachDistance, |
boolean tooFar = false; | boolean tooFar = false; | ||
double extendedReach = reachDistance; | double extendedReach = reachDistance; | ||
if (client.interactionManager.hasExtendedReach()) { | if (client.interactionManager.hasExtendedReach()) { | ||
- | extendedReach = 6.0D; | + | extendedReach = 6.0D;//Change this to extend the reach |
reachDistance = extendedReach; | reachDistance = extendedReach; | ||
} else { | } else { | ||
Line 104: | Line 110: | ||
.stretch(entity.getRotationVec(1.0F).multiply(reachDistance)) | .stretch(entity.getRotationVec(1.0F).multiply(reachDistance)) | ||
.expand(1.0D, | .expand(1.0D, | ||
- | EntityHitResult entityHitResult = ProjectileUtil.rayTrace( | + | EntityHitResult entityHitResult = ProjectileUtil.raycast( |
entity, | entity, | ||
cameraPos, | cameraPos, | ||
Line 132: | Line 138: | ||
} | } | ||
- | private static HitResult | + | private static HitResult |
Entity entity, | Entity entity, | ||
double maxDistance, | double maxDistance, | ||
Line 140: | Line 146: | ||
) { | ) { | ||
Vec3d end = entity.getCameraPosVec(tickDelta).add(direction.multiply(maxDistance)); | Vec3d end = entity.getCameraPosVec(tickDelta).add(direction.multiply(maxDistance)); | ||
- | return entity.world.rayTrace(new RayTraceContext( | + | return entity.world.raycast(new RaycastContext( |
entity.getCameraPosVec(tickDelta), | entity.getCameraPosVec(tickDelta), | ||
end, | end, | ||
- | | + | |
- | includeFluids ? RayTraceContext.FluidHandling.ANY : RayTraceContext.FluidHandling.NONE, | + | includeFluids ? RaycastContext.FluidHandling.ANY : RaycastContext.FluidHandling.NONE, |
entity | entity | ||
)); | )); | ||
Line 150: | Line 156: | ||
</ | </ | ||
- | Once you have the direction and the raytracer, you can put them together: | + | Once you have the direction and the raycaster, you can put them together: |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
Vec3d direction = map( | Vec3d direction = map( | ||
Line 162: | Line 168: | ||
height | height | ||
); | ); | ||
- | HitResult hit = rayTraceInDirection(client, tickDelta, direction); | + | HitResult hit = raycastInDirection(client, tickDelta, direction); |
switch(hit.getType()) { | switch(hit.getType()) { | ||
Line 181: | Line 187: | ||
</ | </ | ||
- | Here x and y are you pixel coordinates. | + | Here x and y are your pixel coordinates. |
==== Performance considerations ==== | ==== Performance considerations ==== | ||
- | This is EXPENSIVE, if you do it too many times, it WILL get slow. | + | This is EXPENSIVE, if you do it too many times, it WILL get slow. Especially for long reaches. If you **need** to do many raycasts in a single frame, [[https:// |
tutorial/pixel_raycast.txt · Last modified: 2023/11/30 22:33 by famrofexl