diff --git a/gradle.properties b/gradle.properties index 7fb36a9..35eb43e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ archivesBaseName = Forgelin mc_version = 1.12.2 mappings_channel = snapshot mappings_version = 20180921-1.13 -forge_version = net.minecraftforge.test:forge:1.13-24.0.183-1.13-pre +forge_version = net.minecraftforge.test:forge:1.13-24.0.191-1.13-pre kotlin_version = 1.3.21 annotations_version = 17.0.0 diff --git a/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModContainer.kt b/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModContainer.kt index 2e6eff2..4fc32ae 100644 --- a/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModContainer.kt +++ b/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModContainer.kt @@ -4,14 +4,17 @@ import net.minecraftforge.eventbus.EventBusErrorMessage import net.minecraftforge.eventbus.api.Event import net.minecraftforge.eventbus.api.IEventBus import net.minecraftforge.eventbus.api.IEventListener -import net.minecraftforge.fml.* +import net.minecraftforge.fml.LifecycleEventProvider import net.minecraftforge.fml.Logging.LOADING -import net.minecraftforge.fml.config.ModConfig +import net.minecraftforge.fml.ModContainer +import net.minecraftforge.fml.ModLoadingException +import net.minecraftforge.fml.ModLoadingStage import net.minecraftforge.forgespi.language.IModInfo import net.minecraftforge.forgespi.language.ModFileScanData import org.apache.logging.log4j.LogManager import java.util.* import java.util.function.Consumer +import java.util.function.Supplier class FMLKotlinModContainer( info: IModInfo, @@ -36,7 +39,10 @@ class FMLKotlinModContainer( triggerMap[ModLoadingStage.PROCESS_IMC] = dummy().andThen(::beforeEvent).andThen(::fireEvent).andThen(::afterEvent) triggerMap[ModLoadingStage.COMPLETE] = dummy().andThen(::beforeEvent).andThen(::fireEvent).andThen(::afterEvent) eventBus = IEventBus.create(::onEventFailed) - configHandler = Optional.of>(Consumer { event -> eventBus.post(event) }) + configHandler = Optional.of(Consumer { event -> eventBus.post(event) }) + + val contextExtension = FMLKotlinModLoadingContext.Context(this) + this.contextExtension = Supplier { contextExtension } try { // Here, we won't init the class, meaning static {} blocks (init {} in kotlin) won't get triggered @@ -70,10 +76,7 @@ class FMLKotlinModContainer( private fun dummy(): Consumer = Consumer {} - private fun beforeEvent(lifecycleEvent: LifecycleEventProvider.LifecycleEvent) { - FMLKotlinModLoadingContext.get().activeContainer = this - ModThreadContext.get().activeContainer = this - } + private fun beforeEvent(lifecycleEvent: LifecycleEventProvider.LifecycleEvent) {} private fun fireEvent(lifecycleEvent: LifecycleEventProvider.LifecycleEvent) { val event = lifecycleEvent.getOrBuildEvent(this) @@ -89,8 +92,6 @@ class FMLKotlinModContainer( } private fun afterEvent(lifecycleEvent: LifecycleEventProvider.LifecycleEvent) { - ModThreadContext.get().activeContainer = null - FMLKotlinModLoadingContext.get().activeContainer = null if (currentState == ModLoadingStage.ERROR) { logger.error(LOADING, "An error occurred while dispatching event {} to {}", lifecycleEvent.fromStage(), getModId()) } diff --git a/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModLoadingContext.kt b/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModLoadingContext.kt index c7dc08b..e0a9b39 100644 --- a/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModLoadingContext.kt +++ b/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModLoadingContext.kt @@ -1,34 +1,15 @@ package net.shadowfacts.forgelin -import net.minecraftforge.common.ForgeConfigSpec import net.minecraftforge.eventbus.api.IEventBus -import net.minecraftforge.fml.ExtensionPoint -import net.minecraftforge.fml.config.ModConfig -import java.util.function.Supplier +import net.minecraftforge.fml.ModLoadingContext object FMLKotlinModLoadingContext { - private val context = ThreadLocal.withInitial { Context() } - fun get(): Context { - return context.get() + return ModLoadingContext.get().extension() } - class Context { - var activeContainer: FMLKotlinModContainer? = null - + class Context(private val container: FMLKotlinModContainer) { val modEventBus: IEventBus - get() = activeContainer!!.eventBus - - fun registerExtensionPoint(point: ExtensionPoint, extension: Supplier) { - activeContainer!!.registerExtensionPoint(point, extension) - } - - fun registerConfig(type: ModConfig.Type, spec: ForgeConfigSpec) { - activeContainer!!.addConfig(ModConfig(type, spec, activeContainer!!)) - } - - fun registerConfig(type: ModConfig.Type, spec: ForgeConfigSpec, fileName: String) { - activeContainer!!.addConfig(ModConfig(type, spec, activeContainer, fileName)) - } + get() = container.eventBus } } \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModTarget.kt b/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModTarget.kt index 27193d4..dc9d7a8 100644 --- a/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModTarget.kt +++ b/src/main/kotlin/net/shadowfacts/forgelin/FMLKotlinModTarget.kt @@ -5,20 +5,21 @@ import net.minecraftforge.forgespi.language.IModInfo import net.minecraftforge.forgespi.language.IModLanguageProvider import net.minecraftforge.forgespi.language.ModFileScanData import org.apache.logging.log4j.LogManager +import java.lang.Exception class FMLKotlinModTarget(private val className: String, val modId: String) : IModLanguageProvider.IModLanguageLoader { private val logger = LogManager.getLogger() override fun loadMod(info: IModInfo, modClassLoader: ClassLoader, modFileScanResults: ModFileScanData): T { - // This language class is loaded in the system level classloader - before the game even starts - // So we must treat container construction as an arms length operation, and load the container - // in the classloader of the game - the context classloader is appropriate here. try { + return FMLKotlinModContainer(info, className, modClassLoader, modFileScanResults) as T + + /*logger.debug(LOADING, "Loading FMLKotlinModContainer from classloader {}", Thread.currentThread().contextClassLoader) val fmlContainer = Class.forName("net.shadowfacts.forgelin.FMLKotlinModContainer", true, Thread.currentThread().contextClassLoader) - logger.debug(LOADING, "Loading FMLKotlinModContainer from classloader {} - got {}", Thread.currentThread().contextClassLoader, fmlContainer.classLoader) + logger.debug(LOADING, "Loading FMLKotlinModContainer got {}", fmlContainer.classLoader) val constructor = fmlContainer.getConstructor(IModInfo::class.java, String::class.java, ClassLoader::class.java, ModFileScanData::class.java) - return constructor.newInstance(info, className, modClassLoader, modFileScanResults) as T - } catch (e: ReflectiveOperationException) { + return constructor.newInstance(info, className, modClassLoader, modFileScanResults) as T*/ + } catch (e: Exception) { logger.fatal(LOADING, "Unable to load FMLKotlinModContainer, wut?", e) throw e }