Расположить упавшее дерево такой же длины как и стоячее

Версия Minecraft
1.12.2
5,018
47
783
Чет посидел и появилось настроение покодить. Короче, запилил что то такое - падающее дерево после срубки.
Чет никак не могу приложить ума, как бы мне чекать высоту ствола и спавнить рядом такой же длины?
Java:
boolean check;

    public void updateTick(World world, BlockPos pos, IBlockState state, Random rand)
    {

        if (!world.isRemote)
        {
            this.onBlockDestroyedByPlayer(world, pos, state);
        }
    }
    int checker;
    public int highTree;
    private void checkBackBone(World world, BlockPos pos) {
        int x = pos.getX();
        int y = pos.getY();
        int z = pos.getZ();

        for(int i = 0; i < 10; i++) {
            checker++;
            if(world.getBlockState(new BlockPos(x,y - i,z)) != RegBlocks.test_falling_log.getDefaultState()) {           
                break;   
            }
                
        }

    }

  public void onBlockDestroyedByPlayer(World world, BlockPos pos, IBlockState state)
    {
          this.checkBackBone(world, pos);
        this.checkFallableDown(world, pos);
        this.checkFallableLogSouth1St(world, pos);
        this.checkFallableLogSouth2St(world, pos);
    }

    private boolean checkFallableLogSouth1St(World world, BlockPos pos)
    {
        IBlockState state = world.getBlockState(pos);
        

        
        if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
        {
            if(!world.isRemote) {
                if(world.isAirBlock(pos.down())){
                    return false;
                }
                if(world.isAirBlock(pos.south())){
                    EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(pos.south()));
                    this.onStartFalling(efb);
                    world.spawnEntity(efb);
                }
                if( world.isAirBlock(new BlockPos(pos.getX(),pos.getY() - 1,pos.getZ() + 1))) {

                    world.setBlockState(new BlockPos(pos.getX(),pos.getY(),pos.getZ() + 1), state.withProperty(AXIS, EnumFacing.Axis.Z));
                    world.setBlockToAir(pos);
                }
            }
        }
        return check;

    }

    private void checkFallableDown(World world, BlockPos pos)
    {   
        IBlockState state = world.getBlockState(pos);

        if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
        {
            if(!world.isRemote) {
                if(world.isAirBlock(pos.down())) {
                    EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(pos));
                    this.onStartFalling(efb);
                    world.spawnEntity(efb);
                }
            }
        }
    }
    private void checkFallableLogSouth2St(World world, BlockPos pos)
    {
        if(!check) {
            IBlockState state = world.getBlockState(pos);
        
        
            int x = pos.getX();
            int y = pos.getY();
            int z = pos.getZ();
            if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
            {
                if(!world.isRemote) {
                    if(world.isAirBlock(pos.down())){
                        return;
                    }
                    if(world.isAirBlock(pos.south())){
                        EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(new BlockPos(x,y,z + 1)));
                    //    EntityFallingBlock efb2 = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(new BlockPos(x,y,z + 2)));
                        this.onStartFalling(efb);
                        world.spawnEntity(efb);
                    //    world.spawnEntity(efb2);
                    }
                    if( world.getBlockState(new BlockPos(pos.getX(),pos.getY() - 1,pos.getZ() + 1)).getBlock() == RegBlocks.test_falling_log) {

                        world.setBlockState(new BlockPos(x,y,z + 2), state.withProperty(AXIS, EnumFacing.Axis.Z));
                        world.setBlockToAir(pos);
                    }
                }
            }
        }
    }
Это работает вот так.
 
Решение
Для тебя напишу)
Java:
int lenght(BlockPos pos, World world){
    return lenght(pos,world,0);
}

int lenght(BlockPos pos, World world, int curLen){
    if(world.getBlock(pos)==Blocks.oak_log)//условие для 1.12.2 возможно, не покатит(там же стейты и все такое)
        return lenght(pos.add(0,1,0),world,curLen+1);
    else return curLen;
}
7,099
324
1,510
Чет никак не могу приложить ума, как бы мне чекать высоту ствола и спавнить рядом такой же длины?
Рекурсивно чекать вверх на наличие бревна, возвращая найденную длину
 
5,018
47
783
До этого я ещё вчера догадался. Я имел ввиду, я не понимаю как это кодом реализовать
 
7,099
324
1,510
Scala:
def lenght(pos:BlockPos,curLen:Int=0):Int={
    if(world.getBlock(pos)==Blocks.oak_log)//условие для 1.12.2 возможно, не покатит(там же стейты и все такое)
        lenght(pos.add(0,1,0),curLen+1)
    else curLen
}
edited: Переделал на хвостовую рекурсию, чтобы стек не переполнялся
 
