Летучие рельсы

Версия Minecraft
1.12.2

sk9zist :l

Исправился
981
18
157
Есть рельсы, как заставить их висеть в воздухе? Т.е когда ставишь их, ломаешь под ними блок, или сразу ставишь на воздух - рельсы не ломаються.
Java:
import com.ewyboy.bibliotheca.common.interfaces.IBlockRenderer;
import com.ewyboy.bibliotheca.common.loaders.BlockLoader;

public class BlockFRailBase extends BlockRail implements BlockLoader.IHasCustomItem, IBlockRenderer {

    @Override
    public boolean isTopSolid(IBlockState state) {
        return true;
    }

    @Override
    public boolean canPlaceBlockOnSide(World worldIn, BlockPos pos, EnumFacing side) {
        return false;
    }

    @Override
    public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entityIn, boolean isActualState) {
        addCollisionBoxToList(pos, entityBox, collidingBoxes, !(entityIn instanceof EntityMinecart) ? FLAT_AABB : NULL_AABB);
    }

    @Override
    public int[] modelMetas() {
        return new int[0];
    }

    @Override
    public void registerBlockRenderer() {}

    @Override
    public void registerBlockItemRenderer() {
        ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), new ItemStack(this).getMetadata(), new ModelResourceLocation(getRegistryName(), "inventory"));
    }

    @Override
    public ItemBlock getItemBlock() {
        return null;
    }
}
Java:
public class BlockFRail extends BlockFRailBase {

    public BlockFRail() {
        super();
    }
    
    //@Override
    //public boolean canBlockStay(World world, BlockPos pos, IBlockState state) {
    //    return true;
    //}

    @Override
    public ItemBlock getItemBlock() {
        return new ItemRail(this);
    }
}
 
Решение
1. Переопредели метод canPlaceBlockAt (чтобы можно было ставить рельсы в воздухе)
Java:
@Override
public boolean canPlaceBlockAt(World worldIn, BlockPos pos) {
    return true;
}
2. Переопредели метод neighborChanged и убери/закомментируй метод разрушения блока.
Java:
@Override
public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos)
{
    if (!worldIn.isRemote)
    {
        BlockRailBase.EnumRailDirection blockrailbase$enumraildirection = getRailDirection(worldIn, pos, worldIn.getBlockState(pos), null);
        boolean flag = false;

        if (!worldIn.getBlockState(pos.down()).isSideSolid(worldIn, pos.down(), EnumFacing.UP))
        {
            flag = true;
        }

        if...
1,560
86
204
1. Переопредели метод canPlaceBlockAt (чтобы можно было ставить рельсы в воздухе)
Java:
@Override
public boolean canPlaceBlockAt(World worldIn, BlockPos pos) {
    return true;
}
2. Переопредели метод neighborChanged и убери/закомментируй метод разрушения блока.
Java:
@Override
public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos)
{
    if (!worldIn.isRemote)
    {
        BlockRailBase.EnumRailDirection blockrailbase$enumraildirection = getRailDirection(worldIn, pos, worldIn.getBlockState(pos), null);
        boolean flag = false;

        if (!worldIn.getBlockState(pos.down()).isSideSolid(worldIn, pos.down(), EnumFacing.UP))
        {
            flag = true;
        }

        if (blockrailbase$enumraildirection == BlockRailBase.EnumRailDirection.ASCENDING_EAST && !worldIn.getBlockState(pos.east()).isSideSolid(worldIn, pos.east(), EnumFacing.UP))
        {
            flag = true;
        }
        else if (blockrailbase$enumraildirection == BlockRailBase.EnumRailDirection.ASCENDING_WEST && !worldIn.getBlockState(pos.west()).isSideSolid(worldIn, pos.west(), EnumFacing.UP))
        {
            flag = true;
        }
        else if (blockrailbase$enumraildirection == BlockRailBase.EnumRailDirection.ASCENDING_NORTH && !worldIn.getBlockState(pos.north()).isSideSolid(worldIn, pos.north(), EnumFacing.UP))
        {
            flag = true;
        }
        else if (blockrailbase$enumraildirection == BlockRailBase.EnumRailDirection.ASCENDING_SOUTH && !worldIn.getBlockState(pos.south()).isSideSolid(worldIn, pos.south(), EnumFacing.UP))
        {
            flag = true;
        }

        if (flag && !worldIn.isAirBlock(pos))
        {
            //this.dropBlockAsItem(worldIn, pos, state, 0);
            //worldIn.setBlockToAir(pos);
        }
        else
        {
            this.updateState(state, worldIn, pos, blockIn);
        }
    }
}
 

sk9zist :l

Исправился
981
18
157
Сверху