Coder Social home page Coder Social logo

unimined's Introduction

Unimined

unified minecraft modding environment with support for legacy environments.

for details on usage, see USAGE.md

LTS Branch

In order to better support buildscripts. when I plan on making big/breaking changes, I will leave an LTS branch behind. In effect, this means that I always support the previous minor version for bugfixes.

By consequence, seeing as it's only bugfixes, snapshots on the LTS branch are considered relatively stable as well.

Supported Loaders

Planned Loaders

  • Bukkit Derrivitives (at least paper)
  • LiteLoader
  • Sponge
  • NilLoader

Custom Loaders

yes, this is possible, see PrcraftExampleMod and it's buildsrc dir.

TODO

  • stop using artifactural
  • rework mcpconfig runner to be more kotlin and less old version of arch-loom code
  • Support for launch configs in other dev envs
    • vscode
    • eclipse
  • support to login to minecraft in dev
  • support to launch with the prod jar
  • add datagen support
    • forge datagen
    • fabric datagen
    • quilt datagen
  • fix yarn on neoforge (these will probably be agents, possibly in separate projects and pulled like JarModAgent)
    • inject remapper into ASMAPI
    • reflection remapper (also for forge potentially, or in general).
  • genSources should apply forge source patches (at least on fg3+)

Recommended Setup

  1. take one of the versions from testing
  2. remove includeBuild('../../') from settings.gradle
  3. put a proper version number for the plugin in build.grade

Other Setups

Arch-Loom Style

  • direct porting of arch-loom projects without changing the directory structure is possible.
  • instructions pending...

third party template(s)

unimined's People

Contributors

wagyourtail avatar thecatcore avatar halotroop2288 avatar cdagaming avatar hypherionmc avatar 3arthqu4ke avatar

Stargazers

TexTrue avatar  avatar  avatar Miles avatar NickAc avatar Yuri Torlopov avatar Lilly Rose Berner avatar NothingButYou avatar Thomas Wearmouth avatar  avatar alikindsys avatar holmraven avatar James Seibel avatar  avatar Robin Bärtschi avatar Eitam Belahousky avatar Talon Kettuso avatar  avatar RazrCraft avatar  avatar Legoshi avatar Wyatt Stanke avatar 8Mi_Yile avatar  avatar EnZaXD avatar Deftware avatar Rortti avatar  avatar Ehan avatar  avatar auto avatar Ahmad Ansori Palembani avatar mineral avatar Gentleman avatar John avatar kurrycat avatar  avatar  avatar Flamarine Elixirium avatar jordin avatar Brady Hahn avatar staykiller avatar SooStrator avatar Potato Sus avatar  avatar Atakku avatar Linnea Gräf avatar ENDERZOMBI102 avatar  avatar ³ʳᵈ avatar  avatar  avatar  avatar Amukh1 avatar Josiah Glosson avatar xtrm avatar

Watchers

Lucian avatar  avatar  avatar  avatar  avatar

unimined's Issues

Tests todolist

Tests todolist:

  • MappingNamespace
    • searge/official to mojmap/searge
    • searge/official to yarn/intermediary
    • can't remap directly from official to mcp without target
    • remap directly from official to mcp with official target
    • mcp/searge to mojmap/searge
    • searge/official to mcp/searge
    • mojmap/intermediary to searge/searge
    • mcp/searge to mcp/mcp
    • yarn/intermediary to mcp/searge
  • GlobToRegex
  • Interface Injection
    • from mod
  • ATs/AWs
    • AW
      • Remapping
    • AT
      • Remapping
    • Conversion
      • AT to AW
      • AW to AT
      • Old AT to new AT
      • New AT to old AT
      • AW Merging
  • Fabric like module extension
    • Fabric API
    • Quilt Standard API
    • Quilted Fabric API
    • Legacy Fabric API
    • StationAPI
  • Mixin Support
    • Remapping
    • ME support
  • Run configs

Support for Bukkit Derrivitives

it would be nice to be able to directly work with server-only applications or components in unimined.

this includes nms support

minimum required:

  • paper
  • spigot

Long directory names due to mappings are invalid on Windows

Unable to run genSources without using useGlobalCache=true. Maybe it should just a be a hash of the mappings?

image

Full log
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':forgeGenSources'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:149)
	at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:147)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:338)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:325)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:318)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:304)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: org.gradle.process.internal.ExecException: A problem occurred starting process 'command 'C:\Program Files\Java\jdk-18.0.2.1\bin\java.exe''
	at org.gradle.process.internal.DefaultExecHandle.execExceptionFor(DefaultExecHandle.java:241)
	at org.gradle.process.internal.DefaultExecHandle.setEndStateInfo(DefaultExecHandle.java:218)
	at org.gradle.process.internal.DefaultExecHandle.failed(DefaultExecHandle.java:370)
	at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:87)
	at org.gradle.internal.operations.CurrentBuildOperationPreservingRunnable.run(CurrentBuildOperationPreservingRunnable.java:42)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: net.rubygrapefruit.platform.NativeException: Could not start 'C:\Program Files\Java\jdk-18.0.2.1\bin\java.exe'
	at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:27)
	at net.rubygrapefruit.platform.internal.WindowsProcessLauncher.start(WindowsProcessLauncher.java:22)
	at net.rubygrapefruit.platform.internal.WrapperProcessLauncher.start(WrapperProcessLauncher.java:36)
	at org.gradle.process.internal.ExecHandleRunner.startProcess(ExecHandleRunner.java:98)
	at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:71)
	... 3 more
Caused by: java.io.IOException: Cannot run program "C:\Program Files\Java\jdk-18.0.2.1\bin\java.exe" (in directory "C:\Users\brady\IdeaProjects\unimined\testing\1.20-Forge-Fabric\.gradle\unimined\net\minecraft\minecraft\1.20\forge\1.20-46.0.2\intermediary-1.20-mojmap-1.20-official-e5ae957509e014f4ff578e1382b4e07880d18b4b-parchment-2023.03.12-nightly-SNAPSHOT-searge-1.20-20230608.053357"): CreateProcess error=267, The directory name is invalid
	at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25)
	... 7 more
