package net.minecraft.server; import java.util.function.Predicate; public class RayTrace { private final Vec3D a; private final Vec3D b; private final RayTrace.BlockCollisionOption c; private final RayTrace.FluidCollisionOption d; private final VoxelShapeCollision e; public RayTrace(Vec3D vec3d, Vec3D vec3d1, RayTrace.BlockCollisionOption raytrace_blockcollisionoption, RayTrace.FluidCollisionOption raytrace_fluidcollisionoption, Entity entity) { this.a = vec3d; this.b = vec3d1; this.c = raytrace_blockcollisionoption; this.d = raytrace_fluidcollisionoption; this.e = VoxelShapeCollision.a(entity); } public Vec3D a() { return this.b; } public Vec3D b() { return this.a; } public VoxelShape a(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) { return this.c.get(iblockdata, iblockaccess, blockposition, this.e); } public VoxelShape a(Fluid fluid, IBlockAccess iblockaccess, BlockPosition blockposition) { return this.d.a(fluid) ? fluid.d(iblockaccess, blockposition) : VoxelShapes.a(); } public static enum FluidCollisionOption { NONE((fluid) -> { return false; }), SOURCE_ONLY(Fluid::isSource), ANY((fluid) -> { return !fluid.isEmpty(); }); private final Predicate<Fluid> predicate; private FluidCollisionOption(Predicate predicate) { this.predicate = predicate; } public boolean a(Fluid fluid) { return this.predicate.test(fluid); } } public interface c { VoxelShape get(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition, VoxelShapeCollision voxelshapecollision); } public static enum BlockCollisionOption implements RayTrace.c { COLLIDER(IBlockData::b), OUTLINE(IBlockData::a); private final RayTrace.c c; private BlockCollisionOption(RayTrace.c raytrace_c) { this.c = raytrace_c; } @Override public VoxelShape get(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition, VoxelShapeCollision voxelshapecollision) { return this.c.get(iblockdata, iblockaccess, blockposition, voxelshapecollision); } } }