encountered an error during the common_setup event phase

Начал писать блок... Вроде всё нормально, запускаю майнкрафт и мне пишет ошибку, думал долго, но так и ничего не придумал, не знаете как починить эту ошибку?


ItemInit:
public static final RegistryObject<Item> DUNGEON_STONE = ITEMS.register("dungeon_stone",
            () -> new BlockItem(BlockInit.DUNGEON_STONE.get(), new Item.Properties().tab(CreativeTabinit.DANMACHI_ITEMS_TAB)));


BlockInit:
package com.danmachi.danmachi.init;

import com.danmachi.danmachi.danmachi;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.level.material.MaterialColor;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fmllegacy.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

import static com.danmachi.danmachi.danmachi.MOD_ID;

public class BlockInit {
    public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MOD_ID);

    public static final RegistryObject<Block> DUNGEON_STONE = BLOCKS.register("dungeon_stone",
            () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.STONE).strength(1.5F, 6.0F)));


    public static void register(IEventBus eventBus)
    {
        BLOCKS.register(eventBus);
    }
}
1642404841667.png
 
178
4
42
Не спец по 1.17, но строка в ItemInit, которую ты показал, явно плохо себя чувствует. Она исполняется в <clinit>, то есть во время инициализации класса. Но там ты вызываешь метод get(), который, судя по логам, улетает в Registry за конкретным инстансом зарегистрированного блока. Утверждается, что загрузка класса происходит перед регистрацией всего, отчего ты и получаешь свой NPE.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Она исполняется в <clinit>, то есть во время инициализации класса. Но там ты вызываешь метод get()
Метод get() вызывается из лямбды, то есть не во время инициализации класса, а тогда когда фордж регистрирует итемы, то бишь по идее как раз тогда когда надо, вроде всё ок должно быть.

Но да, в логе ошибка что danmachi:dungeon_stone не найден в Registry, в момент вызова BlockInit.DUNGEON_STONE.get(). Ты ведь BlocksInit.register(..) вызвал из конструктора мода? (очевидно что скорее всего да, но мы этого не видим, а ты мог протупить, бывает)
 
178
4
42
Метод get() вызывается из лямбды, то есть не во время инициализации класса, а тогда когда фордж регистрирует итемы, то бишь по идее как раз тогда когда надо, вроде всё ок должно быть.
То есть вызовы ITEMS.register() откладываются до момента ивента регистрации? Сильно сомневаюсь(но может быть и так). Я так понял, эта лямбда - всего лишь фабрика. А регистрация в ITEMS у него точно вызывается во время инициализации static final поля - то есть в clinit.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Чисто сам метод get() в коде вызывается из этой фабрики, о которой ты говоришь, а фабрика вызывается в момент ивента регистрации.
То бишь get() не вызывается из <clinit>, как ты сказал/предположил, я это имел ввиду

Не знаю почему ты решил, что я говорю о ITEMS.register ¯\_(ツ)_/¯

И как я и сказал, непонятно почему в момент ивента регистрации итемов, когда блоки уже должны были быть зарегистрированы (первые в очереди блоки, вторые - итемы, а дальше все остальные регистри в алфавитном порядке), вызов BlockInit.DUNGEON_STONE.get() говорит что такого блока мы не зарегистрировали
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Ты мне ткни где я в моих сообщениях что угодно говорил про ITEMS.register, а не про .get(), который в лямбде, хоспаде

Да, он вызывается в <clinit>, никто с этим не спорит
 
178
4
42
То есть реально вызов лямбды откладывается до момента регистрации? Сюр какой-то...
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Так на то она и лямбда! Зачем там ещё лямбда-то?
Для того они весь этот сыр-бор с DeferredRegistry и затеяли, чтобы лямбды делали создание блоков/итемов/прочих ленивым и откладывать это создание до того момента, когда всё будет готово, и чтобы у всех ещё были красивые public static final-ы эти в одном месте легко.

И да, вот они лямбду ложат в мапу (создавая новую лямбду, которая вызывает эту, чтобы там блоку/итему/тд засетить registryName ещё, но то такое), чтобы когда-нибудь потом её вызвать:
last_screenshot.png

Java:
Runnable test = () -> System.out.println("I am in a lambda and I was just run");
// ^ nothing happened, we just created a lambda, sysout was never called
Thread.sleep(forever);
test.run(); // and now it printed
test.run(); // and again, lol
 
Сверху