Caused by: java.io.IOException: CreateProcess error=267, The directory name is invalid
	... 8 more

Forge mixins in dev envoirement

Im using the preset from testing 1.8.9-Forge-Fabric and implemented the dependency with version 1.1.0. I know that in the test it say 1.0.0 but that version doesnt have the combinewith operator which is used in build.gradle. When i run fabric client the mixin loads and everything works fine. Though when i run forge client the mixin doesnt load and it throws multiple exceptions. Also my guess is that it is not caused by the version 1.1.0 since ive tried on 1.0.0 in another project without combineWith and it still throws similar exceptions. I basically copied the dir from testing removed the line in settings.gradle. then i made a buildSrc dir where i put another build gradle which sets the unimined dependency. i have not changed anything else. What am i doing wrong here? Thank you in advance.

[22:48:34] [Client thread/ERROR] [FML]: Unable to read a class file correctly
java.lang.IllegalArgumentException
at org.objectweb.asm.ClassReader.(Unknown Source) ~[asm-all-5.0.3.jar:5.0.3]
at org.objectweb.asm.ClassReader.(Unknown Source) ~[asm-all-5.0.3.jar:5.0.3]
at org.objectweb.asm.ClassReader.(Unknown Source) ~[asm-all-5.0.3.jar:5.0.3]
at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:52) [ASMModParser.class:?]
at net.minecraftforge.fml.common.discovery.JarDiscoverer.discover(JarDiscoverer.java:69) [JarDiscoverer.class:?]
at net.minecraftforge.fml.common.discovery.ContainerType.findMods(ContainerType.java:42) [ContainerType.class:?]
at net.minecraftforge.fml.common.discovery.ModCandidate.explore(ModCandidate.java:71) [ModCandidate.class:?]
at net.minecraftforge.fml.common.discovery.ModDiscoverer.identifyMods(ModDiscoverer.java:134) [ModDiscoverer.class:?]
at net.minecraftforge.fml.common.Loader.identifyMods(Loader.java:363) [Loader.class:?]
at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:488) [Loader.class:?]
at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:208) [FMLClientHandler.class:?]
at net.minecraft.client.Minecraft.startGame(Minecraft.java:417) [Minecraft.class:?]
at net.minecraft.client.Minecraft.run(Minecraft.java:329) [Minecraft.class:?]
at net.minecraft.client.main.Main.main(Main.java:124) [Main.class:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_371]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_371]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_371]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_371]
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
[22:48:34] [Client thread/ERROR] [FML]: There was a problem reading the entry META-INF/versions/9/module-info.class in the jar C:\Users\Werder.gradle\caches\modules-2\files-2.1\org.jetbrains\annotations\24.0.1\13c5c75c4206580aa4d683bffee658caae6c9f43\annotations-24.0.1.jar - probably a corrupt zip
net.minecraftforge.fml.common.LoaderException: java.lang.IllegalArgumentException

at net.minecraftforge.fml.common.discovery.asm.ASMModParser.<init>(ASMModParser.java:58) ~[ASMModParser.class:?]
at net.minecraftforge.fml.common.discovery.JarDiscoverer.discover(JarDiscoverer.java:69) [JarDiscoverer.class:?]
at net.minecraftforge.fml.common.discovery.ContainerType.findMods(ContainerType.java:42) [ContainerType.class:?]
at net.minecraftforge.fml.common.discovery.ModCandidate.explore(ModCandidate.java:71) [ModCandidate.class:?]
at net.minecraftforge.fml.common.discovery.ModDiscoverer.identifyMods(ModDiscoverer.java:134) [ModDiscoverer.class:?]
at net.minecraftforge.fml.common.Loader.identifyMods(Loader.java:363) [Loader.class:?]
at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:488) [Loader.class:?]
at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:208) [FMLClientHandler.class:?]
at net.minecraft.client.Minecraft.startGame(Minecraft.java:417) [Minecraft.class:?]
at net.minecraft.client.Minecraft.run(Minecraft.java:329) [Minecraft.class:?]
at net.minecraft.client.main.Main.main(Main.java:124) [Main.class:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_371]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_371]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_371]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_371]
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]

Caused by: java.lang.IllegalArgumentException
at org.objectweb.asm.ClassReader.(Unknown Source) ~[asm-all-5.0.3.jar:5.0.3]
at org.objectweb.asm.ClassReader.(Unknown Source) ~[asm-all-5.0.3.jar:5.0.3]
at org.objectweb.asm.ClassReader.(Unknown Source) ~[asm-all-5.0.3.jar:5.0.3]
at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:52) ~[ASMModParser.class:?]
... 16 more
[22:48:34] [Client thread/WARN] [FML]: Zip file annotations-24.0.1.jar failed to read properly, it will be ignored
net.minecraftforge.fml.common.LoaderException: java.lang.IllegalArgumentException

at net.minecraftforge.fml.common.discovery.asm.ASMModParser.<init>(ASMModParser.java:58) ~[ASMModParser.class:?]
at net.minecraftforge.fml.common.discovery.JarDiscoverer.discover(JarDiscoverer.java:69) [JarDiscoverer.class:?]
at net.minecraftforge.fml.common.discovery.ContainerType.findMods(ContainerType.java:42) [ContainerType.class:?]
at net.minecraftforge.fml.common.discovery.ModCandidate.explore(ModCandidate.java:71) [ModCandidate.class:?]
at net.minecraftforge.fml.common.discovery.ModDiscoverer.identifyMods(ModDiscoverer.java:134) [ModDiscoverer.class:?]
at net.minecraftforge.fml.common.Loader.identifyMods(Loader.java:363) [Loader.class:?]
at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:488) [Loader.class:?]
at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:208) [FMLClientHandler.class:?]
at net.minecraft.client.Minecraft.startGame(Minecraft.java:417) [Minecraft.class:?]
at net.minecraft.client.Minecraft.run(Minecraft.java:329) [Minecraft.class:?]
at net.minecraft.client.main.Main.main(Main.java:124) [Main.class:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_371]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_371]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_371]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_371]
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]

