Метод, тикающий для каждого блока

Версия Minecraft
1.12.2
5,018
47
783
Привет всем. Такой вопрос: updateTick работает как то коряво, в связи с чем назрел вопрос - как сделать чтобы тики считались для блока от момента установки? У меня есть стаааарый-стаааарый код от Тимахи,но есть единственная проблема - он перестает работать, если перезайти в мир.
Если надо, могу его скинуть, скажете, что допилить надо.
А вообще, хотелось бы по современному, через блокстейты как нибудь.
 
5,018
47
783
Z
Ты только учти то, что сетРандомТик будет рандомно вызывать обновление, хотя возможно тебе это и нужно.
В целом да. Но хотелось бы как то это контролировать.
 
5,018
47
783
Сори, я тупой. И что тут смотреть?
Java:
    public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand)
    {
        if (worldIn.getGameRules().getBoolean("doFireTick"))
        {
            if (!this.canPlaceBlockAt(worldIn, pos))
            {
                worldIn.setBlockToAir(pos);
            }

            Block block = worldIn.getBlockState(pos.down()).getBlock();
            boolean flag = block.isFireSource(worldIn, pos.down(), EnumFacing.UP);

            int i = ((Integer)state.getValue(AGE)).intValue();

            if (!flag && worldIn.isRaining() && this.canDie(worldIn, pos) && rand.nextFloat() < 0.2F + (float)i * 0.03F)
            {
                worldIn.setBlockToAir(pos);
            }
            else
            {
                if (i < 15)
                {
                    state = state.withProperty(AGE, Integer.valueOf(i + rand.nextInt(3) / 2));
                    worldIn.setBlockState(pos, state, 4);
                }

                worldIn.scheduleUpdate(pos, this, this.tickRate(worldIn) + rand.nextInt(10));

                if (!flag)
                {
                    if (!this.canNeighborCatchFire(worldIn, pos))
                    {
                        if (!worldIn.getBlockState(pos.down()).isSideSolid(worldIn, pos.down(), EnumFacing.UP) || i > 3)
                        {
                            worldIn.setBlockToAir(pos);
                        }

                        return;
                    }

                    if (!this.canCatchFire(worldIn, pos.down(), EnumFacing.UP) && i == 15 && rand.nextInt(4) == 0)
                    {
                        worldIn.setBlockToAir(pos);
                        return;
                    }
                }

                boolean flag1 = worldIn.isBlockinHighHumidity(pos);
                int j = 0;

                if (flag1)
                {
                    j = -50;
                }

                this.tryCatchFire(worldIn, pos.east(), 300 + j, rand, i, EnumFacing.WEST);
                this.tryCatchFire(worldIn, pos.west(), 300 + j, rand, i, EnumFacing.EAST);
                this.tryCatchFire(worldIn, pos.down(), 250 + j, rand, i, EnumFacing.UP);
                this.tryCatchFire(worldIn, pos.up(), 250 + j, rand, i, EnumFacing.DOWN);
                this.tryCatchFire(worldIn, pos.north(), 300 + j, rand, i, EnumFacing.SOUTH);
                this.tryCatchFire(worldIn, pos.south(), 300 + j, rand, i, EnumFacing.NORTH);

                for (int k = -1; k <= 1; ++k)
                {
                    for (int l = -1; l <= 1; ++l)
                    {
                        for (int i1 = -1; i1 <= 4; ++i1)
                        {
                            if (k != 0 || i1 != 0 || l != 0)
                            {
                                int j1 = 100;

                                if (i1 > 1)
                                {
                                    j1 += (i1 - 1) * 100;
                                }

                                BlockPos blockpos = pos.add(k, i1, l);
                                int k1 = this.getNeighborEncouragement(worldIn, blockpos);

                                if (k1 > 0)
                                {
                                    int l1 = (k1 + 40 + worldIn.getDifficulty().getDifficultyId() * 7) / (i + 30);

                                    if (flag1)
                                    {
                                        l1 /= 2;
                                    }

                                    if (l1 > 0 && rand.nextInt(j1) <= l1 && (!worldIn.isRaining() || !this.canDie(worldIn, blockpos)))
                                    {
                                        int i2 = i + rand.nextInt(5) / 4;

                                        if (i2 > 15)
                                        {
                                            i2 = 15;
                                        }

                                        worldIn.setBlockState(blockpos, state.withProperty(AGE, Integer.valueOf(i2)), 3);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
 
5,018
47
783
Ап.
Я так ничего и не понял...
Огонь распространяется с такой же рандомной скоростью, ток чуть быстрее. Где это?
 
5,018
47
783
Так ладно. Спасибо всем кто откликнулся, но проблему решил сам. В общем, вызвав данные методы в апдейт тике, блок будет обновляться вообще всегда, до тех пор пока что то не произойдет.

Ну , то есть спасает от перезахода в мир. А вот от перезахода в игру, увы нет... Нбт?
Java:
        world.isUpdateScheduled(pos, state.getBlock());
        world.updateBlockTick( pos,state.getBlock(), 1, 0);

Как тут самому себе лайки и лучший ответ ставить?
 
5,018
47
783
да блин. Вот уже, все, почти готово, нахрен мне что то с нуля пилить, тайл какой то(я вообще ненавижу их)
Осталось только решить проблему с тем, чтобы блок начинал обновлятся с того же места, где я вышел из игры.
 

Icosider

Kotliner
Администратор
3,603
99
664
5,018
47
783
Тайлы для этого и сделаны, чтобы тикать постоянно.
А ты изобретаешь велосипеды.
И можно узнать причину твоей ненависти к тайлам?
Я не могу визуализировать себе их работу. В следствие чего я не понимаю как они работают. Мне надо все визуализировать, чтобы понять. Такое мышление.

В общем, кто знает, подскажите, вот я тут методы копаю.
Как заставить метод апдейт тика для конкретного блока запустится вместе со входом в мир?

Вот как после перезахода в мир я нашел как исправить:
Код:
world.scheduleBlockUpdate(pos, this, 1, 0);
world.isUpdateScheduled(pos, state.getBlock());

А для перезахода в игру, что то не вижу. Нашел какие то world.immediateBlockTick(pos, state, rand); и world.updateBlockTick( pos,state.getBlock(), 1, 0);, также еще протектодный метод
Java:
    protected void updateBlocks()
    {
    }

Но первые два начинают флудить в консоль каким то ошибками, если их в апдейттике вызывать(что вместе, что по отдельности) а потом крашат игру, я так и не понял из за чего:
at net.minecraft.world.WorldServer.updateBlockTick(WorldServer.java:574)
at ru.legendgamer.Realism.RealismCore.Blocks.GrowWood.Basic.OakGrowLog.updateTick(OakGrowLog.java:90)
at net.minecraft.world.WorldServer.updateBlockTick(WorldServer.java:574)
at ru.legendgamer.Realism.RealismCore.Blocks.GrowWood.Basic.OakGrowLog.updateTick(OakGrowLog.java:90)
at net.minecraft.world.WorldServer.updateBlockTick(WorldServer.java:574)
at ru.legendgamer.Realism.RealismCore.Blocks.GrowWood.Basic.OakGrowLog.updateTick(OakGrowLog.java:90)
at net.minecraft.world.WorldServer.updateBlockTick(WorldServer.java:574)
at ru.legendgamer.Realism.RealismCore.Blocks.GrowWood.Basic.OakGrowLog.updateTick(OakGrowLog.java:90)
at net.minecraft.world.WorldServer.updateBlockTick(WorldServer.java:574)
at ru.legendgamer.Realism.RealismCore.Blocks.GrowWood.Basic.OakGrowLog.updateTick(OakGrowLog.java:90)
at net.minecraft.world.WorldServer.updateBlockTick(WorldServer.java:574)
at ru.legendgamer.Realism.RealismCore.Blocks.GrowWood.Basic.OakGrowLog.updateTick(OakGrowLog.java:90)
at net.minecraft.world.WorldServer.updateBlockTick(WorldServer.java:574)
at ru.legendgamer.Realism.RealismCore.Blocks.GrowWood.Basic.OakGrowLog.updateTick(OakGrowLog.java:90)
at net.minecraft.world.WorldServer.updateBlockTick(WorldServer.java:574)
at ru.legendgamer.Realism.RealismCore.Blocks.GrowWood.Basic.OakGrowLog.updateTick(OakGrowLog.java:90)
at net.minecraft.world.WorldServer.updateBlockTick(WorldServer.java:574)
А третий я еще не пробовал. Надо ассеттрасформером его публиком делать...
 
5,018
47
783
Есть конечно не одна идея, как подставить костыль, и все будет окей, но... :)
 

Icosider

Kotliner
Администратор
3,603
99
664
Я не могу визуализировать себе их работу. В следствие чего я не понимаю как они работают. Мне надо все визуализировать, чтобы понять. Такое мышление.
Дурацкое мышление. Представь, что помимо блока ставится ещё и "сущность"(конечно же это не сущность, но всё же лучше чем ПлиткаСущность), которая хранит в себе данные, а как рендер идёт блок или TESR. Ну вроде всё, дерзай! Если что непонятно, лучше спроси.
 
5,018
47
783
Когда буду делать верстак, попробую въехать. Сейчас вроде, уже почти доделал.
 
5,018
47
783
Для моего нужен будет. У меня будет же в мире типо, + все предметы, положенные на него, будут в нем же сохранятся

Кстати, @Ivasik , насчет ассеттрасформеров.
Ты мне как то скидывал:
Я не понял что такое field_76750_F и откуда его взять.
public-f net.minecraft.world.biome.Biome field_76750_F #temperature

Пытаюсь в классе World сделать одно поле public вот так: public net.minecraft.world.World #scheduledUpdatesAreImmediate, почему то не выходит :\
 
Если поставить больше 10 кристальных сундуков и забить их, то начинается просадка фпс.
Это можно как-нибудь оптимизировать, если просто кинуть стаков ~30 предметов то просадка фпс не будет
 
Сверху