minecraft-src/net/minecraft/world/phys/shapes/EntityCollisionContext.java
2025-07-04 03:45:38 +03:00

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;
}
}