Caused by: java.lang.IllegalArgumentException
at org.objectweb.asm.ClassReader.(Unknown Source) ~[asm-all-5.0.3.jar:5.0.3]
at org.objectweb.asm.ClassReader.(Unknown Source) ~[asm-all-5.0.3.jar:5.0.3]
at org.objectweb.asm.ClassReader.(Unknown Source) ~[asm-all-5.0.3.jar:5.0.3]
at net.minecraftforge.fml.common.discovery.asm.ASMModParser.(ASMModParser.java:52) ~[ASMModParser.class:?]
... 16 more

Fabric API Mixin apply InvalidInjectionException in dev environment

Background

I'm trying to convert Distant Horizons, a multi loader (forge, neo, and fabric) project, from Architectury to Unimined and recently ran into an issue.

Issue

I'm able to run all 3 loaders in retail MC without issue and forge/neo via gradle (./gradlew forge:runClient / ./gradlew neoforge:runClient); but attempting to run the fabric version via gradle (./gradlew fabric:runClient) causes the game to crash due to a failed fabric API mixin.

[20:51:58] [Render thread/WARN]: Error loading class: net/minecraft/client/render/WorldRenderer (java.lang.ClassNotFoundException: net/minecraft/client/render/WorldRenderer)
[20:51:58] [Render thread/ERROR]: Mixin apply for mod fabric-rendering-v1 failed fabric-rendering-v1.mixins.json:WorldRendererMixin from mod fabric-rendering-v1 -> net.minecraft.client.renderer.LevelRenderer: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException @Inject annotation on onReload specifies a target class 'net/minecraft/client/render/WorldRenderer', which is not supported [PREINJECT Applicator Phase -> fabric-rendering-v1.mixins.json:WorldRendererMixin from mod fabric-rendering-v1 -> Prepare Injections ->  -> handler$zzk000$fabric-rendering-v1$onReload(Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;)V -> Parse]
org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: @Inject annotation on onReload specifies a target class 'net/minecraft/client/render/WorldRenderer', which is not supported [PREINJECT Applicator Phase -> fabric-rendering-v1.mixins.json:WorldRendererMixin from mod fabric-rendering-v1 -> Prepare Injections ->  -> handler$zzk000$fabric-rendering-v1$onReload(Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;)V -> Parse]
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parseSelectors(InjectionInfo.java:355) ~[sponge-mixin-0.12.5+mixin.0.8.5.jar:0.12.5+mixin.0.8.5]

Full crash log:
latest.log

Attempted Fixes

I've tried:

  • Running in different versions of Minecraft
    • Specifically 1.20.4, 1.20.2, 1.20.1, and 1.19.4
  • Updating the fabric API to the latest version
  • Update the fabric loader to the latest version
  • Using different Unimined versions (0.1.2-SNAPSHOT, 1.2.0, 1.2.0-SNAPSHOT)
  • Clearing my gradle cache
  • Compiling/running on a different computer

In every test I saw exactly the same error.

If I comment out the fabric-rendering-v1 line in our fabric build.gradle file (and its references in code), the game runs normally. Unfortunately we kinda need that for our code to work. 😉

Related Build Files

main gradle files:
gradle.properties.txt
build.gradle.txt
settings.gradle.txt

Fabric gradle file:
build.gradle.txt

If you need a minimal reproduction case please let me know.

Moving Forward

I'm a bit concerned/confused since we had Unimined working previously and after pulling down the old known-working project fresh, I got the exact same error.

Having run into this unexplained issue I'm a bit hesitant to move Distant Horizons away from Architectury, although I'm still hoping the issue is something on my end. Otherwise is it possible Unimined has a dependency that changed between all it's versions?

Feature Request: Remap non artifact dependencies

