Проблемы иницализации items

Версия Minecraft
1.20.1
API
Forge
67
4
7
При запуске runClient выходит исключение
Caused by: java.lang.IllegalStateException: Registry is already frozen
Java:
Details:
    Caused by 0: java.lang.ExceptionInInitializerError
        at ru.modcreator.mod.item.RegisterManagerItems.<clinit>(RegisterManagerItems.java:27) ~[%23196!/:?] {re:classloading}
        at ru.modcreator.mod.Skills.<init>(Skills.java:40) ~[%23196!/:?] {re:classloading}
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?] {}
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[?:?] {}
        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?] {}
        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?] {}
        at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[?:?] {}
        at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:70) ~[javafmllanguage-1.20.1-47.3.0.jar%23192!/:?] {}
        at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:124) ~[fmlcore-1.20.1-47.3.0.jar%23195!/:?] {}
        at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?] {}
        at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[?:?] {}
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?] {}
        at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[?:?] {}
        at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[?:?] {}
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[?:?] {}
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[?:?] {}

Итак, предисловие и после чего это произошло. Я хотел переделать регистрацию айтемов из такого:

RegisterManagerItems:
    public static final RegistryObject<Item> EXAMPLE_SWORD = ITEMS.register("example_sword",
            () -> new ExampleSword(ModTiers.TEST, 1, -2.4f,
                    new Item.Properties().rarity(Rarity.UNCOMMON)));

В такое:

RegisterManagerItems:
    public static final RegistryObject<Item> EXAMPLE_SWORD = ITEMS.register(ExampleSword.INSTANCE.getLocalizedName(), () -> ExampleSword.INSTANCE);

ExampleSword:
    public static final ExampleSword INSTANCE = new ExampleSword(ModTiers.TEST, 1, -2.4f,
            new Item.Properties().rarity(Rarity.UNCOMMON));
    public String getLocalizedName(){
        return "example_sword";
    }

Вроде бы это эквиваленто предыдущему варианту, но оно выдает вышепоказанную ошибку.
Что делать?
Майн висит на этой ошибке
1738774203474.png
 
Ошибка указывает, что реестр уже заморожен(Процесс регистрации уже завершён), уже не помню из-за чего так происходит.
Крч, похоже придется отбросить данный способ регистрации и пользоваться обычным или через метод ->
Пример на коленке:
private static<I extends Item> RegistryObject<I> register(String id, I item) {
    return ITEMS.register(id, () -> item);
}
 
Skills:
@Mod(Skills.MODID)
public class Skills
{
    public static final String MODID = "skills";
    private static final Logger LOGGER = LogUtils.getLogger();
    public Skills()
    {
        IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();

        RegisterManagerItems.register(modEventBus);

        MinecraftForge.EVENT_BUS.register(this);

        modEventBus.addListener(this::clientSetup);
        modEventBus.addListener(this::commonSetup);

        ImmortalBlocks.register(modEventBus);
        GeneralCreativeModeTab.register(modEventBus);

        modEventBus.addListener(SkillsCreativeTab::addCreativeTabItems);

        ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.SPEC);
    }

    private void commonSetup(final FMLCommonSetupEvent event)
    {
        // Some common setup code
        LOGGER.info("HELLO FROM COMMON SETUP");
    }
    private void clientSetup(final FMLClientSetupEvent event){

    }

    @SubscribeEvent
    public void onServerStarting(ServerStartingEvent event)
    {
        LOGGER.info("HELLO from server starting");
    }

//    @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
//    public static class ClientModEvents
//    {
//        @SubscribeEvent
//        public static void onClientSetup(FMLClientSetupEvent event)
//        {
//            // Some client setup code
//            LOGGER.info("HELLO FROM CLIENT SETUP");
//            LOGGER.info("MINECRAFT NAME >> {}", Minecraft.getInstance().getUser().getName());
//        }
//    }
}


RegisterManagerItems:
public class RegisterManagerItems {
    public RegisterManagerItems() {
        throw new IllegalStateException("Utility class");
    }
    public static final DeferredRegister<Item> ITEMS =
            DeferredRegister.create(ForgeRegistries.ITEMS, ImmortalSkills.MODID);

    //Items
    public static final RegistryObject<Item> EXAMPLE_SWORD = ITEMS.register("example_sword",
            () -> new ExampleSword(ModTiers.TEST, 1, -2.4f,
                    new Item.Properties().rarity(Rarity.UNCOMMON)));

    //public static final RegistryObject<Item> EXAMPLE_SWORD = ITEMS.register(ExampleSword.INSTANCE.getLocalizedName(), () -> ExampleSword.INSTANCE);

    public static void register(IEventBus eventBus){
        ITEMS.register(eventBus);
    }
}


ExampleSword:
public class ExampleSword extends AbstractSword {
/*    public static final ExampleSword INSTANCE = new ExampleSword(ModTiers.TEST, 1, -2.4f,
            new Item.Properties().rarity(Rarity.UNCOMMON));*/
    public String getLocalizedName(){
        return "example_sword";
    }

    public ExampleSword(Tier tier, int attackDamageModifier, float attackSpeedModifier, Properties properties) {
        super(tier, attackDamageModifier, attackSpeedModifier, properties);
    }
    public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
        return false;
    }

    @Override
    public void appendHoverText(ItemStack stack, @Nullable Level level, List<Component> components, TooltipFlag flag) {
        {
            components.add(Component.translatable("item.skill.example_sword.description").withStyle(ChatFormatting.RED).withStyle(ChatFormatting.ITALIC));
        }

    }
}


AbstractSword:
public abstract class AbstractSword extends SwordItem implements IAbstractItem {
     AbstractSword(Tier tier, int attackDamageModifier, float attackSpeedModifier, Properties properties) {
        super(tier, attackDamageModifier, attackSpeedModifier, properties);
    }
}


IAbstractItem:
public interface IAbstractItem {
    String getLocalizedName();
}
 
Последнее редактирование:
Мда. Ну, в любом случае я хотел сделать так, чтобы данные для айтема я прописывал непосредственно в самом классе этого айтема, и я сделал это на коленке таким образом:
public static final RegistryObject<Item> EXAMPLE_SWORD = ITEMS.register(ExampleSword.LOCALIZED_NAME, ExampleSword::new);
Java:
    public static final String LOCALIZED_NAME = "example_sword";
    public ExampleSword() {
        super(ModTiers.TEST, 1, -2.4f, new Item.Properties().rarity(Rarity.UNCOMMON));
    }
Не знаю, ожидают ли меня какие нибудь подводные камни в таком случае. Напишите, если что. Ну или если есть более действенный способ это реализовать.
 
Назад
Сверху