91 lines
3 KiB
Java
91 lines
3 KiB
Java
package net.minecraft.world.level;
|
|
|
|
import java.util.function.Predicate;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.tags.BlockTags;
|
|
import net.minecraft.tags.FluidTags;
|
|
import net.minecraft.world.entity.Entity;
|
|
import net.minecraft.world.level.block.state.BlockBehaviour;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.level.material.FluidState;
|
|
import net.minecraft.world.phys.Vec3;
|
|
import net.minecraft.world.phys.shapes.CollisionContext;
|
|
import net.minecraft.world.phys.shapes.Shapes;
|
|
import net.minecraft.world.phys.shapes.VoxelShape;
|
|
|
|
public class ClipContext {
|
|
private final Vec3 from;
|
|
private final Vec3 to;
|
|
private final ClipContext.Block block;
|
|
private final ClipContext.Fluid fluid;
|
|
private final CollisionContext collisionContext;
|
|
|
|
public ClipContext(Vec3 from, Vec3 to, ClipContext.Block block, ClipContext.Fluid fluid, Entity entity) {
|
|
this(from, to, block, fluid, CollisionContext.of(entity));
|
|
}
|
|
|
|
public ClipContext(Vec3 from, Vec3 to, ClipContext.Block block, ClipContext.Fluid fluid, CollisionContext collisionContext) {
|
|
this.from = from;
|
|
this.to = to;
|
|
this.block = block;
|
|
this.fluid = fluid;
|
|
this.collisionContext = collisionContext;
|
|
}
|
|
|
|
public Vec3 getTo() {
|
|
return this.to;
|
|
}
|
|
|
|
public Vec3 getFrom() {
|
|
return this.from;
|
|
}
|
|
|
|
public VoxelShape getBlockShape(BlockState blockState, BlockGetter level, BlockPos pos) {
|
|
return this.block.get(blockState, level, pos, this.collisionContext);
|
|
}
|
|
|
|
public VoxelShape getFluidShape(FluidState state, BlockGetter level, BlockPos pos) {
|
|
return this.fluid.canPick(state) ? state.getShape(level, pos) : Shapes.empty();
|
|
}
|
|
|
|
public static enum Block implements ClipContext.ShapeGetter {
|
|
COLLIDER(BlockBehaviour.BlockStateBase::getCollisionShape),
|
|
OUTLINE(BlockBehaviour.BlockStateBase::getShape),
|
|
VISUAL(BlockBehaviour.BlockStateBase::getVisualShape),
|
|
FALLDAMAGE_RESETTING(
|
|
(blockState, blockGetter, blockPos, collisionContext) -> blockState.is(BlockTags.FALL_DAMAGE_RESETTING) ? Shapes.block() : Shapes.empty()
|
|
);
|
|
|
|
private final ClipContext.ShapeGetter shapeGetter;
|
|
|
|
private Block(final ClipContext.ShapeGetter shapeGetter) {
|
|
this.shapeGetter = shapeGetter;
|
|
}
|
|
|
|
@Override
|
|
public VoxelShape get(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, CollisionContext collisionContext) {
|
|
return this.shapeGetter.get(blockState, blockGetter, blockPos, collisionContext);
|
|
}
|
|
}
|
|
|
|
public static enum Fluid {
|
|
NONE(fluidState -> false),
|
|
SOURCE_ONLY(FluidState::isSource),
|
|
ANY(fluidState -> !fluidState.isEmpty()),
|
|
WATER(fluidState -> fluidState.is(FluidTags.WATER));
|
|
|
|
private final Predicate<FluidState> canPick;
|
|
|
|
private Fluid(final Predicate<FluidState> canPick) {
|
|
this.canPick = canPick;
|
|
}
|
|
|
|
public boolean canPick(FluidState state) {
|
|
return this.canPick.test(state);
|
|
}
|
|
}
|
|
|
|
public interface ShapeGetter {
|
|
VoxelShape get(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, CollisionContext collisionContext);
|
|
}
|
|
}
|