Currently only artifacts get remapped (https://docs.gradle.org/current/javadoc/org/gradle/api/artifacts/ResolvedConfiguration.html#getResolvedArtifacts--) but other dependencies do not get remapped (those files can still be accessed using https://docs.gradle.org/current/javadoc/org/gradle/api/artifacts/ResolvedConfiguration.html#getFiles--).

So things like this will not get remapped:

val downloadTask by tasks.creating {
	val outputFile = layout.buildDirectory.file("download/someexternalmod.jar")
	outputs.file(outputFile)
	doLast {
		outputFile.get().asFile.parentFile.mkdirs()
		uri("http://some.external/download.jar").toURL().openStream().use {input ->
			outputFile.get().asFile.outputStream().use {output ->
				input.copyTo(output)
			} 
		}
	}
}

dependencies {
	"modImplementation"(project.files(downloadTask))
	"modImplementation"(project.fileTree("deps/**"))
}

java.lang.LinkageError: loader constraint violation: when resolving method 'net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type.get(kotlinx.metadata.internal.extensions.KmTypeExtension)'

Crash when running ./gradlew remapjar. This project has a subproject called common which is pure kotlin and java. Running openjdk 19 and gradle 8.1.

Build.gradle.kts
import java.io.ByteArrayOutputStream
import java.net.URL

plugins {
    idea
    java
    `maven-publish`
    id("xyz.wagyourtail.unimined") version "1.0.5"
    id("org.cadixdev.licenser") version "0.6.1"
    id("org.jetbrains.dokka") version "1.8.10"
    kotlin("jvm") version "1.8.21"
}


allprojects {
    repositories {
        mavenLocal()
        mavenCentral()
        maven("https://repo.nea.moe/releases")
    }
}
java.toolchain.languageVersion.set(JavaLanguageVersion.of(8))

unimined.minecraft {
    version("1.8.9")
    mappings {
        searge()
        mcp("stable", "22-1.8.9")
    }
    minecraftForge {
        loader("11.15.1.2318-1.8.9")
    }
    runs {
        config("client") {
            this.jvmArgs.add("-Dmoulconfig.testmod=true")
            this.args.add(0, "--tweakClass")
            this.args.add(1, "net.minecraftforge.fml.common.launcher.FMLTweaker")
        }
    }
}
val include by configurations.creating {
    isVisible = true
}
configurations.compileClasspath {
    extendsFrom(include)
}
configurations.runtimeClasspath {
    extendsFrom(include)
}

dependencies {
    annotationProcessor("org.projectlombok:lombok:1.18.26")
    compileOnly("org.projectlombok:lombok:1.18.26")
    compileOnly("org.jetbrains:annotations:24.0.1")
    include(project(":common"))
}

sourceSets.main {
    output.setResourcesDir(java.classesDirectory)
}
afterEvaluate {
    tasks.jar {
        val commonTask = (tasks.findByPath(":common:jar") as Zip)
        dependsOn(commonTask)
        from(zipTree(commonTask.archiveFile))
    }
}
tasks.withType(JavaCompile::class) {
    options.encoding = "UTF-8"
}

project.afterEvaluate {
    tasks.named("runClient", JavaExec::class) {
        this.javaLauncher.set(javaToolchains.launcherFor {
            languageVersion.set(JavaLanguageVersion.of(8))
        })
    }
}
Gradle log

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':remapJar'.
> java.util.concurrent.ExecutionException: java.lang.LinkageError: loader constraint violation: when resolving method 'net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type.get(kotlinx.metadata.internal.extensions.KmTypeExtension)' the class loader net.fabricmc.loom.util.kotlin.KotlinRemapperClassloader @45833309 of the current class, net/fabricmc/loom/kotlin/remapping/KotlinClassRemapper, and the class loader org.gradle.internal.classloader.VisitableURLClassLoader$InstrumentingVisitableURLClassLoader @3cf3a169 for the method's defining class, net/fabricmc/loom/util/kotlin/JvmExtensionWrapper$Type, have different Class objects for the type kotlinx/metadata/internal/extensions/KmTypeExtension used in the signature (net.fabricmc.loom.kotlin.remapping.KotlinClassRemapper is in unnamed module of loader net.fabricmc.loom.util.kotlin.KotlinRemapperClassloader @45833309, parent loader 'bootstrap'; net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type is in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader$InstrumentingVisitableURLClassLoader @3cf3a169, parent loader org.gradle.internal.classloader.CachingClassLoader @79cdb8fa)

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':remapJar'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:149)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:147)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:337)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:324)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:317)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.LinkageError: loader constraint violation: when resolving method 'net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type.get(kotlinx.metadata.internal.extensions.KmTypeExtension)' the class loader net.fabricmc.loom.util.kotlin.KotlinRemapperClassloader @45833309 of the current class, net/fabricmc/loom/kotlin/remapping/KotlinClassRemapper, and the class loader org.gradle.internal.classloader.VisitableURLClassLoader$InstrumentingVisitableURLClassLoader @3cf3a169 for the method's defining class, net/fabricmc/loom/util/kotlin/JvmExtensionWrapper$Type, have different Class objects for the type kotlinx/metadata/internal/extensions/KmTypeExtension used in the signature (net.fabricmc.loom.kotlin.remapping.KotlinClassRemapper is in unnamed module of loader net.fabricmc.loom.util.kotlin.KotlinRemapperClassloader @45833309, parent loader 'bootstrap'; net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type is in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader$InstrumentingVisitableURLClassLoader @3cf3a169, parent loader org.gradle.internal.classloader.CachingClassLoader @79cdb8fa)
        at net.fabricmc.tinyremapper.TinyRemapper.waitForAll(TinyRemapper.java:1170)
        at net.fabricmc.tinyremapper.TinyRemapper.apply(TinyRemapper.java:912)
        at net.fabricmc.tinyremapper.TinyRemapper.apply(TinyRemapper.java:872)
        at xyz.wagyourtail.unimined.internal.mods.task.RemapJarTaskImpl.remapToInternal(RemapJarTaskImpl.kt:153)
        at xyz.wagyourtail.unimined.internal.mods.task.RemapJarTaskImpl.run(RemapJarTaskImpl.kt:93)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:227)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:210)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:193)
        at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:166)
        at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
        at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:28)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.executeDelegateBroadcastingChanges(CaptureStateAfterExecutionStep.java:100)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:72)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:50)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:166)
        at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:70)
        at org.gradle.internal.Either$Right.fold(Either.java:175)
        at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:68)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:46)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:91)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:37)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:76)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:37)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:94)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:71)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:45)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNonEmptySources(SkipEmptyWorkStep.java:177)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:86)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:53)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
        at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:75)
        at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:41)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:32)
        at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:287)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:21)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34)
        at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:146)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:337)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:324)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:317)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: java.util.concurrent.ExecutionException: java.lang.LinkageError: loader constraint violation: when resolving method 'net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type.get(kotlinx.metadata.internal.extensions.KmTypeExtension)' the class loader net.fabricmc.loom.util.kotlin.KotlinRemapperClassloader @45833309 of the current class, net/fabricmc/loom/kotlin/remapping/KotlinClassRemapper, and the class loader org.gradle.internal.classloader.VisitableURLClassLoader$InstrumentingVisitableURLClassLoader @3cf3a169 for the method's defining class, net/fabricmc/loom/util/kotlin/JvmExtensionWrapper$Type, have different Class objects for the type kotlinx/metadata/internal/extensions/KmTypeExtension used in the signature (net.fabricmc.loom.kotlin.remapping.KotlinClassRemapper is in unnamed module of loader net.fabricmc.loom.util.kotlin.KotlinRemapperClassloader @45833309, parent loader 'bootstrap'; net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type is in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader$InstrumentingVisitableURLClassLoader @3cf3a169, parent loader org.gradle.internal.classloader.CachingClassLoader @79cdb8fa)
        at net.fabricmc.tinyremapper.TinyRemapper.waitForAll(TinyRemapper.java:1167)
        ... 119 more
