89 lines
2.7 KiB
Java
89 lines
2.7 KiB
Java
package net.minecraft.world.phys.shapes;
|
|
|
|
import java.util.function.Predicate;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.Direction;
|
|
import net.minecraft.world.entity.Entity;
|
|
import net.minecraft.world.entity.LivingEntity;
|
|
import net.minecraft.world.item.Item;
|
|
import net.minecraft.world.item.ItemStack;
|
|
import net.minecraft.world.level.CollisionGetter;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.level.material.FluidState;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
public class EntityCollisionContext implements CollisionContext {
|
|
protected static final CollisionContext EMPTY = new EntityCollisionContext(false, false, -Double.MAX_VALUE, ItemStack.EMPTY, fluidState -> false, null) {
|
|
@Override
|
|
public boolean isAbove(VoxelShape shape, BlockPos pos, boolean canAscend) {
|
|
return canAscend;
|
|
}
|
|
};
|
|
private final boolean descending;
|
|
private final double entityBottom;
|
|
private final boolean placement;
|
|
private final ItemStack heldItem;
|
|
private final Predicate<FluidState> canStandOnFluid;
|
|
@Nullable
|
|
private final Entity entity;
|
|
|
|
protected EntityCollisionContext(
|
|
boolean descending, boolean placement, double entityBottom, ItemStack heldItem, Predicate<FluidState> canStandOnFluid, @Nullable Entity entity
|
|
) {
|
|
this.descending = descending;
|
|
this.placement = placement;
|
|
this.entityBottom = entityBottom;
|
|
this.heldItem = heldItem;
|
|
this.canStandOnFluid = canStandOnFluid;
|
|
this.entity = entity;
|
|
}
|
|
|
|
@Deprecated
|
|
protected EntityCollisionContext(Entity entity, boolean canStandOnFluid, boolean placement) {
|
|
this(
|
|
entity.isDescending(),
|
|
placement,
|
|
entity.getY(),
|
|
entity instanceof LivingEntity livingEntityx ? livingEntityx.getMainHandItem() : ItemStack.EMPTY,
|
|
canStandOnFluid
|
|
? fluidState -> true
|
|
: (entity instanceof LivingEntity livingEntity ? fluidState -> livingEntity.canStandOnFluid(fluidState) : fluidState -> false),
|
|
entity
|
|
);
|
|
}
|
|
|
|
@Override
|
|
public boolean isHoldingItem(Item item) {
|
|
return this.heldItem.is(item);
|
|
}
|
|
|
|
@Override
|
|
public boolean canStandOnFluid(FluidState fluid1, FluidState fluid2) {
|
|
return this.canStandOnFluid.test(fluid2) && !fluid1.getType().isSame(fluid2.getType());
|
|
}
|
|
|
|
@Override
|
|
public VoxelShape getCollisionShape(BlockState state, CollisionGetter collisionGetter, BlockPos pos) {
|
|
return state.getCollisionShape(collisionGetter, pos, this);
|
|
}
|
|
|
|
@Override
|
|
public boolean isDescending() {
|
|
return this.descending;
|
|
}
|
|
|
|
@Override
|
|
public boolean isAbove(VoxelShape shape, BlockPos pos, boolean canAscend) {
|
|
return this.entityBottom > pos.getY() + shape.max(Direction.Axis.Y) - 1.0E-5F;
|
|
}
|
|
|
|
@Nullable
|
|
public Entity getEntity() {
|
|
return this.entity;
|
|
}
|
|
|
|
@Override
|
|
public boolean isPlacement() {
|
|
return this.placement;
|
|
}
|
|
}
|