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

45 lines
1.7 KiB
Java

package net.minecraft.world.phys.shapes;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.level.CollisionGetter;
import net.minecraft.world.level.block.BaseRailBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.RailShape;
import org.jetbrains.annotations.Nullable;
public class MinecartCollisionContext extends EntityCollisionContext {
@Nullable
private BlockPos ingoreBelow;
@Nullable
private BlockPos slopeIgnore;
protected MinecartCollisionContext(AbstractMinecart minecart, boolean canStandOnFluid) {
super(minecart, canStandOnFluid, false);
this.setupContext(minecart);
}
private void setupContext(AbstractMinecart minecart) {
BlockPos blockPos = minecart.getCurrentBlockPosOrRailBelow();
BlockState blockState = minecart.level().getBlockState(blockPos);
boolean bl = BaseRailBlock.isRail(blockState);
if (bl) {
this.ingoreBelow = blockPos.below();
RailShape railShape = blockState.getValue(((BaseRailBlock)blockState.getBlock()).getShapeProperty());
if (railShape.isSlope()) {
this.slopeIgnore = switch (railShape) {
case ASCENDING_EAST -> blockPos.east();
case ASCENDING_WEST -> blockPos.west();
case ASCENDING_NORTH -> blockPos.north();
case ASCENDING_SOUTH -> blockPos.south();
default -> null;
};
}
}
}
@Override
public VoxelShape getCollisionShape(BlockState state, CollisionGetter collisionGetter, BlockPos pos) {
return !pos.equals(this.ingoreBelow) && !pos.equals(this.slopeIgnore) ? super.getCollisionShape(state, collisionGetter, pos) : Shapes.empty();
}
}