Caused by: java.lang.LinkageError: loader constraint violation: when resolving method 'net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type.get(kotlinx.metadata.internal.extensions.KmTypeExtension)' the class loader net.fabricmc.loom.util.kotlin.KotlinRemapperClassloader @45833309 of the current class, net/fabricmc/loom/kotlin/remapping/KotlinClassRemapper, and the class loader org.gradle.internal.classloader.VisitableURLClassLoader$InstrumentingVisitableURLClassLoader @3cf3a169 for the method's defining class, net/fabricmc/loom/util/kotlin/JvmExtensionWrapper$Type, have different Class objects for the type kotlinx/metadata/internal/extensions/KmTypeExtension used in the signature (net.fabricmc.loom.kotlin.remapping.KotlinClassRemapper is in unnamed module of loader net.fabricmc.loom.util.kotlin.KotlinRemapperClassloader @45833309, parent loader 'bootstrap'; net.fabricmc.loom.util.kotlin.JvmExtensionWrapper$Type is in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader$InstrumentingVisitableURLClassLoader @3cf3a169, parent loader org.gradle.internal.classloader.CachingClassLoader @79cdb8fa)
        at net.fabricmc.loom.kotlin.remapping.KotlinClassRemapper.remap(KotlinClassRemapper.kt:169)
        at net.fabricmc.loom.kotlin.remapping.KotlinClassRemapper.remap(KotlinClassRemapper.kt:86)
        at net.fabricmc.loom.kotlin.remapping.KotlinClassRemapper.remap(KotlinClassRemapper.kt:40)
        at net.fabricmc.loom.kotlin.remapping.KotlinClassMetadataRemappingAnnotationVisitor.visitEnd(KotlinClassMetadataRemappingAnnotationVisitor.kt:67)
        at org.objectweb.asm.ClassReader.readElementValues(ClassReader.java:3018)
        at org.objectweb.asm.ClassReader.accept(ClassReader.java:608)
        at org.objectweb.asm.ClassReader.accept(ClassReader.java:424)
        at net.fabricmc.tinyremapper.TinyRemapper.apply(TinyRemapper.java:1077)
        at net.fabricmc.tinyremapper.TinyRemapper.lambda$apply$5(TinyRemapper.java:908)


* Get more help at https://help.gradle.org

Support for projects that use `mojmap()` but that rely on mods that use conflicting method names

This is likely a support or documentation request, but I was hoping I could get some pointers on how to proceed.

I am currently looking at an issue with baritones' support for building litematica schematics with multiple subregions, hence I am working from a baritone branch into which I have bumped some versions and I have dropped litematica and malilib jars in the fabric/run/client/mods directory.

With this branch I can build baritone jar and use that jar in a fabric minecraft (with litematica/malilib). however if I try to run the branch from intelllij, or use the gradle :fabric:runClient task the client crashes with a stackoverflow relating to a conflicting method name between mojmap and malilib. This obviously makes further development on that a big PITA ;-)

The error manifests like so:

Caused by: java.lang.StackOverflowError
        at com.mojang.blaze3d.platform.InputConstants.isKeyDown(InputConstants.java:473) ~[minecraft-1.20.4-fabric-merged+fixed-mojmap+intermediary.jar:?]
        at net.minecraft.client.gui.screens.Screen.hasShiftDown(Screen.java:377) ~[minecraft-1.20.4-fabric-merged+fixed-mojmap+intermediary.jar:?]
        at fi.dy.masa.malilib.gui.GuiBase.isShiftDown(GuiBase.java:675) ~[malilib-0.18.0-64b5720b4b825f21.jar:?]
        at fi.dy.masa.malilib.gui.GuiTextFieldGeneric.setCursorPosition(GuiTextFieldGeneric.java:93) ~[malilib-0.18.0-64b5720b4b825f21.jar:?]
        at net.minecraft.client.gui.components.EditBox.moveCursorTo(EditBox.java:256) ~[minecraft-1.20.4-fabric-merged+fixed-mojmap+intermediary.jar:?]

The suggestion from the malilib discord is that I should remap the methods from baritone, which is using unimined gradle plugin. However for the life of me, I can't work out how to do that from the various issues I have looked at, or the documentation.

I guess that I am looking to implement this:
2024-05-29_16-55

Related issues:

Some game methods on Forge don't remap

Tested on 349def6 using the included /testing/1.20-Forge-Fabric project.

LivingEntityRenderer.m_7392_(...) doesn't get remapped to render, which it's overriding from EntityRenderer.

Haven't looked for other examples, I initially ran into this issue on 1.19.4 with a similar setup as the provided 1.20 one.

image
image

Allow applying Transitive-AW and II from dependencies

Transitive AccessWideners are made to be used by other mods too instead of the mod itself only, it would be great to apply them to MC jar in Unimined too.
InterfaceInjection is a dev only feature so it would make sense to also apply those from dependencies too.

Currently, mods are remapped after mc jar is done being transformed.

Make Offline Development Work Again

some parts always try to connect online, make them fallback to local caching if the internet is not available, or offline mode is enabled in gradle.

Cache version metadata

I like working offline, but trying to build Baritone for 1.19.2 in offline mode results in this error, which does not go away after building with internet connection:

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project 'baritone'.
> Offline mode is enabled, but version metadata is not available

JarJar support

Fabric/Quilt: JarInJar

Forge 1.15-1.16+: JarJar

Everything else: Shadow?

Can't use AT2AW convertors because Unimined is excluding required dependency of AccessTransformer

Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager [in thread "Daemon worker Thread 16"]
	at net.neoforged.accesstransformer.parser.AccessTransformerList.<clinit>(AccessTransformerList.java:18)
	at xyz.wagyourtail.unimined.internal.mapping.at.AccessTransformerApplier.at2aw(AccessTransformerApplier.kt:356)
	at xyz.wagyourtail.unimined.internal.minecraft.patch.access.AccessConvertImpl.at2aw(AccessConvertImpl.kt:55)
	at xyz.wagyourtail.unimined.internal.minecraft.patch.access.AccessConvertImpl.at2aw(AccessConvertImpl.kt:53)
	at xyz.wagyourtail.unimined.internal.minecraft.patch.access.transformer.AccessTransformerMinecraftTransformer.at2aw(AccessTransformerMinecraftTransformer.kt)

