下面列出了怎么用org.bukkit.util.RayTraceResult的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* Get to know where the {@link Vector} intersects with a {@link org.bukkit.block.Block}.
* Non-Occluding {@link Block}s as defined in {@link BlockUtils#isReallyOccluding(Material)} are ignored.
*
* @param start the starting {@link Location}
* @param direction the {@link Vector} which should be checked
*
* @return The length when the {@link Vector} intersects or 0 if no intersection was found
*/
public static double getDistanceToFirstIntersectionWithBlock(final Location start, final Vector direction)
{
final int length = (int) Math.floor(direction.length());
Preconditions.checkNotNull(start.getWorld(), "RayTrace: Unknown start world.");
if (length >= 1) {
if (RAY_TRACING) {
RayTraceResult result = start.getWorld().rayTraceBlocks(start, direction, length, FluidCollisionMode.NEVER, true);
// Hit nothing or the other player
if (result == null || result.getHitBlock() == null) {
return 0;
}
return start.toVector().distance(result.getHitPosition());
} else {
try {
final BlockIterator blockIterator = new BlockIterator(start.getWorld(), start.toVector(), direction, 0, length);
Block block;
while (blockIterator.hasNext()) {
block = blockIterator.next();
// Account for a Spigot bug: BARRIER and MOB_SPAWNER are not occluding blocks
if (BlockUtils.isReallyOccluding(block.getType())) {
// Use the middle location of the Block instead of the simple location.
return block.getLocation().clone().add(0.5, 0.5, 0.5).distance(start);
}
}
} catch (IllegalStateException exception) {
// Just in case the start block could not be found for some reason or a chunk is loaded async.
return 0;
}
}
}
return 0;
}
@Override
public RayTraceResult rayTrace(Location location, Vector vector, double v, FluidCollisionMode fluidCollisionMode) {
return null;
}
@Override
public RayTraceResult rayTrace(Location location, Vector vector, double v, FluidCollisionMode fluidCollisionMode) {
return null;
}
@Override
public RayTraceResult rayTraceEntities(Location location, Vector vector, double v) {
return null;
}
@Override
public RayTraceResult rayTraceEntities(Location location, Vector vector, double v, double v1) {
return null;
}
@Override
public RayTraceResult rayTraceEntities(Location location, Vector vector, double v, Predicate<Entity> predicate) {
return null;
}
@Override
public RayTraceResult rayTraceEntities(Location location, Vector vector, double v, double v1, Predicate<Entity> predicate) {
return null;
}
@Override
public RayTraceResult rayTraceBlocks(Location location, Vector vector, double v) {
return null;
}
@Override
public RayTraceResult rayTraceBlocks(Location location, Vector vector, double v, FluidCollisionMode fluidCollisionMode) {
return null;
}
@Override
public RayTraceResult rayTraceBlocks(Location location, Vector vector, double v, FluidCollisionMode fluidCollisionMode, boolean b) {
return null;
}
@Override
public RayTraceResult rayTrace(Location location, Vector vector, double v, FluidCollisionMode fluidCollisionMode, boolean b, double v1, Predicate<Entity> predicate) {
return null;
}
@Nullable
@Override
public RayTraceResult rayTrace(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode) {
return b.rayTrace(start, direction, maxDistance, fluidCollisionMode);
}
@Nullable
@Override
public RayTraceResult rayTrace(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode) {
return state.getBlock().rayTrace(start, direction, maxDistance, fluidCollisionMode);
}