minecraft-src/net/minecraft/world/phys/shapes/CollisionContext.java
2025-09-18 12:27:44 +00:00

68 lines
2.4 KiB
Java

package net.minecraft.world.phys.shapes;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
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 interface CollisionContext {
static CollisionContext empty() {
return EntityCollisionContext.EMPTY;
}
static CollisionContext of(Entity entity) {
return (CollisionContext)(switch (entity) {
case AbstractMinecart abstractMinecart -> AbstractMinecart.useExperimentalMovement(abstractMinecart.level())
? new MinecartCollisionContext(abstractMinecart, false)
: new EntityCollisionContext(entity, false, false);
default -> new EntityCollisionContext(entity, false, false);
});
}
static CollisionContext of(Entity entity, boolean canStandOnFluid) {
return new EntityCollisionContext(entity, canStandOnFluid, false);
}
static CollisionContext placementContext(@Nullable Player player) {
return new EntityCollisionContext(
player != null ? player.isDescending() : false,
true,
player != null ? player.getY() : -Double.MAX_VALUE,
player instanceof LivingEntity ? player.getMainHandItem() : ItemStack.EMPTY,
player instanceof LivingEntity ? fluidState -> player.canStandOnFluid(fluidState) : fluidState -> false,
player
);
}
static CollisionContext withPosition(@Nullable Entity entity, double bottom) {
return new EntityCollisionContext(
entity != null ? entity.isDescending() : false,
true,
entity != null ? bottom : -Double.MAX_VALUE,
entity instanceof LivingEntity livingEntityx ? livingEntityx.getMainHandItem() : ItemStack.EMPTY,
entity instanceof LivingEntity livingEntity ? fluidState -> livingEntity.canStandOnFluid(fluidState) : fluidState -> false,
entity
);
}
boolean isDescending();
boolean isAbove(VoxelShape shape, BlockPos pos, boolean canAscend);
boolean isHoldingItem(Item item);
boolean canStandOnFluid(FluidState fluid1, FluidState fluid2);
VoxelShape getCollisionShape(BlockState state, CollisionGetter collisionGetter, BlockPos pos);
default boolean isPlacement() {
return false;
}
}