Neoforge's AccessTransformer depends on Log4j, however it's excluded by Unimined and never included back in the released pom?

Tested using Unimined 1.2.6

Failing to remap a comment in access transformer file

Trying to use legacy fabric mappings on a forge/legacy fabric project.
Seems to be trying to read the first comment in forge's forge_at.cfg

Log

Mappings Setup
unimined.minecraft {
	version project.minecraft_version

	mappings {
		legacyIntermediary(1)
		legacyYarn(514)
	}

	legacyFabric {
		loader project.fabric_version
	}

	minecraftForge {
		loader project.forge_version
		mixinConfig "notwitchkeybind.mixins.json"
	}
}

Support the Ornithe tool-chain (OSL / Feather / Nests)

Reasoning

I've recently decided to switch to using OrnitheMC's Feather mappings for mod development since they have such wide coverage.
Cat Core and I would like to see them implemented in Unimined so we can use it to develop our projects.

Ornithe propagates their mappings to every supported version at once every time a change is made. This leads to higher cross-version compatibility. Their set of API libraries, OSL, attempts to maintain compatibility for every supported Minecraft version at once (to varying degrees of success).
So using Ornithe's tool-chain has the potential to make multi-version mod development much more efficient.

Requirements

OrnitheMC uses a library called Nests to handle nested classes in development environments before Minecraft version 1.8.4, when Mojang's Proguard configuration stopped stripping inner class attributes.

OrnitheMC's Ploceus implements this nested mappings layer for Ornithe environments under Loom.
Ploceus also handles version-specific OSL dependencies for mods.

Request for comments

This description was based off of comments on the subject from @SpaceWalkerRS and @thecatcore.
They may have more to add to this conversation, and may be able to clarify or correct what I've said so far.

Completion

Helper methods have been implemented for the following features.
When all of these are checked off, you can consider this issue complete.

Mixin's guava overwrites Minecraft's in old versions

For example in MC1.8.9, guava 17.0 is needed but only mixin's 21.0 is added to the gradle project.
It results in a client crash in this version because of some function minecraft invokes from guava 17 that doesn't exist in 21 anymore.

gradlew runClient gets stuck and does nothing

I've tried to set up a 1.4.7 workspace using unimined and it almost worked on Windows, but after I got crash from Intel drivers on older minecraft versions (https://bugs.mojang.com/browse/MC-32606), I switched to Linux, Neon KDE if that helps, and now same project doesn't work.

I've put my gradle code here https://github.com/Reoseah/unimine-1.4.7-example-mod

gradlew runClient prints a bunch of gradle things, full log with --info attached if that helps, the last lines are these.

Starting process 'command '/home/reoseah/.jdks/temurin-1.8.0_362/bin/java''. Working directory: /home/reoseah/IdeaProjects/more-reinforced-blocks/run/client Command: /home/reoseah/.jdks/temurin-1.8.0_362/bin/java -Dhttp.proxyHost=betacraft.uk -Dhttp.proxyPort=11707 -Djava.library.path=/home/reoseah/IdeaProjects/more-reinforced-blocks/run/client/natives -Dminecraft.applet.TargetDirectory="/home/reoseah/IdeaProjects/more-reinforced-blocks/run/client" -Dminecraft.launcher.brand=UniminedDev -Dminecraft.launcher.version=1.0.0 -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=127.0.0.1:39889 -Xmx2G -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -cp /home/reoseah/IdeaProjects/more-reinforced-blocks/build/classes/java/main:/home/reoseah/IdeaProjects/more-reinforced-blocks/build/resources/main:/home/reoseah/IdeaProjects/more-reinforced-blocks/build/unimined/fakeglobal/net/minecraft/minecraft/1.4.7/forge-1.4.7-6.6.2.534/minecraft-1.4.7-jarmod-merged+forge-1.4.7-6.6.2.534+fixForge-MCP+SEARGE-at.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/net.minecraft/launchwrapper/1.5/5150b9c2951f0fde987ce9c33496e26add1de224/launchwrapper-1.5.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/4.5/6065cc95c661255349c1d0756657be17c29a4fd3/jopt-simple-4.5.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-all/4.1/54986e962b88d8660ae4566475658469595ef58/asm-all-4.1.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/org.lwjgl.lwjgl/lwjgl_util/2.9.0/a778846b64008fc7f48ead2377f034e547991699/lwjgl_util-2.9.0.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/org.lwjgl.lwjgl/lwjgl/2.9.0/5654d06e61a1bba7ae1e7f5233e1106be64c91cd/lwjgl-2.9.0.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/net.java.jinput/jinput/2.0.5/39c7796b469a600f72380316f6b1f11db6c2c7c4/jinput-2.0.5.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/net.java.jutils/jutils/1.0.0/e12fe1fda814bd348c1579329c86943d2cd3c6a6/jutils-1.0.0.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/org.lwjgl.lwjgl/lwjgl-platform/2.9.0/2ba5dcb11048147f1a74eff2deb192c001321f77/lwjgl-platform-2.9.0-natives-linux.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/org.lwjgl.lwjgl/lwjgl-platform/2.9.0/3f11873dc8e84c854ec7c5a8fd2e869f8aaef764/lwjgl-platform-2.9.0-natives-windows.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/org.lwjgl.lwjgl/lwjgl-platform/2.9.0/6621b382cb14cc409b041d8d72829156a87c31aa/lwjgl-platform-2.9.0-natives-osx.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/net.java.jinput/jinput-platform/2.0.5/7ff832a6eb9ab6a767f1ade2b548092d0fa64795/jinput-platform-2.0.5-natives-linux.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/net.java.jinput/jinput-platform/2.0.5/385ee093e01f587f30ee1c8a2ee7d408fd732e16/jinput-platform-2.0.5-natives-windows.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/net.java.jinput/jinput-platform/2.0.5/53f9c919f34d2ca9de8c51fc4e1e8282029a9232/jinput-platform-2.0.5-natives-osx.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/24.0.0/69b8b443c437fdeefa8d20c18d257b94836a92b9/annotations-24.0.0.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-debug-all/4.1/dd6ba5c392d4102458494e29f54f70ac534ec2a2/asm-debug-all-4.1.jar:/home/reoseah/IdeaProjects/more-reinforced-blocks/run/client/lib/asm-all-4.0.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/net.sourceforge.argo/argo/2.25/bb672829fde76cb163004752b86b0484bd0a7f4b/argo-2.25.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/12.0.1/b8e78b9af7bf45900e14c6f958486b6ca682195f/guava-12.0.1.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk15on/1.47/b6f5d9926b0afbde9f4dbe3db88c5247be7794bb/bcprov-jdk15on-1.47.jar:/home/reoseah/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/1.3.9/40719ea6961c0cb6afaeb6a921eaa1f6afd4cfdf/jsr305-1.3.9.jar net.minecraft.launchwrapper.Launch Dev ${auth_session} --gameDir /home/reoseah/IdeaProjects/more-reinforced-blocks/run/client --assetsDir /home/reoseah/IdeaProjects/more-reinforced-blocks/run/client/resources
Successfully started process 'command '/home/reoseah/.jdks/temurin-1.8.0_362/bin/java''
Connected to the target VM, address: 'localhost:39889', transport: 'socket'
Feb 24, 2023 12:56:41 PM net.minecraft.launchwrapper.LogWrapper log
INFO: Using tweak class name net.minecraft.launchwrapper.VanillaTweaker
Feb 24, 2023 12:56:42 PM net.minecraft.launchwrapper.LogWrapper log
INFO: Launching wrapped minecraft

