Posted May 1, 20232 yr Hi, I'm trying to register a custom MobEffect, but when the mod load it seams to not have the MobEffect to be registered. The forge version is the 40.2.1 "Main" class @Mod(MODID) public class BetterArmor { //region Constructor public BetterArmor() { // Register the setup method for modloading IEventBus eventBus=FMLJavaModLoadingContext.get().getModEventBus(); CustomEffectsRegistry.register(eventBus); BetterArmorRegistryItems.register(eventBus); eventBus.addListener(this::setup); // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); } ... } Class that hold references and register the effect public class CustomEffectsRegistry { public static void register(IEventBus eventBus) { MOB_EFFECTS.register(eventBus); } public static final DeferredRegister<MobEffect> MOB_EFFECTS= DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, BetterArmor.MODID); public static RegistryObject<MobEffect> FLY=MOB_EFFECTS.register("fly", ()->new FlyingEffect(MobEffectCategory.BENEFICIAL, 3124687)); } Effetcs class public class FlyingEffect extends MobEffect { public FlyingEffect(MobEffectCategory mobEffectCategory, int color) { super(mobEffectCategory, color); } @Override public void applyEffectTick(LivingEntity livingEntity, int amplifier) { ... } @Override public boolean isDurationEffectTick(int p_19455_, int p_19456_) { //return super.isDurationEffectTick(p_19455_, p_19456_); return true; } } There's a method where I use the effect and where it gives me an excpetion(seems that Items are registerd before MobEffects) private static ArrayList<MobEffectInstance> buildEffectsArray() { ArrayList<MobEffectInstance> effects=new ArrayList<>(); effects.add(new MobEffectInstance(MobEffects.NIGHT_VISION, BaseMultipliers.BASETIMER, 50)); effects.add(new MobEffectInstance(CustomEffectsRegistry.FLY.get(), 200, 5)); return effects; } There's the exception Spoiler [Render thread/ERROR] [ne.mi.fm.ja.FMLModContainer/]: Exception caught during firing event: null Index: 2 Listeners: 0: NORMAL 1: ASM: net.minecraftforge.registries.DeferredRegister$EventDispatcher@4bb8dbe3 handleEvent(Lnet/minecraftforge/event/RegistryEvent$Register;)V 2: ASM: net.minecraftforge.registries.DeferredRegister$EventDispatcher@316b043 handleEvent(Lnet/minecraftforge/event/RegistryEvent$Register;)V java.lang.ExceptionInInitializerError at TRANSFORMER/[email protected]/com.redox.betterarmor.item.BetterArmorRegistryItems.lambda$static$12(BetterArmorRegistryItems.java:54) at TRANSFORMER/[email protected]/net.minecraftforge.registries.DeferredRegister.lambda$register$0(DeferredRegister.java:214) at TRANSFORMER/[email protected]/net.minecraftforge.registries.DeferredRegister.addEntries(DeferredRegister.java:446) at TRANSFORMER/[email protected]/net.minecraftforge.registries.DeferredRegister$EventDispatcher.handleEvent(DeferredRegister.java:376) at net.minecraftforge.eventbus.ASMEventHandler_0_EventDispatcher_handleEvent_Register.invoke(.dynamic) at MC-BOOTSTRAP/[email protected]/net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) at MC-BOOTSTRAP/[email protected]/net.minecraftforge.eventbus.EventBus.post(EventBus.java:302) at MC-BOOTSTRAP/[email protected]/net.minecraftforge.eventbus.EventBus.post(EventBus.java:283) at LAYER PLUGIN/[email protected]/net.minecraftforge.fml.javafmlmod.FMLModContainer.acceptEvent(FMLModContainer.java:106) at LAYER PLUGIN/[email protected]/net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:107) at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) at LAYER PLUGIN/[email protected]/net.minecraftforge.fml.ModWorkManager$SyncExecutor.driveOne(ModWorkManager.java:42) at LAYER PLUGIN/[email protected]/net.minecraftforge.fml.ModWorkManager$DrivenExecutor.drive(ModWorkManager.java:26) at LAYER PLUGIN/[email protected]/net.minecraftforge.fml.ModLoader.waitForTransition(ModLoader.java:202) at LAYER PLUGIN/[email protected]/net.minecraftforge.fml.ModLoader.lambda$dispatchAndHandleError$21(ModLoader.java:187) at java.base/java.util.Optional.ifPresent(Optional.java:178) at LAYER PLUGIN/[email protected]/net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:187) at LAYER PLUGIN/[email protected]/net.minecraftforge.fml.ModLoader.lambda$gatherAndInitializeMods$11(ModLoader.java:164) at java.base/java.lang.Iterable.forEach(Iterable.java:75) at LAYER PLUGIN/[email protected]/net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:164) at TRANSFORMER/[email protected]/net.minecraftforge.client.loading.ClientModLoader.lambda$begin$1(ClientModLoader.java:92) at TRANSFORMER/[email protected]/net.minecraftforge.client.loading.ClientModLoader.lambda$createRunnableWithCatch$4(ClientModLoader.java:112) at TRANSFORMER/[email protected]/net.minecraftforge.client.loading.ClientModLoader.begin(ClientModLoader.java:92) at TRANSFORMER/[email protected]/net.minecraft.client.Minecraft.<init>(Minecraft.java:459) at TRANSFORMER/[email protected]/net.minecraft.client.main.Main.main(Main.java:169) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at MC-BOOTSTRAP/[email protected]/net.minecraftforge.fml.loading.targets.ForgeClientUserdevLaunchHandler.lambda$launchService$0(ForgeClientUserdevLaunchHandler.java:24) at MC-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) at MC-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) at MC-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) at MC-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.Launcher.run(Launcher.java:106) at MC-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.Launcher.main(Launcher.java:77) at MC-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) at MC-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) at [email protected]/cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:149) Caused by: java.lang.NullPointerException: Registry Object not present: betterarmor:fly at java.base/java.util.Objects.requireNonNull(Objects.java:334) at TRANSFORMER/[email protected]/net.minecraftforge.registries.RegistryObject.get(RegistryObject.java:320) at TRANSFORMER/[email protected]/com.redox.betterarmor.item.armor.effects.effectsapplicators.DragonArmorEffects.buildEffectsArray(DragonArmorEffects.java:43) at TRANSFORMER/[email protected]/com.redox.betterarmor.item.armor.effects.effectsapplicators.DragonArmorEffects.<clinit>(DragonArmorEffects.java:47) ... 38 more
May 1, 20232 yr Quote seems that Items are registerd before MobEffects Yes. See the recent discussion here or one of the many others in this forum about using Suppliers (deferred access) https://forums.minecraftforge.net/topic/123444-forge-error-on-run/?do=findComment&comment=536470 Boilerplate: If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one. If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install Large files should be posted to a file sharing site like https://gist.github.com You should also read the support forum sticky post.
May 1, 20232 yr Author I read the doc on why DeferredRegister gives me null. But now I don't understand how to fix that. It says: When using DeferredRegisters with non-vanilla registries, the registry key or the registry name should be supplied to the create method. These include the custom Forge registries for entity data serializers, global loot modifier serializers, world presets, and biome modifier serializers. Calling Supplier#get on a Supplier<IForgeRegistry<?>> when making a DeferredRegister will return null because the registry does not exist yet. So I have to change the create with registry key or registry name, but I have not understand how, cause I've not completely understand what these two objects are for, and how I have to pass to the create method. Edited May 1, 20232 yr by rEDOx_ More explicitly
May 1, 20232 yr Read the link I posted. Repeating that and many other posts: Instead of storing the MobEffect directly in the item, store the RegistryObject<MobEffect> or Supplier<MobEffect> and only use get() on that when you actually need it. A RegistryObject is just a utility object that does all the Registry/ResourceKey/ResourceLocation handling for you and probably more efficiently than you can write it by hand. Edited May 1, 20232 yr by warjort Boilerplate: If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one. If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install Large files should be posted to a file sharing site like https://gist.github.com You should also read the support forum sticky post.
May 1, 20232 yr Author It works like this: public class CustomEffectsRegistry { public static void register(IEventBus eventBus) { MOB_EFFECTS.register(eventBus); } public static final DeferredRegister<MobEffect> MOB_EFFECTS=DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, BetterArmor.MODID); public static final FlyingEffect flyingEffect=new FlyingEffect(MobEffectCategory.BENEFICIAL, 3124687); public static RegistryObject<MobEffect> FLY_REGISTERED_OBJECT=MOB_EFFECTS.register("fly", ()->flyingEffect); } I reference to the object "flyingEffect", is that the "correct way"? I'm still searching in forum for other posts and in the link you provided. You said that I have not to store MobEffect directly into the item, and I thought I wasn't doing that. I stored the output of .register method in RegistryObject and call it. Edit: I tried to call .get() on the "FLY_REGISTERED_OBJECT" in an event fired at runtime and it works. So basically the problem is that a static allocation that imply the call of .get() perform on a not yet created entry. Is this correct? The code up here(and it's consequent use) seemed i bit verbose.
May 1, 20232 yr Quote public static final FlyingEffect flyingEffect=new FlyingEffect(MobEffectCategory.BENEFICIAL, 3124687); public static RegistryObject<MobEffect> FLY_REGISTERED_OBJECT=MOB_EFFECTS.register("fly", ()->flyingEffect); That is not how you defer object construction. That creates the object during class initialisation, could be called anytime. This creates the object when forge calls the supplier.get() at the correct time for registration public static RegistryObject<MobEffect> FLY_REGISTERED_OBJECT=MOB_EFFECTS.register("fly", () -> new FlyingEffect(MobEffectCategory.BENEFICIAL, 3124687)); You need to make sure you understand how suppliers (deferred code) work. They are used everywhere by forge and vanilla. Boilerplate: If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one. If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install Large files should be posted to a file sharing site like https://gist.github.com You should also read the support forum sticky post.
May 1, 20232 yr Author I already read the page on registries in doc. Think I understand where the problem is. Basically The initial code was correct for registries initialization. The problem was that I called the .get() method in a method of a class that extend ArmorItem, the Items are registered before the MobEffect. Edited May 1, 20232 yr by rEDOx_
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.