Последнее редактирование:
7,099
324
1,510
Для тебя напишу)
Java:
int lenght(BlockPos pos, World world){
    return lenght(pos,world,0);
}

int lenght(BlockPos pos, World world, int curLen){
    if(world.getBlock(pos)==Blocks.oak_log)//условие для 1.12.2 возможно, не покатит(там же стейты и все такое)
        return lenght(pos.add(0,1,0),world,curLen+1);
    else return curLen;
}
 
Последнее редактирование:
5,018
47
783
Если это методы, откуда взялся world? :unsure:
Чет я совсем все забыл... и где мне это заюзать? В апдейт тике?
 
5,018
47
783
Чет бред какой то. У меня метод
Java:
public void onBlockDestroyedByPlayer(World world, BlockPos pos, IBlockState state)
    {
        this.lenght(world, pos);
        this.checkFallableDown(world, pos);
        this.checkFallableLogSouth1St(world, pos);
        this.checkFallableLogSouth2St(world, pos);
    }
Постоянно срабатывает. Даже если я не ломаю нижний блок, дерево может начать падать...
Т.е он срабатывает, даже если игрок не проводит никаких манипуляций с блоком:unsure::unsure:

Короче, сделал вот так:
Код:
    int lenght(World world, BlockPos pos) {
        return lenght(world, pos,0);

    }

    int lenght(World world, BlockPos pos,int curLen){
        if(world.getBlockState(pos) == RegBlocks.test_falling_log.getDefaultState())
        {  
            return lenght(world, pos.add(0,1,0),curLen+1);
        }
        else
        {
            System.out.println(curLen);
            return curLen;
        }
    }
    @Override
    public void onBlockDestroyedByPlayer(World world, BlockPos pos, IBlockState state)
    {
        this.lenght(world, pos);
        this.checkFallableDown(world, pos);
        this.checkFallableLogSouth1St(world, pos);
        this.checkFallableLogSouth2St(world, pos);
    }

Но все равно, у какой бы высоты колонны блоков снизу блок не ломай, все равно ноль
 
7,099
324
1,510
5,018
47
783
7,099
324
1,510
1526140248385.png

~~~
я должен вызвать другой метод lenght? И в поле curLen там тогда будет нужное мне значение?
Этот метод возвращает значение, ты должен его записать в переменную и юзать где-то дальше
 
7,099
324
1,510
Значит, ты неправильно условие написал(сам то как не догадался? пхд, долго не писал код)
 
5,018
47
783
Год уже...
Вот, короче, поменял условие на неравно и у меня произошла такая вещь в овер9000 строчек и майн крашнулся
А если ставить "=" то вообще ничего не работает - выполняется условие которое в блоке else { }
Java:
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
    at ru.legendgamer.Realism.API.BasicBlock.BasicFallingLog.lenght(BasicFallingLog.java:202)
 
5,018
47
783
Java:
public class BasicFallingLog extends BlockRotatedPillar {

    public static final PropertyEnum<EnumFacing.Axis> AXIS = PropertyEnum.<EnumFacing.Axis>create("axis", EnumFacing.Axis.class);

    public BasicFallingLog(final Material materialIn, final String name, float hardness,float resistanse, SoundType soundtype,CreativeTabs cTab) {
        super(materialIn);
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.setSoundType(soundtype);
        this.setHardness(hardness);
        this.setResistance(resistanse);
        this.setCreativeTab(cTab);
        this.setDefaultState(this.blockState.getBaseState().withProperty(AXIS, EnumFacing.Axis.Y));

    }

    public static enum EnumAxis implements IStringSerializable {
        X("x"),
        Y("y"),
        Z("z"),
        NONE("none");

        private final String name;

        private EnumAxis(String name)
        {
            this.name = name;
        }

        public String toString()
        {
            return this.name;
        }

        public static BasicFallingLog.EnumAxis fromFacingAxis(EnumFacing.Axis axis)
        {
            switch (axis)
            {
            case X:
                return X;
            case Y:
                return Y;
            case Z:
                return Z;
            default:
                return NONE;
            }
        }

        public String getName()
        {
            return this.name;
        }
    }
    @Override
    public boolean rotateBlock(World world, BlockPos pos, EnumFacing axis)
    {
        IBlockState state = world.getBlockState(pos);
        for (net.minecraft.block.properties.IProperty<?> prop : state.getProperties().keySet())
        {
            if (prop.getName().equals("axis"))
            {
                world.setBlockState(pos, state.cycleProperty(prop));
                return true;
            }
        }
        return false;
    }