Nothing happens after this even after ~15 minutes.

When running with IDEA in debug mode and pausing, it seems that it's always at XToolkit#waitForEvents.

Screenshot_20230224_130012
log.txt

including a fabric 1.20 subproject breaks runClient task for fabric 1.19.4

Repo: https://github.com/kurrycat2004/MPKMod_2/tree/1.20

Probably always only works for the latest mc version, but i only tested it with 1.20 and 1.19.4.
Simply removing the include fabric-1.20 from the settings.gradle makes the runClient task for 1.19.4 work again.

Similar to the bug with forge for unimined 0.4.10 where it uses the same legacy_classpath.txt file for every forge subproject, which also causes only the latest run task to work. I didnt make an issue for this though because im not sure if it still exists for unimined 1.0.0 and i wasnt able to get forge running with unimined 1.0.0 and parchment mappings to test it

Edit: Just realized that its indeed similar, it uses minecraft-1.20-fabric-merged+fixed-intermediary.jar in remapClasspath.txt used for -Dfabric.remapClasspathFile instead of the 1.19.4 jar which probably means that the remapClasspath.txt simply gets overwritten because it configures the 1.20 subproject after the 1.19.4 one.

Trying to run 1.2.5 forge client always fails due to wrong method signature.

java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
	at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Caused by: java.lang.NoSuchMethodError: net.lenni0451.classtransform.TransformerManager.addTransformer(Lxyz/wagyourtail/unimined/jarmodagent/shadow/org/objectweb/asm/tree/ClassNode;Z)Ljava/util/Set;
	at xyz.wagyourtail.unimined.jarmodagent.transformer.TransformerListBuilder.build(TransformerListBuilder.java:39)
	at xyz.wagyourtail.unimined.jarmodagent.transformer.JarModder.registerTransforms(JarModder.java:71)
	at xyz.wagyourtail.unimined.jarmodagent.JarModAgent.premain(JarModAgent.java:42)
	... 6 more
Exception in thread "main" FATAL ERROR in native method: processing of -javaagent failed

seems like this commit broke it?

Legacy forge coremods do not properly load in runClient

seems to be the true issue of #53 as well, but coremods do not load properly, which makes it really hard to develop cross loader mods using mixins, it can be worked around in some cases like in #53 but this is not ideal, and in the case of 1.7.10 with unimixins doing so just causes a NPE instead.

to reproduce, just clone this example mod repo i'm working on, run the forge runClient and note that the mixins will never load in dev, if built and thrown in a production forge enviroment the mixins do load.

Mapping error only in github workflow

Build still works locally but fails with github workflow. Maybe an issue with the minecraft artifact file path on linux.
Still worked at this revision: https://github.com/unimined/unimined/tree/3e1887c629e48950db0a3b9f324274c9cd4a2526

Working github build from yesterday:
https://github.com/kurrycat2004/MPKMod_2/actions/runs/5224427002/jobs/9432608653
Same build now:
https://github.com/kurrycat2004/MPKMod_2/actions/runs/5227947604/jobs/9439958945

Using 1.0.0-SNAPSHOT

Using side CLIENT with Forge causes patches to fail due to checksum mismatch

I LOVE Forge!!!!!

[Unimined/Forge] transforming minecraft jar for FG3
minecraft: MinecraftJar(path=.gradle\unimined\net\minecraft\minecraft\1.19.4\minecraft-1.19.4-client.jar)
Running binpatcher with args: --clean .gradle\unimined\net\minecraft\minecraft\1.19.4\minecraft-1.19.4-client.jar --output .gradle\unimined\net\minecraft\minecraft\1.19.4\1.19.4-45.1.0\forge-client-1.19.4-official.jar --apply .gradle\unimined\net\minecraft\minecraft\1.19.4\1.19.4-45.1.0\binpatches.lzma --data --unpatched
Applying:
  Clean:     .gradle\unimined\net\minecraft\minecraft\1.19.4\minecraft-1.19.4-client.jar
  Output:    .gradle\unimined\net\minecraft\minecraft\1.19.4\1.19.4-45.1.0\forge-client-1.19.4-official.jar
  KeepData:  true
  Unpatched: true
  Pack200:   false
  Legacy:    false
Loading patches file: .gradle\unimined\net\minecraft\minecraft\1.19.4\1.19.4-45.1.0\binpatches.lzma

...

  Patching net/minecraft/client/main/Main$1 1/1
