Advertisement
Superloup10

WolflinModLanguageProvider

Jan 28th, 2019
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.56 KB | None | 0 0
  1. package fr.wolfdev.wolflin.lang
  2.  
  3. import net.minecraftforge.fml.Logging.LOADING
  4. import net.minecraftforge.fml.Logging.SCAN
  5. import net.minecraftforge.forgespi.language.ILifecycleEvent
  6. import net.minecraftforge.forgespi.language.IModInfo
  7. import net.minecraftforge.forgespi.language.IModLanguageProvider
  8. import net.minecraftforge.forgespi.language.ModFileScanData
  9. import org.apache.logging.log4j.LogManager
  10. import org.objectweb.asm.Type
  11. import java.lang.reflect.InvocationTargetException
  12. import java.util.function.Consumer
  13. import java.util.function.Function
  14. import java.util.function.Supplier
  15. import java.util.stream.Collectors
  16.  
  17. class WolflinModLanguageProvider: IModLanguageProvider {
  18.     companion object {
  19.         private val LOGGER = LogManager.getLogger()
  20.         val MOD_ANNOTATION = Type.getType("Lnet/minecraftforge/fml/common/Mod;")
  21.     }
  22.  
  23.     override fun name() = "kotlinfml"
  24.     override fun getFileVisitor(): Consumer<ModFileScanData> {
  25.         return Consumer {scanResult ->
  26.             val modTargetMap = scanResult.annotations.stream()
  27.                     .filter {ad -> ad.annotationType == MOD_ANNOTATION}
  28.                     .peek {ad -> LOGGER.debug(SCAN, "Found @Mod class ${ad.classType.className} with id ${ad.annotationData["value"]}")}
  29.                     .map {ad -> WolflinModTarget(ad.classType.className, ad.annotationData["value"] as String)}
  30.                     .collect(Collectors.toMap<WolflinModTarget, String, WolflinModTarget>(Function<WolflinModTarget, String> {it.modid}, Function.identity<WolflinModTarget>()))
  31.             scanResult.addLanguageLoader(modTargetMap)
  32.         }
  33.     }
  34.  
  35.     override fun <R: ILifecycleEvent<R>?> consumeLifecycleEvent(consumeEvent: Supplier<R>?) {
  36.     }
  37.  
  38.     private class WolflinModTarget(val className: String, val modid: String): IModLanguageProvider.IModLanguageLoader {
  39.         val LOGGER = WolflinModLanguageProvider.LOGGER
  40.         @Suppress("UNCHECKED_CAST")
  41.         override fun <T: Any?> loadMod(info: IModInfo?, modClassLoader: ClassLoader?, modFileScanResults: ModFileScanData?): T {
  42.             try {
  43.                 val wolflinModContainer = Class.forName("fr.wolfdev.wolflin.lang.WolflinModContainer", true, Thread.currentThread().contextClassLoader)
  44.                 LOGGER.debug(LOADING, "Loading WolflinModContainer from classloader ${Thread.currentThread().contextClassLoader} - got ${wolflinModContainer.classLoader}")
  45.                 val constructor = wolflinModContainer.getConstructor(IModInfo::class.java, String::class.java, ClassLoader::class.java, ModFileScanData::class.java)
  46.                 return constructor.newInstance(info, className, modClassLoader, modFileScanResults) as T
  47.             } catch(e: NoSuchMethodException) {
  48.                 LOGGER.fatal(LOADING, "Unable to load WolflinModContainer, wut?", e)
  49.                 throw RuntimeException(e)
  50.             } catch(e: ClassNotFoundException) {
  51.                 LOGGER.fatal(LOADING, "Unable to load WolflinModContainer, wut?", e)
  52.                 throw RuntimeException(e)
  53.             } catch(e: InstantiationException) {
  54.                 LOGGER.fatal(LOADING, "Unable to load WolflinModContainer, wut?", e)
  55.                 throw RuntimeException(e)
  56.             } catch(e: IllegalAccessException) {
  57.                 LOGGER.fatal(LOADING, "Unable to load WolflinModContainer, wut?", e)
  58.                 throw RuntimeException(e)
  59.             } catch(e: InvocationTargetException) {
  60.                 LOGGER.fatal(LOADING, "Unable to load WolflinModContainer, wut?", e)
  61.                 throw RuntimeException(e)
  62.             }
  63.         }
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement