Code/net/minecraft/world/phys/shapes/MinecartCollisionContext.java

45 lines
1.9 KiB
Java
Raw Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.phys.shapes;
import javax.annotation.Nullable;
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;
public class MinecartCollisionContext extends EntityCollisionContext {
@Nullable
private BlockPos ingoreBelow;
@Nullable
private BlockPos slopeIgnore;
protected MinecartCollisionContext(AbstractMinecart p_364249_, boolean p_363030_) {
super(p_364249_, p_363030_, false);
this.setupContext(p_364249_);
}
private void setupContext(AbstractMinecart p_363529_) {
BlockPos blockpos = p_363529_.getCurrentBlockPosOrRailBelow();
BlockState blockstate = p_363529_.level().getBlockState(blockpos);
boolean flag = BaseRailBlock.isRail(blockstate);
if (flag) {
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 p_361633_, CollisionGetter p_368990_, BlockPos p_365642_) {
return !p_365642_.equals(this.ingoreBelow) && !p_365642_.equals(this.slopeIgnore) ? super.getCollisionShape(p_361633_, p_368990_, p_365642_) : Shapes.empty();
}
}