From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: TonytheMacaroni Date: Wed, 6 Sep 2023 19:24:53 -0400 Subject: [PATCH] Add predicate for blocks when raytracing diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java index 24eaf74420f6fbd4f0a0f13b719f57b50696aef3..9a473448427b48038e097796459ff0352f5a54cc 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java @@ -1686,6 +1686,27 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient @Nullable public RayTraceResult rayTraceEntities(@NotNull Location start, @NotNull Vector direction, double maxDistance, double raySize, @Nullable Predicate filter); + // Paper start + /** + * Performs a ray trace that checks for entity collisions. + *

+ * This may not consider entities in currently unloaded chunks. Some + * implementations may impose artificial restrictions on the maximum + * distance. + * + * @param start the start position + * @param direction the ray direction + * @param maxDistance the maximum distance + * @param raySize entity bounding boxes will be uniformly expanded (or + * shrinked) by this value before doing collision checks + * @param filter only entities that fulfill this predicate are considered, + * or null to consider all entities + * @return the closest ray trace hit result, or null if there + * is no hit + */ + @Nullable RayTraceResult rayTraceEntities(io.papermc.paper.math.@NotNull Position start, @NotNull Vector direction, double maxDistance, double raySize, @Nullable Predicate filter); + // Paper end + /** * Performs a ray trace that checks for block collisions using the blocks' * precise collision shapes. @@ -1749,6 +1770,34 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient @Nullable public RayTraceResult rayTraceBlocks(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks); + // Paper start + /** + * Performs a ray trace that checks for block collisions using the blocks' + * precise collision shapes. + *

+ * If collisions with passable blocks are ignored, fluid collisions are + * ignored as well regardless of the fluid collision mode. + *

+ * Portal blocks are only considered passable if the ray starts within + * them. Apart from that collisions with portal blocks will be considered + * even if collisions with passable blocks are otherwise ignored. + *

+ * This may cause loading of chunks! Some implementations may impose + * artificial restrictions on the maximum distance. + * + * @param start the start position + * @param direction the ray direction + * @param maxDistance the maximum distance + * @param fluidCollisionMode the fluid collision mode + * @param ignorePassableBlocks whether to ignore passable but collidable + * blocks (ex. tall grass, signs, fluids, ..) + * @param canCollide predicate for blocks the ray can potentially collide + * with, or null to consider all blocks + * @return the ray trace hit result, or null if there is no hit + */ + @Nullable RayTraceResult rayTraceBlocks(io.papermc.paper.math.@NotNull Position start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks, @Nullable Predicate canCollide); + // Paper end + /** * Performs a ray trace that checks for both block and entity collisions. *

@@ -1782,6 +1831,42 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient @Nullable public RayTraceResult rayTrace(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks, double raySize, @Nullable Predicate filter); + // Paper start + /** + * Performs a ray trace that checks for both block and entity collisions. + *

+ * Block collisions use the blocks' precise collision shapes. The + * raySize parameter is only taken into account for entity + * collision checks. + *

+ * If collisions with passable blocks are ignored, fluid collisions are + * ignored as well regardless of the fluid collision mode. + *

+ * Portal blocks are only considered passable if the ray starts within them. + * Apart from that collisions with portal blocks will be considered even if + * collisions with passable blocks are otherwise ignored. + *

+ * This may cause loading of chunks! Some implementations may impose + * artificial restrictions on the maximum distance. + * + * @param start the start position + * @param direction the ray direction + * @param maxDistance the maximum distance + * @param fluidCollisionMode the fluid collision mode + * @param ignorePassableBlocks whether to ignore passable but collidable + * blocks (ex. tall grass, signs, fluids, ..) + * @param raySize entity bounding boxes will be uniformly expanded (or + * shrinked) by this value before doing collision checks + * @param filter only entities that fulfill this predicate are considered, + * or null to consider all entities + * @param canCollide predicate for blocks the ray can potentially collide + * with, or null to consider all blocks + * @return the closest ray trace hit result with either a block or an + * entity, or null if there is no hit + */ + @Nullable RayTraceResult rayTrace(io.papermc.paper.math.@NotNull Position start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks, double raySize, @Nullable Predicate filter, @Nullable Predicate canCollide); + // Paper end + /** * Gets the default spawn {@link Location} of this world *