Add RayTraceConfigurationBuilder (#11907)
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
package io.papermc.paper.raytracing;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import java.util.EnumSet;
|
||||
import java.util.OptionalDouble;
|
||||
import java.util.function.Predicate;
|
||||
import org.bukkit.FluidCollisionMode;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.util.Vector;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
import org.jspecify.annotations.Nullable;
|
||||
|
||||
@NullMarked
|
||||
public class PositionedRayTraceConfigurationBuilderImpl implements PositionedRayTraceConfigurationBuilder {
|
||||
|
||||
public @Nullable Location start;
|
||||
public @Nullable Vector direction;
|
||||
public OptionalDouble maxDistance = OptionalDouble.empty();
|
||||
public FluidCollisionMode fluidCollisionMode = FluidCollisionMode.NEVER;
|
||||
public boolean ignorePassableBlocks;
|
||||
public double raySize = 0.0D;
|
||||
public @Nullable Predicate<? super Entity> entityFilter;
|
||||
public @Nullable Predicate<? super Block> blockFilter;
|
||||
public EnumSet<RayTraceTarget> targets = EnumSet.noneOf(RayTraceTarget.class);
|
||||
|
||||
@Override
|
||||
public PositionedRayTraceConfigurationBuilder start(final Location start) {
|
||||
Preconditions.checkArgument(start != null, "start must not be null");
|
||||
this.start = start.clone();
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedRayTraceConfigurationBuilder direction(final Vector direction) {
|
||||
Preconditions.checkArgument(direction != null, "direction must not be null");
|
||||
this.direction = direction.clone();
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedRayTraceConfigurationBuilder maxDistance(final double maxDistance) {
|
||||
Preconditions.checkArgument(maxDistance >= 0, "maxDistance must be non-negative");
|
||||
this.maxDistance = OptionalDouble.of(maxDistance);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedRayTraceConfigurationBuilder fluidCollisionMode(final FluidCollisionMode fluidCollisionMode) {
|
||||
Preconditions.checkArgument(fluidCollisionMode != null, "fluidCollisionMode must not be null");
|
||||
this.fluidCollisionMode = fluidCollisionMode;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedRayTraceConfigurationBuilder ignorePassableBlocks(final boolean ignorePassableBlocks) {
|
||||
this.ignorePassableBlocks = ignorePassableBlocks;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedRayTraceConfigurationBuilder raySize(final double raySize) {
|
||||
Preconditions.checkArgument(raySize >= 0, "raySize must be non-negative");
|
||||
this.raySize = raySize;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedRayTraceConfigurationBuilder entityFilter(final Predicate<? super Entity> entityFilter) {
|
||||
Preconditions.checkArgument(entityFilter != null, "entityFilter must not be null");
|
||||
this.entityFilter = entityFilter;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedRayTraceConfigurationBuilder blockFilter(final Predicate<? super Block> blockFilter) {
|
||||
Preconditions.checkArgument(blockFilter != null, "blockFilter must not be null");
|
||||
this.blockFilter = blockFilter;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedRayTraceConfigurationBuilder targets(final RayTraceTarget first, final RayTraceTarget... others) {
|
||||
Preconditions.checkArgument(first != null, "first must not be null");
|
||||
Preconditions.checkArgument(others != null, "others must not be null");
|
||||
this.targets = EnumSet.of(first, others);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -6,9 +6,12 @@ import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
import io.papermc.paper.FeatureHooks;
|
||||
import io.papermc.paper.raytracing.RayTraceTarget;
|
||||
import io.papermc.paper.registry.RegistryAccess;
|
||||
import io.papermc.paper.registry.RegistryKey;
|
||||
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
||||
import io.papermc.paper.raytracing.PositionedRayTraceConfigurationBuilder;
|
||||
import io.papermc.paper.raytracing.PositionedRayTraceConfigurationBuilderImpl;
|
||||
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
@@ -1248,6 +1251,26 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
||||
return blockHit;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RayTraceResult rayTrace(Consumer<PositionedRayTraceConfigurationBuilder> builderConsumer) {
|
||||
PositionedRayTraceConfigurationBuilderImpl builder = new PositionedRayTraceConfigurationBuilderImpl();
|
||||
|
||||
builderConsumer.accept(builder);
|
||||
Preconditions.checkArgument(builder.start != null, "Start location cannot be null");
|
||||
Preconditions.checkArgument(builder.direction != null, "Direction vector cannot be null");
|
||||
Preconditions.checkArgument(builder.maxDistance.isPresent(), "Max distance must be set");
|
||||
Preconditions.checkArgument(!builder.targets.isEmpty(), "At least one target");
|
||||
|
||||
final double maxDistance = builder.maxDistance.getAsDouble();
|
||||
if (builder.targets.contains(RayTraceTarget.ENTITY)) {
|
||||
if (builder.targets.contains(RayTraceTarget.BLOCK)) {
|
||||
return this.rayTrace(builder.start, builder.direction, maxDistance, builder.fluidCollisionMode, builder.ignorePassableBlocks, builder.raySize, builder.entityFilter, builder.blockFilter);
|
||||
}
|
||||
return this.rayTraceEntities(builder.start, builder.direction, maxDistance, builder.raySize, builder.entityFilter);
|
||||
}
|
||||
return this.rayTraceBlocks(builder.start, builder.direction, maxDistance, builder.fluidCollisionMode, builder.ignorePassableBlocks, builder.blockFilter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Player> getPlayers() {
|
||||
List<Player> list = new ArrayList<Player>(this.world.players().size());
|
||||
|
||||
Reference in New Issue
Block a user