java.io.IOException: Patch expected net/minecraft/client/main/Main$1 to have the checksum 4f63f67d but it was 2c2cbc92
        at net.minecraftforge.binarypatcher.Patcher.patch(Patcher.java:197)
        at net.minecraftforge.binarypatcher.Patcher.process(Patcher.java:149)
        at net.minecraftforge.binarypatcher.ConsoleTool.main(ConsoleTool.java:161)
        at xyz.wagyourtail.unimined.internal.minecraft.patch.forge.fg3.FG3MinecraftTransformer.transform(FG3MinecraftTransformer.kt:292)
        at xyz.wagyourtail.unimined.internal.minecraft.patch.forge.ForgeMinecraftTransformer.transform(ForgeMinecraftTransformer.kt:363)
        at xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider$minecraftFiles$1.invoke(MinecraftProvider.kt:109)
        at xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider$minecraftFiles$1.invoke(MinecraftProvider.kt:99)
        at xyz.wagyourtail.unimined.util.DefaultMap.get(DefaultMap.kt:11)
        at xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider.getMinecraft(MinecraftProvider.kt:116)
        at xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider$minecraftFileDev$2.invoke(MinecraftProvider.kt:359)
        at xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider$minecraftFileDev$2.invoke(MinecraftProvider.kt:357)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider.getMinecraftFileDev(MinecraftProvider.kt:357)
        at xyz.wagyourtail.unimined.internal.minecraft.patch.forge.fg3.FG3MinecraftTransformer.createLegacyClasspath(FG3MinecraftTransformer.kt:367)
        at xyz.wagyourtail.unimined.internal.minecraft.patch.forge.fg3.FG3MinecraftTransformer.applyClientRunTransform(FG3MinecraftTransformer.kt:375)
        at xyz.wagyourtail.unimined.internal.minecraft.patch.forge.ForgeMinecraftTransformer.applyClientRunTransform(ForgeMinecraftTransformer.kt:455)
        at xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider$clientRun$1.invoke(MinecraftProvider.kt:218)
        at xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider$clientRun$1.invoke(MinecraftProvider.kt:218)
        at xyz.wagyourtail.unimined.internal.runs.RunsProvider$configFirst$1$1.invoke(RunsProvider.kt:40)
        at xyz.wagyourtail.unimined.internal.runs.RunsProvider$configFirst$1$1.invoke(RunsProvider.kt:39)
        at xyz.wagyourtail.unimined.internal.runs.RunsProvider$transformedRunConfig$1.invoke(RunsProvider.kt:18)
        at xyz.wagyourtail.unimined.internal.runs.RunsProvider$transformedRunConfig$1.invoke(RunsProvider.kt:16)
        at xyz.wagyourtail.unimined.util.DefaultMap.get(DefaultMap.kt:11)
        at xyz.wagyourtail.unimined.internal.runs.RunsProvider.createGradleRuns(RunsProvider.kt:75)
        at xyz.wagyourtail.unimined.internal.runs.RunsProvider.access$createGradleRuns(RunsProvider.kt:10)
        at xyz.wagyourtail.unimined.internal.runs.RunsProvider$apply$1.invoke(RunsProvider.kt:55)
        at xyz.wagyourtail.unimined.internal.runs.RunsProvider$apply$1.invoke(RunsProvider.kt:49)
        at xyz.wagyourtail.unimined.internal.runs.RunsProvider.apply$lambda$2(RunsProvider.kt:49)

Umm... What Just Happened? Need Help Setting Up Unimined

I was browsing the web and suddenly I was redirected to your page. I have no idea what's going on, but I was hoping you could help me set it up? I mean, I clicked on a link and now I'm here. I hope this makes sense to you, because it sure doesn't to me!🎮💻Can you explain to me in layman's terms what Unimined is and how I can use it to mine some serious laughs and good times? I mean, I've heard rumors about a unified minecraft modding environment, but I have no idea what that means. Can I use it to mine chocolate or unicorn tears or something like that?💔
Thanks for your time and I'm looking forward to hearing back from you soon!

Failed to match access transformer on comment

I can upload a full log if needed but i get about 1000 lines that look like this whenever i run build:

Failed to match: ## ItemBlock
Failed to match: ## DedicatedServer
Failed to match: ## SaveFormatOld
Failed to match: 
Failed to match: 
Failed to match: # GuiButton
Failed to match: # GuiTextField
Failed to match: # GuiSlot
Failed to match: 
Failed to match: # Villager Traid Classes
Failed to match: 
Failed to match: # Font renderer
Failed to match: 
Failed to match: # ServerConfigurationManager
Applying ATs [forge_at.cfg]

buildscript:

plugins {
    idea
    java
    id("xyz.wagyourtail.unimined") version "0.4.1"
}

group = "io.github.moulberry"
version = "1.0.0"

minecraft {
    forge {
    }
}

repositories {
    mavenLocal()
    mavenCentral()
    maven("https://repo.nea.moe/releases")
}

dependencies {
    minecraft("net.minecraft:minecraft:1.8.9")
    mappings("moe.nea.mcp:mcp-yarn:1.8.9:v2")
    "forge"("net.minecraftforge:forge:1.8.9-11.15.1.2318-1.8.9")
}

java {
    toolchain.languageVersion.set(JavaLanguageVersion.of(8))
}

sourceSets.main {
    output.setResourcesDir(file("$buildDir/classes/java/main"))
}

tasks.withType(JavaCompile::class) {
    options.encoding = "UTF-8"
}

Unable to programatically specify a working directory in run configurations

I'm currently in the process of migrating some projects to Unimined and have noticed that the working directory specified in the configuration for runs is not respected. This sort of functionality is supported by Fabric Loom and Forge Gradle so not having it has proven quite annoying. The fact that the property seems to exist yet is ignored makes me think this is likely either a bug or oversight.

I would expect to be able to do something like:

    unimined.minecraft {
        runs {
            config("client") {
                workingDir = projectDir.resolve("../../../run/")
            }
        }
    }

But this does not work and simply creates a run directory in projectDir.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.