    public IBlockState withRotation(IBlockState state, Rotation rot)
    {
        switch (rot)
        {
        case COUNTERCLOCKWISE_90:
        case CLOCKWISE_90:

            switch ((EnumFacing.Axis)state.getValue(AXIS))
            {
            case X:
                return state.withProperty(AXIS, EnumFacing.Axis.Z);
            case Z:
                return state.withProperty(AXIS, EnumFacing.Axis.X);
            default:
                return state;
            }

        default:
            return state;
        }
    }

    public IBlockState getStateFromMeta(int meta)
    {
        EnumFacing.Axis enumfacing$axis = EnumFacing.Axis.Y;
        int i = meta & 12;

        if (i == 4)
        {
            enumfacing$axis = EnumFacing.Axis.X;
        }
        else if (i == 8)
        {
            enumfacing$axis = EnumFacing.Axis.Z;
        }

        return this.getDefaultState().withProperty(AXIS, enumfacing$axis);
    }

    public int getMetaFromState(IBlockState state)
    {
        int i = 0;
        EnumFacing.Axis enumfacing$axis = (EnumFacing.Axis)state.getValue(AXIS);

        if (enumfacing$axis == EnumFacing.Axis.X)
        {
            i |= 4;
        }
        else if (enumfacing$axis == EnumFacing.Axis.Z)
        {
            i |= 8;
        }

        return i;
    }

    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {AXIS});
    }

    protected ItemStack getSilkTouchDrop(IBlockState state)
    {
        return new ItemStack(Item.getItemFromBlock(this));
    }
    public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
    {
        return super.getStateForPlacement(worldIn, pos, facing, hitX, hitY, hitZ, meta, placer).withProperty(AXIS, facing.getAxis());
    }
    public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state)
    {
        worldIn.scheduleUpdate(pos, this, this.tickRate(worldIn));
    }

    public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos)
    {
        worldIn.scheduleUpdate(pos, this, this.tickRate(worldIn));
    }

    boolean check;

    public void updateTick(World world, BlockPos pos, IBlockState state, Random rand)
    {

        if (!world.isRemote)
        {
            this.checkFallableDown(world, pos);
            this.checkFallableLogSouth1St(world, pos);
            this.checkFallableLogSouth2St(world, pos);
        }
    }


    int lenght(World world, BlockPos pos) {
        return lenght(world, pos,0);
    }

    int lenght(World world, BlockPos pos,int curLen){
        if(world.getBlockState(pos) == RegBlocks.test_falling_log.getDefaultState())
        {    
            return lenght(world, pos.add(0,1,0),curLen+1);
        }
        else
        {
            return curLen;
        }
    }
    @Override
    public void onBlockDestroyedByPlayer(World world, BlockPos pos, IBlockState state)
    {
        this.lenght(world, pos);

    }

    private boolean checkFallableLogSouth1St(World world, BlockPos pos)
    {
        IBlockState state = world.getBlockState(pos);



        if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
        {
            if(!world.isRemote) {
                if(world.isAirBlock(pos.down())){
                    return false;
                }
                if(world.isAirBlock(pos.south())){
                    EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(pos.south()));
                    this.onStartFalling(efb);
                    world.spawnEntity(efb);
                }
                if( world.isAirBlock(new BlockPos(pos.getX(),pos.getY() - 1,pos.getZ() + 1))) {

                    world.setBlockState(new BlockPos(pos.getX(),pos.getY(),pos.getZ() + 1), state.withProperty(AXIS, EnumFacing.Axis.Z));
                    world.setBlockToAir(pos);
                }
            }
        }
        return check;

    }

    private void checkFallableDown(World world, BlockPos pos)
    {    
        IBlockState state = world.getBlockState(pos);

        if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
        {
            if(!world.isRemote) {
                if(world.isAirBlock(pos.down())) {
                    EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(pos));
                    this.onStartFalling(efb);
                    world.spawnEntity(efb);
                }
            }
        }
    }
    private void checkFallableLogSouth2St(World world, BlockPos pos)
    {
        if(!check) {
            IBlockState state = world.getBlockState(pos);


            int x = pos.getX();
            int y = pos.getY();
            int z = pos.getZ();
            if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
            {
                if(!world.isRemote) {
                    if(world.isAirBlock(pos.down())){
                        return;
                    }
                    if(world.isAirBlock(pos.south())){
                        EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(new BlockPos(x,y,z + 1)));
                        //    EntityFallingBlock efb2 = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(new BlockPos(x,y,z + 2)));
                        this.onStartFalling(efb);
                        world.spawnEntity(efb);
                        //    world.spawnEntity(efb2);
                    }
                    if( world.getBlockState(new BlockPos(pos.getX(),pos.getY() - 1,pos.getZ() + 1)).getBlock() == RegBlocks.test_falling_log) {

                        world.setBlockState(new BlockPos(x,y,z + 2), state.withProperty(AXIS, EnumFacing.Axis.Z));
                        world.setBlockToAir(pos);
                    }
                }
            }
        }
    }










    /*    

    private void checkFallableSouth(World world, BlockPos pos)
    {
        IBlockState state = world.getBlockState(pos);

        if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
        {
            if(!world.isRemote) {
                if(world.isAirBlock(pos.down())){
                    return;
                }
                if(world.isAirBlock(pos.south())){
                    EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(pos.south()));
                    this.onStartFalling(efb);
                    world.spawnEntity(efb);
                }
                if( world.isAirBlock(new BlockPos(pos.getX(),pos.getY() - 1,pos.getZ() + 1))) {

                    world.setBlockState(new BlockPos(pos.getX(),pos.getY(),pos.getZ() + 1), state);
                    world.setBlockToAir(pos);
                }
            }
        }
    }
    private void checkFallableNorth(World world, BlockPos pos)
    {
        IBlockState state = world.getBlockState(pos);

        if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
        {
            if(!world.isRemote) {
                if(world.isAirBlock(pos.down())){
                    return;
                }
                if(world.isAirBlock(pos.north())){
                    EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(pos.north()));
                    this.onStartFalling(efb);
                    world.spawnEntity(efb);
                }
                if( world.isAirBlock(new BlockPos(pos.getX(),pos.getY() - 1,pos.getZ() - 1))) {

                    world.setBlockState(new BlockPos(pos.getX(),pos.getY(),pos.getZ() - 1), state);
                    world.setBlockToAir(pos);
                }
            }
        }
    }
    private void checkFallableWest(World world, BlockPos pos)
    {
        IBlockState state = world.getBlockState(pos);

        if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
        {
            if(!world.isRemote) {
                if(world.isAirBlock(pos.down())){
                    return;
                }
                if(world.isAirBlock(pos.west())){
                    EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(pos.west()));
                    this.onStartFalling(efb);
                    world.spawnEntity(efb);
                }
                if( world.isAirBlock(new BlockPos(pos.getX() + 1,pos.getY() - 1,pos.getZ()))) {

                    world.setBlockState(new BlockPos(pos.getX() + 1,pos.getY(),pos.getZ()), state);
                    world.setBlockToAir(pos);
                }
            }
        }
    }
    private void checkFallableEast(World world, BlockPos pos)
    {
        IBlockState state = world.getBlockState(pos);

        if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
        {
            if(!world.isRemote) {
                if(world.isAirBlock(pos.down())){
                    return;
                }
                if(world.isAirBlock(pos.east())){
                    EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(pos.east()));
                    this.onStartFalling(efb);
                    world.spawnEntity(efb);
                }
                if( world.isAirBlock(new BlockPos(pos.getX() - 1,pos.getY() - 1,pos.getZ()))) {

                    world.setBlockState(new BlockPos(pos.getX() - 1,pos.getY(),pos.getZ()), state);
                    world.setBlockToAir(pos);
                }
            }
        }
    }
     */
    protected void onStartFalling(EntityFallingBlock fallingEntity)
    {
    }

    /**
     * How many world ticks before ticking
     */
    public int tickRate(World worldIn)
    {
        return 2;
    }

    public static boolean canFallThrough(IBlockState state)
    {
        Block block = state.getBlock();
        Material material = state.getMaterial();
        return block == Blocks.FIRE || material == Material.AIR || material == Material.WATER || material == Material.LAVA;
    }

    public void onEndFalling(World worldIn, BlockPos pos, IBlockState p_176502_3_, IBlockState p_176502_4_)
    {
    }

    public void onBroken(World worldIn, BlockPos pos)
    {
    }

    @SideOnly(Side.CLIENT)
    public void randomDisplayTick(IBlockState stateIn, World worldIn, BlockPos pos, Random rand)
    {
        if (rand.nextInt(16) == 0)
        {
            BlockPos blockpos = pos.down();

            if (canFallThrough(worldIn.getBlockState(blockpos)))
            {
                double d0 = (double)((float)pos.getX() + rand.nextFloat());
                double d1 = (double)pos.getY() - 0.05D;
                double d2 = (double)((float)pos.getZ() + rand.nextFloat());
                worldIn.spawnParticle(EnumParticleTypes.FALLING_DUST, d0, d1, d2, 0.0D, 0.0D, 0.0D, Block.getStateId(stateIn));
            }
        }
    }

    @SideOnly(Side.CLIENT)
    public int getDustColor(IBlockState state)
    {
        return -16777216;
    }

}
 
Сверху