Hi together, I am in kind of a pickle here. I either missed something on how to register/access the config or I have a conceptional error in my thinking. I want to create a mod that contains several different enchantments -- nothing too spectacular here yet. Via config files I want to make it configurable which enchantments are enabled. Though by trying out I realized that the configurations are loaded AFTER the Registration events have fired. So my question now is: Does anyone know how I can make it configurable if an enchantment is enabled or not? For clarity, here some snippets:
Crash Report (which shows the Config is not initialized yet):
[17:04:59.454] [Server thread/INFO] [minecraft/DedicatedServer]: Starting minecraft server version 1.14.3
[17:04:59.639] [modloading-worker-9/INFO] [ne.mi.co.ForgeMod/FORGEMOD]: Forge mod loading, version 27.0.57, for MC 1.14.3 with MCP 20190624.152911
[17:04:59.672] [modloading-worker-9/INFO] [ne.mi.co.MinecraftForge/FORGE]: MinecraftForge v27.0.57 Initialized
[17:04:59.836] [Server thread/ERROR] [ne.mi.fm.ja.FMLModContainer/]: Exception caught during firing event: Cannot get config value without assigned Config object present
Index: 1
Listeners:
0: NORMAL
1: ASM: class de.oxur.qole.enchantments.Enchantments$RegistrationHandler registerEnchantments(Lnet/minecraftforge/event/RegistryEvent$Register;)V
java.lang.NullPointerException: Cannot get config value without assigned Config object present
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:787)
at net.minecraftforge.common.ForgeConfigSpec$ConfigValue.get(ForgeConfigSpec.java:682)
at de.oxur.qole.enchantments.Enchantments$RegistrationHandler.registerEnchantments(Enchantments.java:30)
at net.minecraftforge.eventbus.ASMEventHandler_0_RegistrationHandler_registerEnchantments_Register.invoke(.dynamic)
at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:80)
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:258)
at net.minecraftforge.fml.javafmlmod.FMLModContainer.fireEvent(FMLModContainer.java:106)
at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65)
at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65)
at net.minecraftforge.fml.ModContainer.transitionState(ModContainer.java:112)
at net.minecraftforge.fml.ModList.lambda$dispatchSynchronousEvent$4(ModList.java:110)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at net.minecraftforge.fml.ModList.dispatchSynchronousEvent(ModList.java:110)
at net.minecraftforge.fml.ModList.lambda$static$0(ModList.java:81)
at net.minecraftforge.fml.LifecycleEventProvider.dispatch(LifecycleEventProvider.java:71)
at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:173)
at net.minecraftforge.fml.ModLoader.lambda$gatherAndInitializeMods$21(ModLoader.java:165)
at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:915)
at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:165)
at net.minecraftforge.fml.server.ServerModLoader.begin(ServerModLoader.java:45)
at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:121)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:585)
at java.lang.Thread.run(Thread.java:748)
[17:04:59.842] [Server thread/ERROR] [ne.mi.fm.ja.FMLModContainer/LOADING]: Caught exception during event RegistryEvent.Register<minecraft:enchantment> dispatch for modid oxur_qole
java.lang.NullPointerException: Cannot get config value without assigned Config object present
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:787) ~[server-1.14.3-extra.jar:?] {}
at net.minecraftforge.common.ForgeConfigSpec$ConfigValue.get(ForgeConfigSpec.java:682) ~[?:?] {}
at de.oxur.qole.enchantments.Enchantments$RegistrationHandler.registerEnchantments(Enchantments.java:30) ~[?:1.0] {}
at net.minecraftforge.eventbus.ASMEventHandler_0_RegistrationHandler_registerEnchantments_Register.invoke(.dynamic) ~[?:?] {}
at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:80) ~[eventbus-0.10.3-milestone.0.1+1a5fa31-service.jar:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:258) ~[eventbus-0.10.3-milestone.0.1+1a5fa31-service.jar:?] {}
at net.minecraftforge.fml.javafmlmod.FMLModContainer.fireEvent(FMLModContainer.java:106) ~[?:27.0] {}
at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65) ~[?:1.8.0_211] {}
at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65) ~[?:1.8.0_211] {}
at net.minecraftforge.fml.ModContainer.transitionState(ModContainer.java:112) ~[?:?] {}
at net.minecraftforge.fml.ModList.lambda$dispatchSynchronousEvent$4(ModList.java:110) ~[?:?] {}
at java.util.ArrayList.forEach(ArrayList.java:1257) ~[?:1.8.0_211] {}
at net.minecraftforge.fml.ModList.dispatchSynchronousEvent(ModList.java:110) ~[?:?] {}
at net.minecraftforge.fml.ModList.lambda$static$0(ModList.java:81) ~[?:?] {}
at net.minecraftforge.fml.LifecycleEventProvider.dispatch(LifecycleEventProvider.java:71) ~[?:?] {}
at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:173) ~[?:?] {}
at net.minecraftforge.fml.ModLoader.lambda$gatherAndInitializeMods$21(ModLoader.java:165) ~[?:?] {}
at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:915) [?:?] {}
at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:165) [?:?] {}
at net.minecraftforge.fml.server.ServerModLoader.begin(ServerModLoader.java:45) [?:?] {}
at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:121) [?:?] {pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:585) [?:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A}
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_211] {}
[17:04:59.863] [Server thread/FATAL] [ne.mi.fm.ModLoader/LOADING]: Failed to complete lifecycle event LOAD_REGISTRIES, 1 errors found
[17:04:59.864] [Server thread/ERROR] [minecraft/MinecraftServer]: Encountered an unexpected exception
net.minecraftforge.fml.LoadingFailedException: null
at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:177) ~[?:?] {}
at net.minecraftforge.fml.ModLoader.lambda$gatherAndInitializeMods$21(ModLoader.java:165) ~[?:?] {}
at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:915) ~[?:?] {}
at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:165) ~[?:?] {}
at net.minecraftforge.fml.server.ServerModLoader.begin(ServerModLoader.java:45) ~[?:?] {}
at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:121) ~[?:?] {pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:585) [?:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A}
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_211] {}
[17:04:59.896] [Server thread/ERROR] [minecraft/MinecraftServer]: This crash report has been saved to: C:\Users\USERNAME\Documents\Forge\server\.\crash-reports\crash-2019-07-18_17.04.59-server.txt
[17:04:59.920] [Server thread/INFO] [minecraft/MinecraftServer]: Stopping server
[17:04:59.920] [Server thread/INFO] [minecraft/MinecraftServer]: Saving worlds
[17:04:59.929] [Server thread/ERROR] [minecraft/MinecraftServer]: Exception stopping the server
java.lang.IllegalArgumentException: Can not hotload overworld. This must be loaded at all times by main Server.
at org.apache.commons.lang3.Validate.isTrue(Validate.java:158) ~[server-1.14.3-extra.jar:?] {}
at net.minecraftforge.common.DimensionManager.initWorld(DimensionManager.java:201) ~[?:?] {}
at net.minecraftforge.common.DimensionManager.getWorld(DimensionManager.java:170) ~[?:?] {}
at net.minecraft.server.MinecraftServer.func_71218_a(MinecraftServer.java:958) ~[?:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.server.MinecraftServer.func_213211_a(MinecraftServer.java:508) ~[?:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.server.MinecraftServer.func_71260_j(MinecraftServer.java:540) ~[?:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.server.dedicated.DedicatedServer.func_71260_j(DedicatedServer.java:540) ~[?:?] {pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:645) [?:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A}
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_211] {}
Config class (Don't bother about the SERVER variable, but config COMMON type. I was playing around with the different types of configs, thats all):
package de.oxur.qole;
import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.config.ModConfig;
import org.apache.commons.lang3.tuple.Pair;
public class QoLEModConfig {
private static final ForgeConfigSpec serverSpec;
public static final Server SERVER;
static {
final Pair<Server, ForgeConfigSpec> specPair = new ForgeConfigSpec.Builder().configure(Server::new);
serverSpec = specPair.getRight();
SERVER = specPair.getLeft();
}
public static void register(final ModLoadingContext context) {
context.registerConfig(ModConfig.Type.COMMON, serverSpec);
}
public static class Server {
public final ForgeConfigSpec.BooleanValue enableVeinminer;
Server(final ForgeConfigSpec.Builder builder) {
builder.comment("Enable and disable enchantments").push("enchantments");
enableVeinminer = builder
.comment("Enables or disables the veinminer enchantment")
.translation("oxur_qole.config.common.enableVeinminer")
.define("enableVeinminer", true);
builder.pop();
}
}
}
ModClass constructor:
public QoLEMod() {
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
QoLEModConfig.register(ModLoadingContext.get());
}
EventHandler responsible for registering the enchantment and causing the crash:
@SubscribeEvent
public static void registerEnchantments(final RegistryEvent.Register<Enchantment> event) {
LOGGER.debug("Registering enchantments of {}", QoLEMod.MODID);
IForgeRegistry<Enchantment> registry = event.getRegistry();
if(QoLEModConfig.SERVER.enableVeinminer.get()) {
Enchantment enchantment = new VeinminerEnchantment(Enchantment.Rarity.UNCOMMON, EnchantmentType.DIGGER, EquipmentSlotType.MAINHAND).setRegistryName("veinminer");
registry.register(enchantment);
}
}
Thanks in advance