[1.12.2] состояние блока и его модель обновляется только если смотреть на него с нажатым F3

Версия Minecraft
1.12.2
API
Forge
39
2
0
Я наколхозил часы (простите пожалуйста) и они нормально не работают, только если навестись на них с нажатым ф3
Блок с часами:
Блок с часами:
    public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos)
    {
        World world = (World) worldIn; //Чтобы получить The World
        int time = (int) world.getWorldTime();
        if(time%10==0) {
            while (true) {
                if (time > 24000)
                    time -= 24000;
                else break;
            }

            if (time > 14999)
                time -= 15000;
            else
                time += 15000;
            int minute = time / 21;
            this.hour = minute / 60;
            EnumFacing facing = state.getValue(FACING);

            world.setBlockState(pos, this.getDefaultState().withProperty(FACING, facing).withProperty(HOUR,hour));
        }
        EnumFacing facing = state.getValue(FACING);
        return state.withProperty(FACING, facing).withProperty(HOUR, hour);
    }
Блок с минутами:
Блок с минутами:
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos)
    {

        World world = (World) worldIn; //Чтобы получить The World
        int time = (int) world.getWorldTime();

        while (true) {
            if (time > 24000)
                time -= 24000;
            else break;
        }
        if (time > 14999)
            time -= 15000;
        else
                time += 15000;

        int minute = time / 21;
        while (minute >= 60)
            minute -= 60;
        EnumFacing facing = state.getValue(FACING);
        world.setBlockState(pos, this.getDefaultState().withProperty(FACING, facing).withProperty(MINUTE,minute));
        return state.withProperty(FACING, facing).withProperty(MINUTE, minute);
    }
 
39
2
0
Я уже советовал тебе это ранее, используй вместо подобного бреда TileEntity с его рендерером (я же правильно понимаю, что ты также хочешь сохранять и значение времени, так?)
Да я изначально понимал, что это бред), но я не знаю как делать рендер через тайл энтити и пока был в шараге уставший (делать ничего нормального и думать не хотелось) решил такой колхоз запилить, какой метод нужен для рендера через тайл энтити? В какой блоке есть пример такого использования? И там указываешь модель или текстуру? Если модель, то можно несколько моделей сразу указать (отдельной для 0x:xx, для x0:xx и тд)?
 
Последнее редактирование:
39
2
0
getActualState вызывается когда блок ставится или обновляются состояния соседних блоков. Но всё равно, обновлять блок каждый тик - плохая идея. Лучше использовать рендер.
Я уже подразобался с битовыми операциями, но блок гетАктуалСтейт нормально не работает (это код двери уже если что), в F3 показывает всё верно, но на деле когда вывожу в консоль в консоль состояния, верхняя часть не берёт от нижней FACING и OPEN, а верхняя часть от нижней UNLOCK (код брал из ванильной двери и редактировал под себя)
UNLOCK - если false, то дверь заперта на ключ
Состояние двери:
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos)
    {
        if (state.getValue(HALF) == LOWER)
        {
            IBlockState iblockstate = worldIn.getBlockState(pos.up());

            if (iblockstate.getBlock() == this)
            {
                state = state.withProperty(UNLOCK, iblockstate.getValue(UNLOCK));
            }
        }
        else
        {
            IBlockState iblockstate1 = worldIn.getBlockState(pos.down());

            if (iblockstate1.getBlock() == this)
            {
                state = state.withProperty(FACING, iblockstate1.getValue(FACING)).withProperty(OPEN, iblockstate1.getValue(OPEN));
            }
        }

        return state;
    }
    public IBlockState getStateFromMeta(int meta)
    {
        return (meta & 8) > 0 ?
                this.getDefaultState()
                        .withProperty(HALF, UPPER)
                        .withProperty(UNLOCK, Boolean.valueOf((meta & 2) > 0)) :
                this.getDefaultState().withProperty(HALF, LOWER)
                        .withProperty(FACING, EnumFacing.getHorizontal(meta & 3).rotateYCCW())
                        .withProperty(OPEN, Boolean.valueOf((meta & 4) > 0));
    }
    public int getMetaFromState(IBlockState state)
    {
        int i = 0;

        if (state.getValue(HALF) == UPPER)
        {
            i = i | 8;

            if (state.getValue(UNLOCK))
            {
                i |= 2;
            }
        }
        else
        {
            i = i | ((EnumFacing)state.getValue(FACING)).rotateY().getHorizontalIndex();

            if (state.getValue(OPEN))
            {
                i |= 4;
            }
        }

        return i;
    }
 
1,374
113
241
Да я изначально понимал, что это бред), но я не знаю как делать рендер через тайл энтити и пока был в шараге уставший (делать ничего нормального и думать не хотелось) решил такой колхоз запилить, какой метод нужен для рендера через тайл энтити? В какой блоке есть пример такого использования? И там указываешь модель или текстуру? Если модель, то можно несколько моделей сразу указать (отдельной для 0x:xx, для x0:xx и тд)?
По поводу создания тайла на форуме есть куча тем - разберёшься легко и просто, если ты не умственно-отсталый, конечно.
Для рендера используется TileEntitySpecialRenderer (поправьте если ошибся, давно на 1.12.2 не писал уже). И рисовать ты будешь там ручками текстуру, скорее всего через Tessellator. Гайд на эту тему тоже на форуме где-то был.
 
Сверху