diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8d62506c..78b224a1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,7 +60,7 @@ jobs: - name: Retrieve JSON run: | curl -Ls -o "headlessmc.json" "https://api.github.com/repos/3arthqu4ke/headlessmc/releases/tags/2.7.1" --header "Authorization: ${{ secrets.GITHUB_TOKEN }}" - curl -Ls -o "mc-runtime-test.json" "https://api.github.com/repos/null2264/mc-runtime-test/releases/tags/5.2.3" --header "Authorization: ${{ secrets.GITHUB_TOKEN }}" + curl -Ls -o "mc-runtime-test.json" "https://api.github.com/repos/null2264/mc-runtime-test/releases/tags/5.2.5" --header "Authorization: ${{ secrets.GITHUB_TOKEN }}" - name: Upload jar files uses: actions/upload-artifact@v4 @@ -98,6 +98,7 @@ jobs: 8 17 21 + 25 gradle-no-cache-if: true - name: Setup properties @@ -106,7 +107,27 @@ jobs: - name: Build with Gradle run: | - ./gradlew build -PmcVer="${{ matrix.mc }}" -Pnull2264.platform="${{ matrix.loader }}" + # Retry 5 times because TerraformersMC's Maven keep having a stroke + # and there's no way to workaround it through Gradle as there are no + # public API for it. So we just need to deal with it I guess. + # + # REF: https://discuss.gradle.org/t/how-to-deal-with-network-flakiness-impacting-gradle-builds/25705/3 + # REF: https://github.com/gradle/gradle/issues/4629 + # REF: https://github.com/gradle/gradle/issues/2779 + tries=1 + c="0" + while [ $tries -le 5 ]; + do + ./gradlew build -PmcVer="${{ matrix.mc }}" -Pnull2264.platform="${{ matrix.loader }}" && exit 0 + c="$?" + echo "Try $tries failed. (code:$c)" + [ "$c" = "1" ] && break + ./gradlew --stop # this should free up the memory so we didn't encounter OutOfMemory err + sleep 5s + tries=$((tries+1)) + done + + [ "$c" = "0" ] || exit 1 env: VERSION: ${{ github.event.inputs.version == '' && '0.0.0' || github.event.inputs.version }} @@ -130,7 +151,7 @@ jobs: retention-days: 3 - name: GameTest with Gradle - if: github.event.inputs.bypass-test != 'true' && matrix.mc != '1.16.5' + if: github.event.inputs.bypass-test != 'true' && matrix.gradleGameTest run: | echo "# GameTest results" >> $GITHUB_STEP_SUMMARY; echo "" >> $GITHUB_STEP_SUMMARY; diff --git a/build.gradle.kts b/build.gradle.kts index 10a43d7b..df4bb645 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,14 +1,10 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import dev.architectury.plugin.ArchitectPluginExtension -import net.fabricmc.loom.LoomGradleExtension -import net.fabricmc.loom.api.LoomGradleExtensionAPI -import dependencies.minecraft as MC import org.apache.tools.ant.filters.StripJavaComments plugins { id("java") - id("architectury-plugin") version "3.4-SNAPSHOT" - id("io.github.null2264.architectury-loom") version "1.13-SNAPSHOT" apply false + // Explicitly add idea-ext here since without it being here :stubs and :fabric would both try to apply it at the same time causing error + id("org.jetbrains.gradle.plugin.idea-ext") version "1.3" apply false id("com.gradleup.shadow") apply false id("me.modmuss50.mod-publish-plugin") version "1.1.0" } @@ -16,47 +12,35 @@ plugins { val modVersion = System.getenv("VERSION") ?: project.properties["mod_version"] as? String ?: "0.0.0" val loaderName = project.properties["null2264.platform"] as? String ?: "" -val isForge = loaderName.endsWith("forge") -val isNeo = loaderName.endsWith("neoforge") -val isFabric = loaderName.endsWith("fabric") -val _mcVer = project.properties["mcVer"] as? String ?: "" -val mcVersionStr = if (_mcVer.startsWith("1.")) _mcVer else "2.$_mcVer" -val (major, minor, patch, hotfix) = mcVersionStr - .split(".") - .toMutableList() - .apply { while (this.size < 4) this.add("") } -val mcHotfix: Int = hotfix.toIntOrNull() ?: 0 -val mcVersion: Int = "${major}${minor.padStart(2, '0')}${patch.padStart(2, '0')}".toInt() +val mcVersionStr = project.properties["mcVer"] as? String ?: "" +val mcVersion = CGVer.fromString(mcVersionStr) val versionRange = supportedVersionRange(mcVersion, loaderName) fun setupPreprocessor() { val buildProps = buildString { append("# DON'T TOUCH THIS FILE, This is handled by the build script\n") - append("MC=${mcVersion}\n") - append("BUILD=${mcHotfix}\n") - if (isFabric) append("FABRIC=1\n") - if (isForge) append("FORGE=${if (!isNeo) "1" else "2"}\n") + append("MC=${mcVersion.code}\n") } project.file("build.properties").writeText(buildProps) } setupPreprocessor() -architectury { - minecraft = MC.versioned(mcVersion, mcHotfix) -} - allprojects { apply(plugin = "java") apply(plugin = "maven-publish") - ext["mcVersion"] = mcVersion - ext["mcVersionStr"] = mcVersionStr - ext["mcHotfix"] = mcHotfix - ext["loaderName"] = loaderName - ext["isFabric"] = isFabric - ext["isForge"] = isForge - ext["isNeo"] = isNeo + extra["mcVersion"] = mcVersion + extra["mcVersionStr"] = mcVersionStr + val isFabric = project == project(":fabric") + val isForge = project == project(":forge") + val isNeo = isForge && mcVersion.code >= 12002 + extra["loaderName"] = when { + isFabric -> "fabric" + isNeo -> "neoforge" + isForge -> "forge" + else -> "" + } base.archivesName.set(rootProject.properties["archives_base_name"] as? String ?: "") @@ -122,34 +106,20 @@ allprojects { subprojects { // NOTE: This here for when I finally split the API to its own module, hopefully on v6.0 val isApi = false; // APIs shouldn't contain anything Minecraft related - val isModModule = project == project(":cobblegen") - // Modules that contains MC-related stuff - val isMcModule = isModModule || project == project(":mclib") + val isModModule = project in listOf(project(":fabric"), project(":forge")) + val isFabric = project == project(":fabric") + val isForge = project == project(":forge") + val isNeo = isForge && mcVersion.code >= 12002 + val loaderName = when { + isFabric -> "fabric" + isNeo -> "neoforge" + isForge -> "forge" + else -> "" + } apply(plugin = "java") apply(plugin = "com.gradleup.shadow") - if (isModModule) { - // NOTE: This must be set before archloom is applied! - extra.set("loom.platform", loaderName) - } - - if (isMcModule) { - apply(plugin = "architectury-plugin") - apply(plugin = "io.github.null2264.architectury-loom") - val arch = project.extensions["architectury"] as ArchitectPluginExtension - arch.apply { - if (isModModule) - loader(loaderName) - else - common(listOf(loaderName)) - } - val loom = project.extensions["loom"] as LoomGradleExtension - loom.apply { - silentMojangMappingsLicense() - } - } - val manifoldVersion = project.properties["manifold_version"] as? String ?: "" val shade: Configuration by configurations.creating { @@ -157,48 +127,21 @@ subprojects { } val shadeInternal: Configuration by configurations.creating - val loaderProd = when { - isFabric -> "Fabric" - isNeo -> "NeoForge" - isForge -> "Forge" - else -> throw IllegalStateException("Unknown loader!") - } - - // For internal libraries - val compileInternal: Configuration by configurations.creating { - configurations.compileClasspath.get().extendsFrom(this) - configurations.runtimeClasspath.get().extendsFrom(this) - if (isModModule) { - configurations["development$loaderProd"].extendsFrom(this) - } - } - val manifoldCompile: Configuration by configurations.creating { configurations.compileOnly.get().extendsFrom(this) configurations.annotationProcessor.get().extendsFrom(this) configurations.testAnnotationProcessor.get().extendsFrom(this) } - if (isModModule && !isFabric) { - configurations.named("forgeRuntimeLibrary").get().extendsFrom(shade) - } - - val loom by lazy { - if (!isMcModule) { - throw IllegalStateException("Loom only available for MC modules") + if (isForge) { + afterEvaluate { + if (mcVersion.code <= 12108) { + configurations.named("additionalRuntimeClasspath").get().extendsFrom(shade) + } } - project.the() } dependencies { - if (isMcModule) { - val minecraft by configurations - val mappings by configurations - - minecraft(MC.versioned(mcVersion, mcHotfix)) - mappings(loom.officialMojangMappings()) - } - shade("blue.endless:jankson:${project.properties["jankson_version"]}") shade("systems.manifold:manifold-ext-rt:${manifoldVersion}") @@ -206,18 +149,7 @@ subprojects { manifoldCompile("systems.manifold:manifold-preprocessor:${manifoldVersion}") if (isModModule) { - compileOnly(project(":stubs")) - compileInternal(project(":mclib", configuration = "namedElements")) { isTransitive = false } - shadeInternal(project(":mclib", configuration = "transformProduction$loaderProd")) { - // Remove Junit test libraries - exclude(group = "org.junit.jupiter", module = "junit-jupiter") - exclude(group = "org.junit.jupiter", module = "junit-jupiter-engine") - exclude(group = "junit", module = "junit") - // Removed dependencies - isTransitive = false - } - - if (mcVersion <= 11605) { + if (mcVersion.code <= 11605) { // slf4j is not included by MC in 1.16.5 shade("org.slf4j:slf4j-api:1.7.36") shade("org.apache.logging.log4j:log4j-slf4j-impl:2.8.1") @@ -228,7 +160,7 @@ subprojects { val shadowJar by tasks.getting(ShadowJar::class) { isZip64 = true relocate("blue.endless.jankson", "io.github.null2264.shadowed.jankson") - if (mcVersion <= 11605) { + if (mcVersion.code <= 11605) { relocate("org.slf4j", "io.github.null2264.shadowed.slf4j") relocate("org.apache.logging", "io.github.null2264.shadowed.log4j") } @@ -239,7 +171,7 @@ subprojects { exclude("META-INF/neoforge.mods.toml") } else if (isForge) { exclude("fabric.mod.json") - exclude(if (isNeo && mcVersion >= 12006) "META-INF/mods.toml" else "META-INF/neoforge.mods.toml") + exclude(if (isNeo && mcVersion.code >= 12006) "META-INF/mods.toml" else "META-INF/neoforge.mods.toml") } exclude("architectury.common.json") @@ -250,8 +182,8 @@ subprojects { artifacts.add("archives", shadowJar) - val processResources by tasks.getting(ProcessResources::class) { - if (!isModModule) return@getting + tasks.withType { + if (!isModModule) return@withType val metadataVersion = "${modVersion}-${project.properties["version_stage"]}" val metadataMCVersion = if (isForge) versionRange.mavenStyle() else versionRange.semverStyle() @@ -267,7 +199,7 @@ subprojects { if (isFabric) { "fabric.mod.json" } else { - if (isNeo && mcVersion >= 12006) "META-INF/neoforge.mods.toml" else "META-INF/mods.toml" + if (isNeo && mcVersion.code >= 12006) "META-INF/neoforge.mods.toml" else "META-INF/mods.toml" } filesMatching(metadataFilename) { @@ -281,8 +213,8 @@ subprojects { doLast { // For some reason Mojang rename the structure directory on MC 1.21 to singular form - val structureDirName = if (mcVersion >= 12100) "structure" else "structures" - if (isFabric || mcVersion >= 12105) { + val structureDirName = if (mcVersion.code >= 12100) "structure" else "structures" + if (isFabric || mcVersion.code >= 12105) { project.file("build/resources/main/data/cobblegen/gametest/${structureDirName}/").mkdirs() project.file("build/resources/main/data/cobblegen/gametest/${structureDirName}/empty.snbt") .writeStructureAsSnbt(generateStructure(false)) @@ -292,17 +224,25 @@ subprojects { .writeStructureAsNbt(generateStructure(true)) } - project.file("build/resources/main/META-INF/mods.toml") - .processModsToml(mcVersion, if (!isForge) 0 else (if (isNeo) 2 else 1)) - // We can't preprocess resources files with Manifold, so we'll construct the json files manually here instead. - project.file("build/resources/main/cobblegen.mixins.json").processMixinsJson(mcVersion, isFabric) + project.file("build/resources/main/cobblegen.mixins.json").processMixinsJson(mcVersion, if (isFabric) "fabric" else "forge") + project.file("build/resources/main/cobblegen.${project.name}.mixins.json").apply { + if (isFabric) processMixinsJsonFabric(mcVersion) + else processMixinsJsonForge(mcVersion) + } if (isFabric) project.file("build/resources/main/fabric.mod.json").processFabricModJson(mcVersion) + else project.file("build/resources/main/$metadataFilename").processModsToml(mcVersion, if (mcVersion.code >= 12002) 2 else 1) } } val targetJavaVersion = if (!isApi) { - if (mcVersion >= 12006) 21 else (if (mcVersion >= 11700) 17 else 8) + when (mcVersion.code) { + in 11200..11605 -> 8 + in 11700..11701 -> 16 + in 11800..12004 -> 17 + in 12005..12111 -> 21 + else -> 25 + } } else { 8 // APIs should always target Java 8 } @@ -343,72 +283,72 @@ subprojects { // .map { if (it.isPreRelease) it.copy(preRelease = "Snapshot") else it }.distinct().map { it.toMojangString() }) //} -publishMods { - val mainProject = project(":cobblegen") - file.set(mainProject.file("build/libs/${rootProject.properties["archives_base_name"]}-${mainProject.version}.jar")) - val releaseVersions = mcVersions(versionRange, filters = listOf("release")) - displayName.set( - buildString { - append("[") - if (isFabric) { - append("FABRIC") - } else { - if (isNeo) append("NEOFORGE") else append("FORGE") - } - append(" MC") - append(releaseVersions[0]) - if (releaseVersions.size > 1) append("+") - append("]") - append(" v") - append(modVersion) - append("-") - append(rootProject.properties["version_stage"]) - if (mcVersion <= 11605) append(" (LITE)") - } - ) - changelog.set(System.getenv("CHANGELOG") ?: "Please visit our [releases](https://github.com/null2264/CobbleGen/releases) for a changelog") - version.set(mainProject.version.toString()) - if (isFabric) { - modLoaders.add("fabric") - modLoaders.add("quilt") - } else { - if (mcVersion <= 12002 && !isNeo) // No more LexForge, LexForge is too buggy - modLoaders.add("forge") - if (mcVersion == 12001 || isNeo) - modLoaders.add("neoforge") - } - type = when(rootProject.properties["version_stage"]) { - "ALPHA" -> ALPHA - "BETA" -> BETA - else -> STABLE - } - - val cfToken = System.getenv("CURSEFORGE") - if (cfToken != null) { - curseforge { - accessToken = cfToken - projectId.set(rootProject.properties["curseforge_project"] as String) - // Because CF did it the lazy way and just group every snapshot as a single snapshot - minecraftVersions = - releaseVersions - .map { if (it.isPreRelease) it.copy(preRelease = "Snapshot") else it } - .distinct() - .map { it.toMojangString() } - - embeds { - slug = "jankson" - } - } - } - - val mrToken = System.getenv("MODRINTH") - if (mrToken != null) { - modrinth { - accessToken = mrToken - projectId.set(rootProject.properties["modrinth_project"] as String) - - minecraftVersions = - releaseVersions.map { it.toMojangString() } - } - } -} +//publishMods { +// val mainProject = project(":cobblegen") +// file.set(mainProject.file("build/libs/${rootProject.properties["archives_base_name"]}-${mainProject.version}.jar")) +// val releaseVersions = mcVersions(versionRange) +// displayName.set( +// buildString { +// append("[") +// if (isFabric) { +// append("FABRIC") +// } else { +// if (isNeo) append("NEOFORGE") else append("FORGE") +// } +// append(" MC") +// append(releaseVersions[0]) +// if (releaseVersions.size > 1) append("+") +// append("]") +// append(" v") +// append(modVersion) +// append("-") +// append(rootProject.properties["version_stage"]) +// if (mcVersion.code <= 11605) append(" (LITE)") +// } +// ) +// changelog.set(System.getenv("CHANGELOG") ?: "Please visit our [releases](https://github.com/null2264/CobbleGen/releases) for a changelog") +// version.set(mainProject.version.toString()) +// if (isFabric) { +// modLoaders.add("fabric") +// modLoaders.add("quilt") +// } else { +// if (mcVersion.code <= 12002 && !isNeo) // No more LexForge, LexForge is too buggy +// modLoaders.add("forge") +// if (mcVersion.code == 12001 || isNeo) +// modLoaders.add("neoforge") +// } +// type = when(rootProject.properties["version_stage"]) { +// "ALPHA" -> ALPHA +// "BETA" -> BETA +// else -> STABLE +// } +// +// val cfToken = System.getenv("CURSEFORGE") +// if (cfToken != null) { +// curseforge { +// accessToken = cfToken +// projectId.set(rootProject.properties["curseforge_project"] as String) +// // Because CF did it the lazy way and just group every snapshot as a single snapshot +// minecraftVersions = +// releaseVersions +// .map { if (it.isPreRelease) it.copy(preRelease = "Snapshot") else it } +// .distinct() +// .map { it.toMojangString() } +// +// embeds { +// slug = "jankson" +// } +// } +// } +// +// val mrToken = System.getenv("MODRINTH") +// if (mrToken != null) { +// modrinth { +// accessToken = mrToken +// projectId.set(rootProject.properties["modrinth_project"] as String) +// +// minecraftVersions = +// releaseVersions.map { it.toMojangString() } +// } +// } +//} diff --git a/buildSrc/src/main/kotlin/CGVer.kt b/buildSrc/src/main/kotlin/CGVer.kt new file mode 100644 index 00000000..b0196f7b --- /dev/null +++ b/buildSrc/src/main/kotlin/CGVer.kt @@ -0,0 +1,63 @@ +import org.gradle.kotlin.dsl.provideDelegate + +data class CGVer( + val code: Int, + var alwaysShowHotfix: Boolean = false, +) { + internal fun legacyVersionStr(versionCode: Int): String { + val versionCodeStr = versionCode.toString() + val major = versionCodeStr.getOrNull(0)?.toString() ?: "0" + val minor = versionCodeStr + .substring(1, 3) + .padStart(2, '0') + .trimStart('0') + val patch = versionCodeStr + .substring(3) + .padEnd(1, '0').trimStart('0') + + if (patch.isEmpty()) return "$major.$minor" + return "$major.$minor.$patch" + } + + val isWildcard: Boolean + get() = code < 0 + + val string: String + get() { + assert(!isWildcard) { "Can't transform a wildcard to string format!" } + + val versionCodeStr = code.toString() + if (versionCodeStr.length == 5) return legacyVersionStr(code) + + val year = versionCodeStr.substring(0, 2) + val release = versionCodeStr + .substring(2, 4) + .trimStart('0') + .let { if (it == "") "0" else it } + val hotfix = versionCodeStr + .substring(4) + .trimStart('0') + .let { if (it == "" && alwaysShowHotfix) "0" else it } + + return if (hotfix != "") "$year.$release.$hotfix" else "$year.$release" + } + + override fun toString(): String { + return string + } + + companion object { + fun fromString(string: String, alwaysShowHotfix: Boolean = false): CGVer { + val (major, minor, patch) = string + .split(".") + .toMutableList() + .apply { while (this.size < 3) this.add("") } + return CGVer( + "${major}${minor.padStart(2, '0')}${patch.padStart(2, '0')}".toInt(), + alwaysShowHotfix, + ) + } + + fun wildcard() = CGVer(-1) + } +} diff --git a/buildSrc/src/main/kotlin/GradlePlugin.kt b/buildSrc/src/main/kotlin/GradlePlugin.kt new file mode 100644 index 00000000..d964c59e --- /dev/null +++ b/buildSrc/src/main/kotlin/GradlePlugin.kt @@ -0,0 +1,10 @@ +sealed class GradlePlugin(val id: String, val isLegacy: Boolean) { + object LegacyLoom : GradlePlugin("net.fabricmc.fabric-loom-remap", true) + object Loom : GradlePlugin("net.fabricmc.fabric-loom", false) + object ArchLoom : GradlePlugin("io.github.null2264.architectury-loom", true) + object MDG : GradlePlugin("net.neoforged.moddev", false) + object LegacyMDG : GradlePlugin("net.neoforged.moddev.legacyforge", true) + + fun isLoom() = this is LegacyLoom || this is Loom || this is ArchLoom + fun isLegacyLoom() = isLoom() && isLegacy +} diff --git a/buildSrc/src/main/kotlin/ProcessModMetadata.kt b/buildSrc/src/main/kotlin/ProcessModMetadata.kt index f18f92f0..01bcbff6 100644 --- a/buildSrc/src/main/kotlin/ProcessModMetadata.kt +++ b/buildSrc/src/main/kotlin/ProcessModMetadata.kt @@ -1,13 +1,11 @@ import java.io.File -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray -import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive +import java.util.Locale fun File.processModsToml( - mcVersion: Int, + mcVersion: CGVer, /** * Possible values: * - 0 -> Not Forge @@ -18,7 +16,7 @@ fun File.processModsToml( ) { val modsTomlContent = readText(Charsets.UTF_8).let { when { - mcVersion == 12001 -> it.replace("#==", "") + mcVersion.code == 12001 -> it.replace("#==", "") forge == 2 -> it.replace("#<<", "") forge == 1 -> it.replace("#>>", "") else -> it @@ -27,55 +25,95 @@ fun File.processModsToml( writeText(modsTomlContent) } -fun File.processMixinsJson(mcVersion: Int, isFabric: Boolean) { +fun File.processMixinsJsonFabric(mcVersion: CGVer) { val both = buildList { - if (mcVersion >= 12005) addJson("network.packet.CustomPacketPayloadMixin") + if (mcVersion.code > 11605) { + addJson("create.CreateFluidReactionsMixin\$PatchE") + addJson("create.CreateFluidReactionsMixin\$PatchF") + } + } + val mixinsJson = JsonObject( + lenientJson.decodeFromString(readText(Charsets.UTF_8)).toMutableMap().apply { + set("compatibilityLevel", JsonPrimitive(if (mcVersion.code <= 11605) "JAVA_8" else "JAVA_17")) + set("mixins", JsonArray(both)) + set("client", JsonArray(listOf())) + set("server", JsonArray(listOf())) + } + ) +} + +fun File.processMixinsJsonForge(mcVersion: CGVer) { + val both = buildList { + if (mcVersion.code > 11605) { + addJson("create.CreateFluidReactionsMixin\$PatchE") + } + } + val server = buildList { + if (mcVersion.code >= 12004) addJson("network.loader.neoforge.NetworkRegistryMixin") + } + val mixinsJson = JsonObject( + lenientJson.decodeFromString(readText(Charsets.UTF_8)).toMutableMap().apply { + set("compatibilityLevel", JsonPrimitive(if (mcVersion.code <= 11605) "JAVA_8" else "JAVA_17")) + set("mixins", JsonArray(both)) + set("client", JsonArray(listOf())) + set("server", JsonArray(server)) + } + ) +} + +fun File.processMixinsJson(mcVersion: CGVer, loaderName: String) { + val both = buildList { + if (mcVersion.code >= 12005) addJson("network.packet.CustomPacketPayloadMixin") addJson("CommandsMixin") addJson("MinecraftServerMixin") - if (mcVersion > 11605) { + if (mcVersion.code > 11605) { addJson("create.CreateFluidReactionsMixin\$OFive") - addJson("create.CreateFluidReactionsMixin\$PatchE") - if (isFabric) addJson("create.CreateFluidReactionsMixin\$PatchF") } addJson("fluid.FlowingFluidEventMixin") addJson("fluid.FluidEventMixin") addJson("fluid.LavaEventMixin") - if (mcVersion >= 12105) { + if (mcVersion.code >= 12105) { addJson("gametest.RegistryDataLoaderMixin\$GameTest") addJson("gametest.StructureTemplateManagerMixin\$GameTest") } } val client = buildList { - if (mcVersion < 12005) addJson("network.packet.ClientboundCustomPayloadPacketMixin") + if (mcVersion.code < 12005) addJson("network.packet.ClientboundCustomPayloadPacketMixin") addJson("network.ClientCommonPacketListenerMixin") addJson("network.ConnectionMixin") } val server = buildList { addJson("network.PlayerManagerMixin") - if (mcVersion < 12002) addJson("network.ServerboundCustomPayloadPacketAccessor") + if (mcVersion.code < 12002) addJson("network.ServerboundCustomPayloadPacketAccessor") else addJson("network.ServerConfigurationPacketListenerMixin") - if (mcVersion < 12005) addJson("network.packet.ServerboundCustomPayloadPacketMixin") + if (mcVersion.code < 12005) addJson("network.packet.ServerboundCustomPayloadPacketMixin") addJson("network.ServerCommonPacketListenerMixin") - if (!isFabric && mcVersion >= 12004) addJson("network.loader.neoforge.NetworkRegistryMixin") } val mixinsJson = JsonObject( lenientJson.decodeFromString(readText(Charsets.UTF_8)).toMutableMap().apply { - set("compatibilityLevel", JsonPrimitive(if (mcVersion <= 11605) "JAVA_8" else "JAVA_17")) + set("compatibilityLevel", JsonPrimitive(if (mcVersion.code <= 11605) "JAVA_8" else "JAVA_17")) set("mixins", JsonArray(both)) set("client", JsonArray(client)) set("server", JsonArray(server)) + set("plugin", JsonPrimitive("io.github.null2264.cobblegen${if (!loaderName.isEmpty()) ".$loaderName" else ""}.mixin.core.CobbleGenMixinPlugin${ + loaderName.replaceFirstChar { + if (it.isLowerCase()) it.titlecase( + Locale.getDefault() + ) else it.toString() + } + }")) } ) writeText(prettyJson.encodeToString(JsonObject.serializer(), mixinsJson)) } -fun File.processFabricModJson(mcVersion: Int) { +fun File.processFabricModJson(mcVersion: CGVer) { val jsonObject = JsonObject( lenientJson.decodeFromString(readText(Charsets.UTF_8)).toMutableMap().apply { (get("entrypoints") as? JsonObject)?.toMutableMap()?.apply { - if (mcVersion > 11605) { + if (mcVersion.code > 11605) { set("jei_mod_plugin", JsonArray(listOf(JsonPrimitive("io.github.null2264.cobblegen.integration.viewer.jei.CGJEIPlugin")))) - if (mcVersion < 12111) { + if (mcVersion.code < 12111) { // FIXME: Enable REI integration for 1.21.11 when REI is updated // REF: https://github.com/shedaniel/RoughlyEnoughItems/pull/1989 set("rei_client", JsonArray(listOf(JsonPrimitive("io.github.null2264.cobblegen.integration.viewer.rei.CGREIPlugin")))) @@ -87,7 +125,7 @@ fun File.processFabricModJson(mcVersion: Int) { "cobblegen_plugin", JsonArray(buildList { addJson("io.github.null2264.cobblegen.integration.BuiltInPlugin") - if (mcVersion > 11605) addJson("io.github.null2264.cobblegen.integration.CreatePlugin") + if (mcVersion.code > 11605) addJson("io.github.null2264.cobblegen.integration.CreatePlugin") }), ) }?.let { diff --git a/buildSrc/src/main/kotlin/VersionRange.kt b/buildSrc/src/main/kotlin/VersionRange.kt index 9a08ac7c..cf948fa2 100644 --- a/buildSrc/src/main/kotlin/VersionRange.kt +++ b/buildSrc/src/main/kotlin/VersionRange.kt @@ -21,6 +21,7 @@ data class VersionRange( val to: String?, val inclusiveFrom: Boolean = false, val inclusiveTo: Boolean = true, + val isSnapshot: Boolean = false, ) { val fromSanitized: String? get() = from?.replace(".x", ".9999", true) val toSanitized: String? get() = to?.replace(".x", ".9999", true) @@ -58,8 +59,8 @@ data class VersionRange( } } -fun supportedVersionRange(mcVersion: Int, loader: String): VersionRange { - return when (mcVersion) { +fun supportedVersionRange(mcVersion: CGVer, loader: String): VersionRange { + return when (mcVersion.code) { 11605 -> VersionRange("1.16.5", "1.16.5") 11802 -> VersionRange("1.18.2", "1.18.2") in 11900..11902 -> VersionRange("1.18.x", "1.19.2") @@ -71,7 +72,8 @@ fun supportedVersionRange(mcVersion: Int, loader: String): VersionRange { in 12100..12101 -> VersionRange("1.20.x", "1.21.1") in 12102..12104 -> VersionRange("1.21.1", "1.21.4") in 12105..12110 -> VersionRange("1.21.4", "1.21.10") - 12111 -> VersionRange("1.21.10", null) + 12111 -> VersionRange("1.21.10", "1.21.11") + 260100 -> VersionRange("1.21.11", null, isSnapshot = true) else -> VersionRange(null, null) } } @@ -91,7 +93,12 @@ fun Version.toMojangString(): String = "$major.$minor${if (patch > 0) ".$patch" else ""}${preRelease?.let { "-$preRelease" } ?: ""}" + (buildMetadata?.let { "+$buildMetadata" } ?: "") -fun mcVersions(target: VersionRange, filters: List = listOf("release", "snapshot")): List { +fun mcVersions(target: VersionRange): List { + val filters = buildList { + add("release") + if (target.isSnapshot) add("snapshot") + } + val client = HttpClient.newHttpClient() // TODO: Caching this is probably a good idea... val response = client.send( diff --git a/buildSrc/src/main/kotlin/dependencies/Create.kt b/buildSrc/src/main/kotlin/dependencies/Create.kt index 4c7ec30e..d20879b0 100644 --- a/buildSrc/src/main/kotlin/dependencies/Create.kt +++ b/buildSrc/src/main/kotlin/dependencies/Create.kt @@ -4,7 +4,7 @@ fun createMod(isNeo: Boolean) = Dependency( group = "com.simibubi.create", // Create finally support Neo on 1.21.1 name = "create" + (if (!isNeo) "-1.18.2" else "-1.21.1"), - version = { mcVersion, hotfix -> + version = { _ -> val version = if (!isNeo) "0.5.1.e-318" else "6.0.4-59" return@Dependency "$version:slim" }, diff --git a/buildSrc/src/main/kotlin/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/dependencies/Dependencies.kt index f78e1291..ab87c6f9 100644 --- a/buildSrc/src/main/kotlin/dependencies/Dependencies.kt +++ b/buildSrc/src/main/kotlin/dependencies/Dependencies.kt @@ -1,28 +1,46 @@ package dependencies +import CGVer + data class Dependency( private val group: String, private val name: String, - private val version: (Int, Int) -> String, + val version: (CGVer) -> String, ) { - fun versioned(mcVersion: Int, mcBuild: Int): String = "${group}:${name}:${version(mcVersion, mcBuild)}" + fun versioned(mcVersion: CGVer): String = "${group}:${name}:${version(mcVersion)}" } -fun versionStr(versionCode: Int, hotfix: Int = 0, alwaysShowHotfix: Boolean = false): String { +fun legacyVersionStr(versionCode: Int): String { val versionCodeStr = versionCode.toString() val major = versionCodeStr.getOrNull(0)?.toString() ?: "0" val minor = versionCodeStr - .substring(1, 3 + (versionCodeStr.length - 5)) // Future proofing, in case "1.100.0" happened + .substring(1, 3) .padStart(2, '0') .trimStart('0') val patch = versionCodeStr - .substring(3 + (versionCodeStr.length - 5)) + .substring(3) .padEnd(1, '0').trimStart('0') + + if (patch.isEmpty()) return "$major.$minor" + return "$major.$minor.$patch" +} + +/** + * Transform version code (e.g. 260100) back to formatted string (e.g. 26.01). + */ +fun versionStr(versionCode: Int, alwaysShowHotfix: Boolean = false): String { + val versionCodeStr = versionCode.toString() + if (versionCodeStr.length == 5) return legacyVersionStr(versionCode) - if (major.toInt() <= 1) { - if (patch.isEmpty()) return "$major.$minor" - return "$major.$minor.$patch" - } + val year = versionCodeStr.substring(0, 2) + val release = versionCodeStr + .substring(2, 4) + .trimStart('0') + .let { if (it == "") "0" else it } + val hotfix = versionCodeStr + .substring(4) + .trimStart('0') + .let { if (it == "" && alwaysShowHotfix) "0" else it } - return if (hotfix > 0 || alwaysShowHotfix) "$minor.$patch.$hotfix" else "$minor.$patch" + return if (hotfix != "") "$year.$release.$hotfix" else "$year.$release" } diff --git a/buildSrc/src/main/kotlin/dependencies/FabricAPI.kt b/buildSrc/src/main/kotlin/dependencies/FabricAPI.kt index 1032f2f4..fbf190f1 100644 --- a/buildSrc/src/main/kotlin/dependencies/FabricAPI.kt +++ b/buildSrc/src/main/kotlin/dependencies/FabricAPI.kt @@ -3,8 +3,8 @@ package dependencies val fapi = Dependency( group = "net.fabricmc.fabric-api", name = "fabric-api", - version = { mcVersion, hotfix -> - when (mcVersion) { + version = { mcVersion -> + when (mcVersion.code) { 11605 -> "0.42.0+1.16" 11802 -> "0.76.0+1.18.2" in 11900..11902 -> "0.76.0+1.19.2" @@ -16,6 +16,7 @@ val fapi = Dependency( in 12102..12104 -> "0.106.1+1.21.3" in 12105..12110 -> "0.119.9+1.21.5" 12111 -> "0.139.5+1.21.11" + 260100 -> "0.141.1+26.1" else -> throw IllegalStateException("$mcVersion is not yet supported!") } }, @@ -24,9 +25,11 @@ val fapi = Dependency( val fapiGameTest = Dependency( group = "net.fabricmc.fabric-api", name = "fabric-gametest-api-v1", - version = { mcVersion, hotfix -> - when (mcVersion) { - 12105 -> "3.1.2+2a6ec84b49" + version = { mcVersion -> + when (mcVersion.code) { + in 12105..12110 -> "3.1.2+2a6ec84b49" + 12111 -> "3.1.27+4fc5413f3e" + 260100 -> "4.0.0+574290bac9" else -> throw IllegalStateException("$mcVersion is not yet supported!") } }, @@ -35,8 +38,8 @@ val fapiGameTest = Dependency( val fapiResourceLoader = Dependency( group = "net.fabricmc.fabric-api", name = "fabric-resource-loader-v0", - version = { mcVersion, hotfix -> - when (mcVersion) { + version = { mcVersion -> + when (mcVersion.code) { 12105 -> "3.1.6+02ca679649" else -> throw IllegalStateException("$mcVersion is not yet supported!") } diff --git a/buildSrc/src/main/kotlin/dependencies/LexForge.kt b/buildSrc/src/main/kotlin/dependencies/LexForge.kt index 54969660..a95de279 100644 --- a/buildSrc/src/main/kotlin/dependencies/LexForge.kt +++ b/buildSrc/src/main/kotlin/dependencies/LexForge.kt @@ -3,8 +3,8 @@ package dependencies val lexForge = Dependency( group = "net.minecraftforge", name = "forge", - version = { mcVersion, hotfix -> - val version = when (mcVersion) { + version = { mcVersion -> + val version = when (mcVersion.code) { 11605 -> "36.2.41" 11802 -> "40.2.9" in 11900..11902 -> "43.2.14" @@ -13,6 +13,6 @@ val lexForge = Dependency( in 12002..12004 -> "48.0.13" else -> throw IllegalStateException("Forge no longer supported!") } - "${versionStr(mcVersion)}-${version}" + "${mcVersion}-${version}" }, ) diff --git a/buildSrc/src/main/kotlin/dependencies/Minecraft.kt b/buildSrc/src/main/kotlin/dependencies/Minecraft.kt index c0fc00b8..abe260c3 100644 --- a/buildSrc/src/main/kotlin/dependencies/Minecraft.kt +++ b/buildSrc/src/main/kotlin/dependencies/Minecraft.kt @@ -3,11 +3,12 @@ package dependencies val minecraft = Dependency( group = "com.mojang", name = "minecraft", - version = { mcVersion, hotfix -> - when (mcVersion) { + version = { mcVersion -> + when (mcVersion.code) { // For snapshots //12100 -> "some snapshot" - else -> versionStr(mcVersion, hotfix) + 260100 -> "26.1-snapshot-2" + else -> mcVersion.string } }, ) diff --git a/buildSrc/src/main/kotlin/dependencies/NeoForge.kt b/buildSrc/src/main/kotlin/dependencies/NeoForge.kt index 8a173e7a..ac2ecec6 100644 --- a/buildSrc/src/main/kotlin/dependencies/NeoForge.kt +++ b/buildSrc/src/main/kotlin/dependencies/NeoForge.kt @@ -1,10 +1,10 @@ package dependencies -val neoForge = Dependency( +val NEO = Dependency( group = "net.neoforged", name = "neoforge", - version = { mcVersion, hotfix -> - val version = when (mcVersion) { + version = { mcVersion -> + val version = when (mcVersion.code) { // snapshot version format: // "0-alpha.${mc[mcVersion]}.+" in 12002..12003 -> "86" @@ -14,13 +14,13 @@ val neoForge = Dependency( in 12102..12104 -> "1-beta" in 12105..12110 -> "25-beta" 12111 -> "24-beta" - 22601 -> when (hotfix) { - 0 -> "0-alpha.4+snapshot-1" - else -> throw IllegalStateException("Hotfix $hotfix is not yet supported!") - } + 260100 -> "0-alpha.4+snapshot-1" else -> throw IllegalStateException("Version $mcVersion is not yet supported!") } - val mc = versionStr(mcVersion, hotfix, true).substring(2) + val mc = mcVersion + .let { it.alwaysShowHotfix = true; it } + .string + .let { if (mcVersion.code >= 260100) it else it.substring(2) } "${mc}.${version}" }, diff --git a/buildSrc/src/main/kotlin/dependencies/RecipeViewer.kt b/buildSrc/src/main/kotlin/dependencies/RecipeViewer.kt index b1d84496..fe54f335 100644 --- a/buildSrc/src/main/kotlin/dependencies/RecipeViewer.kt +++ b/buildSrc/src/main/kotlin/dependencies/RecipeViewer.kt @@ -1,27 +1,30 @@ package dependencies -fun emi(mcVersion: Int, loader: String? = null, api: Boolean = false) = Dependency( +import CGVer + +fun emi(mcVersion: CGVer, loader: String? = null, api: Boolean = false) = Dependency( group = "dev.emi", name = if (loader != null) { // EMI migrate to NeoForge after 1.20.2 - if (loader != "fabric" && mcVersion <= 12002) "emi-forge" else "emi-$loader" + if (loader != "fabric" && mcVersion.code <= 12002) "emi-forge" else "emi-$loader" } else "emi", - version = { _, _ -> + version = { _ -> buildString { - if (mcVersion <= 11802) { - append("0.7.3+${versionStr(mcVersion)}") // There are no multi-loader support in 1.18.2 + if (mcVersion.code <= 11802) { + append("0.7.3+$mcVersion") // There are no multi-loader support in 1.18.2 } else { append("1.1.21+") append( // They didn't break API on MC version upgrade so mismatch should be fine - when (mcVersion) { + when (mcVersion.code) { in 11900..11902 -> "1.19.2" - in 11903..11904 -> versionStr(mcVersion) + in 11903..11904 -> mcVersion.string in 12000..12001 -> "1.20.1" - 12002, 12004 -> versionStr(mcVersion) + 12002, 12004 -> mcVersion.string 12003 -> "1.20.2" in 12005..12006 -> "1.20.6" in 12100..12111 -> "1.21.1" + 260100 -> "1.21.1" // FIXME: Not confirmed, but EMI might skip 1.21.11 for 26.1 else -> throw IllegalStateException("$mcVersion is not yet supported!") } ) @@ -38,9 +41,9 @@ fun rei(loader: String, api: Boolean = false) = Dependency( } else { "RoughlyEnoughItems-$loader" }, - version = { mcVersion, hotfix -> + version = { mcVersion -> // They didn't break API on MC version upgrade so mismatch should be fine - when (mcVersion) { + when (mcVersion.code) { 11802 -> "8.3.618" in 11900..11902 -> "9.1.619" in 11903..11904 -> "11.0.621" @@ -48,27 +51,30 @@ fun rei(loader: String, api: Boolean = false) = Dependency( in 12002..12004 -> "13.0.685" in 12005..12006 -> "15.0.787" in 12100..12101 -> "16.0.788" - in 12102..12111 -> "17.0.789" + in 12102..12110 -> "17.0.789" + 12111 -> "17.0.789" // FIXME: Broken in 1.21.11, waiting for new release + 260100 -> "17.0.789" else -> throw IllegalStateException("$mcVersion is not yet supported!") } }, ) -fun jei(mcVersion: Int, loader: String, common: Boolean = false, api: Boolean = false) = Dependency( +fun jei(mcVersion: CGVer, loader: String, common: Boolean = false, api: Boolean = false) = Dependency( group = "mezz.jei", name = buildString { append("jei-") append( // They didn't break API on MC version upgrade so mismatch should be fine - when (mcVersion) { - 11802 -> versionStr(mcVersion) + when (mcVersion.code) { + 11802 -> mcVersion.string in 11900..11903 -> "1.19.2" - 11904 -> versionStr(mcVersion) + 11904 -> mcVersion.string in 12000..12001 -> "1.20.1" in 12002..12004 -> "1.20.2" - in 12005..12006 -> versionStr(mcVersion) + in 12005..12006 -> mcVersion.string in 12100..12110 -> "1.21.1" 12111 -> "1.21.11" + 260100 -> "1.21.11" else -> throw IllegalStateException("$mcVersion is not yet supported!") } ) @@ -77,15 +83,15 @@ fun jei(mcVersion: Int, loader: String, common: Boolean = false, api: Boolean = append("-common") } else { append("-") - if (loader != "fabric" && mcVersion < 12100) append("forge") + if (loader != "fabric" && mcVersion.code < 12100) append("forge") else append(loader) } append ("-api") } }, - version = { _, _ -> + version = { _ -> // They didn't break API on MC version upgrade so mismatch should be fine - when (mcVersion) { + when (mcVersion.code) { 11802 -> "10.2.1.1009" in 11900..11903 -> "11.8.1.1034" 11904 -> "13.1.0.13" @@ -94,6 +100,7 @@ fun jei(mcVersion: Int, loader: String, common: Boolean = false, api: Boolean = in 12005..12006 -> "18.0.0.62" in 12100..12110 -> "19.21.1.248" 12111 -> "27.3.0.14" + 260100 -> "27.3.0.14" else -> throw IllegalStateException("$mcVersion is not yet supported!") } }, diff --git a/buildSrc/src/main/kotlin/multiloader.gradle.kts b/buildSrc/src/main/kotlin/multiloader.gradle.kts new file mode 100644 index 00000000..ad3033f8 --- /dev/null +++ b/buildSrc/src/main/kotlin/multiloader.gradle.kts @@ -0,0 +1,33 @@ +plugins { + id("java-library") +} + +val xplatJava: Configuration by configurations.creating { + isCanBeResolved = true +} +val xplatResources: Configuration by configurations.creating { + isCanBeResolved = true +} + +dependencies { + compileOnly(project(":xplat")) + xplatJava(project(":xplat", "xplatJava")) + xplatResources(project(":xplat", "xplatResources")) +} + +tasks.compileJava { + dependsOn(xplatJava) + source(xplatJava) +} + +tasks.named("sourcesJar") { + dependsOn(xplatJava) + dependsOn(xplatResources) + from(xplatJava) + from(xplatResources) +} + +tasks.processResources { + dependsOn(xplatResources) + from(xplatResources) +} diff --git a/cobblegen/build.gradle.kts b/cobblegen/build.gradle.kts deleted file mode 100644 index 8aa5d771..00000000 --- a/cobblegen/build.gradle.kts +++ /dev/null @@ -1,180 +0,0 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import dependencies.* -import net.fabricmc.loom.task.RemapJarTask - -plugins { -} - -val mcVersion = ext["mcVersion"] as Int -val mcVersionStr = ext["mcVersionStr"] as String -val mcHotfix = ext["mcHotfix"] as Int -val loaderName = ext["loaderName"] as String -val isFabric = ext["isFabric"] as Boolean -val isForge = ext["isForge"] as Boolean -val isNeo = ext["isNeo"] as Boolean - -group = project.properties["maven_group"] as String - -loom { - if (mcVersion >= 12105) { - accessWidenerPath = project.file("src/main/resources/cobblegen.accesswidener") - } - - runConfigs { - named("client") { - runDir = "../run/client" - configName = (if (isFabric) "Fabric" else if (!isNeo) "Forge" else "NeoForge") + " Client" - //vmArg("-Dnull2264.cobblegen.gametest=true") - ideConfigGenerated(true) - } - named("server") { - runDir = "../run/server" - configName = (if (isFabric) "Fabric" else if (!isNeo) "Forge" else "NeoForge") + " Server" - //vmArg("-Dnull2264.cobblegen.gametest=true") - ideConfigGenerated(true) - } - register("gametest") { - server() - name("Server GameTest") - - vmArg("-Dnull2264.cobblegen.gametest=true") - vmArg("-Dfabric-api.gametest") - vmArg("-Dfabric-api.gametest.report-file=${rootProject.layout.buildDirectory.file("reports/junit.xml").get().getAsFile()}") - // For Forge-alike - property("$loaderName.enabledGameTestNamespaces", "cobblegen") - property("$loaderName.gameTestServer", "true") - property("$loaderName.enableGameTest", "true") - - runDir("../run/serverGameTest") - ideConfigGenerated(false) // Mostly for CI - if (isNeo) { - /* - * Apparently this replicate NeoGradle's - * - * runs { - * gameTest { - * type = "gameTestServer" - * } - * } - */ - environment("gameTestServer") - forgeTemplate("gameTestServer") - if (mcVersion >= 12111) { - // REF: https://github.com/neoforged/NeoForge/blob/af6abbe00ab3071ad58c2cb70b988cb79f0b4af8/buildSrc/src/main/java/net/neoforged/neodev/CreateUserDevConfig.java#L128 - setDefaultMainClass("net.neoforged.fml.startup.GameTestServer") - } - } - } - } - - if (!isFabric && !isNeo) { - forge { - mixinConfigs = listOf( - "cobblegen.mixins.json" - ) - } - } -} - -dependencies { - if (isFabric) { - modImplementation("net.fabricmc:fabric-loader:0.17.2") - - // Mainly for testing - // Only use gametest API for 1.21.5+, because the full FAPI is causing crashes on dev env - // REF: https://github.com/FabricMC/fabric/issues/4491 - if (mcVersion in 11606..12104) { - modLocalRuntime(fapi.versioned(mcVersion, mcHotfix)) - } else if (mcVersion in 12105..12110) { - // FIXME: Is Resource Loader even needed? - //modLocalRuntime(fapiResourceLoader.versioned(mcVersion, mcHotfix)) - modLocalRuntime(fapiGameTest.versioned(mcVersion, mcHotfix)) - } - } else { - if (!isNeo) { - "forge"(lexForge.versioned(mcVersion, mcHotfix)) - } else { - "neoForge"(neoForge.versioned(mcVersion, mcHotfix)) - } - } - - if (mcVersion > 11605) { - // TODO: Maybe it's no longer needed since we can just use ':stubs'? - // We just want their source code so we can mixin it - if (isFabric) { - // modCompileOnly("io.github.fabricators_of_create:Porting-Lib:${project.properties["port_lib_version_1_18_2"]}") - // modCompileOnly("com.simibubi.create:create-fabric-${project.properties["minecraft_version_1_18_2"]}:${project.properties["create_version_1_18_2"]}") - } else { - // modCompileOnly(createMod(isNeo).versioned(0)) { isTransitive = false } - } - - // <- EMI - if (mcVersion <= 11802) { - modCompileOnly(emi(mcVersion, null, api = true).versioned(0, 0)) - if (project.properties["recipe_viewer"] == "emi" && isFabric) - modLocalRuntime(emi(mcVersion).versioned(0, 0)) - } else { - modCompileOnly(emi(mcVersion, loaderName, api = true).versioned(0, 0)) - if (project.properties["recipe_viewer"] == "emi") - modLocalRuntime(emi(mcVersion, loaderName).versioned(0, 0)) - } - // EMI -> - - // <- REI - // Use the full package instead of 'api-' for (neo)forge, since the 'api-' didn't include @REIPlugin* - modCompileOnly(rei(loaderName, true).versioned(mcVersion, mcHotfix)) - if (mcVersion in 12002..12104) { // FIXME: Not sure why it's not included - modCompileOnly("me.shedaniel.cloth:basic-math:0.6.1") - modCompileOnly("dev.architectury:architectury:11.1.13") - } - if (project.properties["recipe_viewer"] == "rei") { - if (mcVersion == 11902) // REI's stupid dep bug - modLocalRuntime("dev.architectury:architectury-fabric:6.5.77") - modLocalRuntime(rei(loaderName).versioned(mcVersion, mcHotfix)) - } - // REI -> - - // <- JEI - modCompileOnly(jei(mcVersion, loaderName, common = true, api = true).versioned(0, 0)) - modCompileOnly(jei(mcVersion, loaderName, common = false, api = true).versioned(0, 0)) - if (project.properties["recipe_viewer"] == "jei") - modCompileOnly(jei(mcVersion, loaderName, common = false, api = false).versioned(0, 0)) - // JEI -> - - /* FIXME: Broken, somehow - if (mcVersion == 11802 && isFabric) { - modLocalRuntime("com.tterrag.registrate_fabric:Registrate:MC1.18.2-1.1.7") - modLocalRuntime("io.github.fabricators_of_create:Porting-Lib:${project.port_lib_version_1_18_2}") - modLocalRuntime("com.simibubi.create:create-fabric-${project.minecraft_version_1_18_2}:${project.create_version_1_18_2}") - } - */ - } -} - -val remapJar by tasks.getting(RemapJarTask::class) { - val shadowJar by tasks.getting(ShadowJar::class) - dependsOn(shadowJar) - if (isForge && mcVersion >= 12105) { - atAccessWideners.add("cobblegen.accesswidener") - } - inputFile.set(shadowJar.archiveFile) -} - -//val deleteResources by tasks.creating(Delete::class) { -// delete(file("build/resources/main")) -//} - -//tasks.processResources { -// dependsOn(tasks.named("copyCommonLoaderResources")) -//} - -//tasks.getting(RunGameTask::class) { -// dependsOn(tasks.named("copyCommonLoaderResources")) -// finalizedBy(deleteResources) -//} - -//tasks.sourcesJar { -// val commonSources = project(":common").tasks.sourcesJar.get() -// dependsOn(commonSources) -// from(commonSources.archiveFile.map { zipTree(it) }) -//} diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/CobbleGenPreLaunch.java b/cobblegen/src/main/java/io/github/null2264/cobblegen/CobbleGenPreLaunch.java deleted file mode 100644 index 19b7ef21..00000000 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/CobbleGenPreLaunch.java +++ /dev/null @@ -1,14 +0,0 @@ -#if FABRIC -package io.github.null2264.cobblegen; - -public class CobbleGenPreLaunch implements net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint { - public CobbleGenPreLaunch() { - #if MC>=12105 - io.github.null2264.cobblegen.gametest.CobbleGenTestLoader.init(); - #endif - } - - @Override - public void onPreLaunch() {} -} -#endif diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/compat/LoaderCompat.java b/cobblegen/src/main/java/io/github/null2264/cobblegen/compat/LoaderCompat.java deleted file mode 100644 index 7a7ff50c..00000000 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/compat/LoaderCompat.java +++ /dev/null @@ -1,110 +0,0 @@ -package io.github.null2264.cobblegen.compat; - -import java.nio.file.Path; - -#if FABRIC -import net.fabricmc.loader.api.FabricLoader; - #if MC<=11605 -import java.io.IOException; -import java.nio.file.FileSystems; -import java.nio.file.Files; - #endif -#elif FORGE - #if FORGE>=2 && MC>=12002 -import net.neoforged.fml.loading.FMLPaths; -import net.neoforged.fml.ModList; -import net.neoforged.fml.loading.LoadingModList; - #else -import net.minecraftforge.fml.loading.FMLPaths; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.loading.LoadingModList; - #endif -#else - #error "Invalid loader name" -#endif - -public class LoaderCompat { - public static boolean isModLoaded(String mod) { - #if FABRIC - return net.fabricmc.loader.api.FabricLoader.getInstance().isModLoaded(mod); - #else - ModList modlist = ModList.get(); - if (modlist == null) // mainly for MixinConfigPlugin - return LoadingModList.get().getModFileById(mod) != null; - return modlist.isLoaded(mod); - #endif - } - - public static Path getConfigDir() { - #if FABRIC - #if MC>11605 - return FabricLoader.getInstance().getConfigDir(); - #else - // Not ideal, but configDir is null somehow in 1.16.5 - Path configDir = FileSystems.getDefault().getPath(".", "config"); - if (!Files.exists(configDir)) { // Stolen from fabric loader - try { - Files.createDirectories(configDir); - } catch (IOException e) { - throw new RuntimeException("Creating config directory", e); - } - } - return configDir; - #endif - #elif FORGE - return FMLPaths.CONFIGDIR.get(); - #else - #error "Invalid loader name" - #endif - } - - public static LoaderType getType() { - #if FABRIC - #if FABRIC==1 - return LoaderType.FABRIC; - #else - return LoaderType.QUILT; - #endif - #elif FORGE - #if FORGE==1 - return LoaderType.FORGE; - #else - return LoaderType.NEOFORGE; - #endif - #else - #error "Invalid loader name" - #endif - } - - public static Boolean isFabric() { - return getType() == LoaderType.FABRIC; - } - - public static Boolean isQuilt() { - return getType() == LoaderType.QUILT; - } - - public static Boolean isFabricLike() { - return isFabric() || isQuilt(); - } - - public static Boolean isForge() { - return getType() == LoaderType.FORGE; - } - - public static Boolean isNeoForge() { - return getType() == LoaderType.NEOFORGE; - } - - public static Boolean isForgeLike() { - return isForge() || isNeoForge(); - } - - @SuppressWarnings("unused") - public enum LoaderType { - FABRIC, - QUILT, - FORGE, - NEOFORGE - } -} diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/compat/ModContainerCompat.java b/cobblegen/src/main/java/io/github/null2264/cobblegen/compat/ModContainerCompat.java deleted file mode 100644 index eb492cb0..00000000 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/compat/ModContainerCompat.java +++ /dev/null @@ -1,82 +0,0 @@ -package io.github.null2264.cobblegen.compat; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -#if FORGE - #if FORGE==1 -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.loading.LoadingModList; -import net.minecraftforge.forgespi.language.IModInfo; - #else -import net.neoforged.fml.ModList; -import net.neoforged.fml.loading.LoadingModList; -import net.neoforged.neoforgespi.language.IModInfo; - #endif -#endif - -public class ModContainerCompat { - public static ConcurrentMap CACHED = new ConcurrentHashMap<>(); - private final - #if FABRIC - net.fabricmc.loader.api.ModContainer - #else - IModInfo - #endif - container; - - private ModContainerCompat(String modid) { - #if FORGE - IModInfo modInfo; - if (ModList.get() == null) // mainly for MixinConfigPlugin - // I hate this... but should be fine since it happened on loading state - modInfo = LoadingModList.get() - .getModFileById(modid) - .getMods() - .stream() - .filter(i -> i.getModId().equals(modid)) - .findFirst() - #if MC<=11605 - .orElseThrow(NullPointerException::new); - #else - .orElseThrow(); - #endif - else - modInfo = ModList.get() - .getModContainerById(modid) - #if MC<=11605 - .orElseThrow(NullPointerException::new) - #else - .orElseThrow() - #endif - .getModInfo(); - #endif - this.container = - #if FABRIC - net.fabricmc.loader.api.FabricLoader.getInstance().getModContainer(modid) - #if MC<=11605 - .orElseThrow(NullPointerException::new); - #else - .orElseThrow(); - #endif - #else - modInfo; - #endif - } - - public static ModContainerCompat fromLoader(String modid) { - if (CACHED.containsKey(modid)) return CACHED.get(modid); - - ModContainerCompat rt = new ModContainerCompat(modid); - CACHED.put(modid, new ModContainerCompat(modid)); - return rt; - } - - public String getVersionString() { - #if FABRIC - return container.getMetadata().getVersion().getFriendlyString(); - #else - return container.getVersion().toString(); - #endif - } -} diff --git a/fabric/README.md b/fabric/README.md new file mode 100644 index 00000000..c30ad796 --- /dev/null +++ b/fabric/README.md @@ -0,0 +1,3 @@ +# `:fabric` + +This module contains source code that depends on Fabric. diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 00000000..c4505f23 --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,216 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import dependencies.* +import dependencies.minecraft as MC +import net.fabricmc.loom.task.RemapJarTask +import java.util.Locale +import net.fabricmc.loom.api.LoomGradleExtensionAPI + +plugins { + id("multiloader") + id(GradlePlugin.Loom.id) version "1.14.10" apply false + id(GradlePlugin.LegacyLoom.id) version "1.14.10" apply false +} + +val mcVersion = ext["mcVersion"] as CGVer +val loaderName = "fabric" +val projectPlugin = if (mcVersion.code >= 260100) { + GradlePlugin.Loom +} else { + GradlePlugin.LegacyLoom +} + +group = project.properties["maven_group"] as String + +apply(plugin = projectPlugin.id) + +fun GradlePlugin.configure(configuration: LoomGradleExtensionAPI.() -> Unit = {}) = + project.the() + .apply { + if (mcVersion.code >= 12105) { + accessWidenerPath = project(":xplat").file("src/main/resources/cobblegen.accesswidener") + } + runConfigs { + named("client") { + runDir = "../run/client" + configName = "Fabric Client" + //vmArg("-Dnull2264.cobblegen.gametest=true") + ideConfigGenerated(true) + } + named("server") { + runDir = "../run/server" + configName = "Fabric Server" + //vmArg("-Dnull2264.cobblegen.gametest=true") + ideConfigGenerated(true) + } + register("gametest") { + server() + name("Server GameTest") + + vmArg("-Dnull2264.cobblegen.gametest=true") + vmArg("-Dfabric-api.gametest") + vmArg( + "-Dfabric-api.gametest.report-file=${ + rootProject.layout.buildDirectory.file("reports/junit.xml").get().getAsFile() + }" + ) + + runDir("../run/serverGameTest") + ideConfigGenerated(false) // Mostly for CI + } + } + + configuration() + } + +val loom = projectPlugin.configure() + +//if (projectPlugin.isLegacy) loom.silentMojangMappingsLicense() + +tasks.withType().configureEach { + javaLauncher.set(javaToolchains.launcherFor(java.toolchain)) +} + +fun DependencyHandlerScope.dep(configuration: String, dependency: String) { + add( + configuration.let { + if (projectPlugin.isLegacy) { + it + } else { + it.replace("mod", "").replaceFirstChar { c -> c.lowercase(Locale.getDefault()) } + } + }, + dependency, + ) +} + +dependencies { + val minecraft by configurations + minecraft(MC.versioned(mcVersion)) + if (projectPlugin.isLegacy) { + val mappings by configurations + mappings(loom.officialMojangMappings()) + } + + dep("modImplementation", "net.fabricmc:fabric-loader:0.18.4") + + // Mainly for testing + // Only use gametest API for 1.21.5+, because the full FAPI is causing crashes on dev env + // REF: https://github.com/FabricMC/fabric/issues/4491 + if (mcVersion.code in 11606..12104) { + dep("modLocalRuntime", fapi.versioned(mcVersion)) + } else { + try { + // FIXME: Is Resource Loader even needed? + //modLocalRuntime(fapiResourceLoader.versioned(mcVersion)) + dep("modLocalRuntime", fapiGameTest.versioned(mcVersion)) + } catch (_: IllegalStateException) { + } + } + + if (mcVersion.code >= 260100) { + // FIXME: For some reason mixin is missing? + dep("compileOnly", "org.spongepowered:mixin:0.8.7") + } + + // Bunch of dummy classes, just so that the mod compiles + compileOnly(project(":stubs")) + + if (mcVersion.code > 11605) { + // FIXME: RuntimeOnly + // We just want their source code so we can mixin it + // modCompileOnly("io.github.fabricators_of_create:Porting-Lib:${project.properties["port_lib_version_1_18_2"]}") + // modCompileOnly("com.simibubi.create:create-fabric-${project.properties["minecraft_version_1_18_2"]}:${project.properties["create_version_1_18_2"]}") + + // <- EMI + if (mcVersion.code <= 11802) { + dep("modCompileOnly", emi(mcVersion, null, api = true).versioned(CGVer.wildcard())) + if (project.properties["recipe_viewer"] == "emi") + dep("modLocalRuntime", emi(mcVersion).versioned(CGVer.wildcard())) + } else { + if (mcVersion.code <= 12105) { + dep("modCompileOnly", emi(mcVersion, loaderName, api = true).versioned(CGVer.wildcard())) + if (project.properties["recipe_viewer"] == "emi") + dep("modLocalRuntime", emi(mcVersion, loaderName).versioned(CGVer.wildcard())) + } + } + // EMI -> + + // <- REI + // Use the full package instead of 'api-' for (neo)forge, since the 'api-' didn't include @REIPlugin* + dep("modCompileOnly", rei(loaderName, true).versioned(mcVersion)) + if (mcVersion.code in 12002..12104) { // FIXME: Not sure why it's not included + dep("modCompileOnly", "me.shedaniel.cloth:basic-math:0.6.1") + dep("modCompileOnly", "dev.architectury:architectury:11.1.13") + } + if (project.properties["recipe_viewer"] == "rei") { + if (mcVersion.code == 11902) // REI's stupid dep bug + dep("modLocalRuntime", "dev.architectury:architectury-fabric:6.5.77") + dep("modLocalRuntime", rei(loaderName).versioned(mcVersion)) + } + // REI -> + + // <- JEI + dep("modCompileOnly", jei(mcVersion, loaderName, common = true, api = true).versioned(CGVer.wildcard())) + dep("modCompileOnly", jei(mcVersion, loaderName, common = false, api = true).versioned(CGVer.wildcard())) + if (project.properties["recipe_viewer"] == "jei") + dep("modCompileOnly", jei(mcVersion, loaderName, common = false, api = false).versioned(CGVer.wildcard())) + // JEI -> + + /* FIXME: Broken, somehow + if (mcVersion == 11802 && isFabric) { + modLocalRuntime("com.tterrag.registrate_fabric:Registrate:MC1.18.2-1.1.7") + modLocalRuntime("io.github.fabricators_of_create:Porting-Lib:${project.port_lib_version_1_18_2}") + modLocalRuntime("com.simibubi.create:create-fabric-${project.minecraft_version_1_18_2}:${project.create_version_1_18_2}") + } + */ + } +} + +tasks.jar { + manifest.attributes(mapOf( + "Contains-Sources" to "java,class", + "MixinConfigs" to "cobblegen.mixins.json", + )) +} + +if (projectPlugin.isLegacy) { + tasks.withType { + val shadowJar by tasks.getting(ShadowJar::class) + inputFile.set(shadowJar.archiveFile) + } +} else { + tasks.jar { + archiveClassifier = "dev" + } + + val productionJar by tasks.register("productionJar") { + dependsOn(tasks.jar) + archiveClassifier = "" + archiveExtension = "jar" + destinationDirectory = layout.buildDirectory.dir("libs") + from(zipTree(tasks.shadowJar.flatMap { it.archiveFile })) + } + + tasks.assemble { + dependsOn(productionJar) + } +} + +//val deleteResources by tasks.creating(Delete::class) { +// delete(file("build/resources/main")) +//} + +//tasks.processResources { +// dependsOn(tasks.named("copyCommonLoaderResources")) +//} + +//tasks.getting(RunGameTask::class) { +// dependsOn(tasks.named("copyCommonLoaderResources")) +// finalizedBy(deleteResources) +//} + +//tasks.sourcesJar { +// val commonSources = project(":common").tasks.sourcesJar.get() +// dependsOn(commonSources) +// from(commonSources.archiveFile.map { zipTree(it) }) +//} diff --git a/fabric/src/main/java/io/github/null2264/cobblegen/fabric/CobbleGenFabric.java b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/CobbleGenFabric.java new file mode 100644 index 00000000..98546fa3 --- /dev/null +++ b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/CobbleGenFabric.java @@ -0,0 +1,15 @@ +package io.github.null2264.cobblegen.fabric; + +import io.github.null2264.cobblegen.CobbleGen; +import io.github.null2264.cobblegen.compat.LoaderCompat; +import io.github.null2264.cobblegen.fabric.util.PluginFinderFabric; +import io.github.null2264.cobblegen.forge.compat.LoaderCompatFabric; +import io.github.null2264.cobblegen.util.PluginFinder; + +public class CobbleGenFabric extends CobbleGen implements net.fabricmc.api.ModInitializer { + + @Override + public void onInitialize() { + super.init(); + } +} diff --git a/fabric/src/main/java/io/github/null2264/cobblegen/fabric/CobbleGenPreLaunch.java b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/CobbleGenPreLaunch.java new file mode 100644 index 00000000..b400bef4 --- /dev/null +++ b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/CobbleGenPreLaunch.java @@ -0,0 +1,13 @@ +package io.github.null2264.cobblegen.fabric; + +import io.github.null2264.cobblegen.compat.LoaderCompat; +import io.github.null2264.cobblegen.fabric.util.PluginFinderFabric; +import io.github.null2264.cobblegen.forge.compat.LoaderCompatFabric; +import io.github.null2264.cobblegen.util.PluginFinder; + +public class CobbleGenPreLaunch implements net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint { + public CobbleGenPreLaunch() {} + + @Override + public void onPreLaunch() {} +} diff --git a/fabric/src/main/java/io/github/null2264/cobblegen/fabric/compat/LoaderCompatFabric.java b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/compat/LoaderCompatFabric.java new file mode 100644 index 00000000..9cc082d4 --- /dev/null +++ b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/compat/LoaderCompatFabric.java @@ -0,0 +1,54 @@ +package io.github.null2264.cobblegen.forge.compat; + +import io.github.null2264.cobblegen.compat.LoaderCompat; +import io.github.null2264.cobblegen.compat.ModContainerCompat; +import io.github.null2264.cobblegen.fabric.compat.ModContainerFabric; +import net.fabricmc.loader.api.FabricLoader; + +import java.nio.file.Path; + +#if MC<=11605 +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.Files; +#endif + +public class LoaderCompatFabric extends LoaderCompat { + + @Override + public boolean isModLoaded(String mod) { + return net.fabricmc.loader.api.FabricLoader.getInstance().isModLoaded(mod); + } + + @Override + public Path getConfigDir() { + #if MC>11605 + return FabricLoader.getInstance().getConfigDir(); + #else + // Not ideal, but configDir is null somehow in 1.16.5 + Path configDir = FileSystems.getDefault().getPath(".", "config"); + if (!Files.exists(configDir)) { // Stolen from fabric loader + try { + Files.createDirectories(configDir); + } catch (IOException e) { + throw new RuntimeException("Creating config directory", e); + } + } + return configDir; + #endif + } + + @Override + public LoaderType getType() { + return LoaderType.FABRIC; + } + + @Override + public ModContainerCompat getMod(String modId) { + if (isModCached(modId)) return super.getMod(modId); + + ModContainerCompat rt = new ModContainerFabric(modId); + CACHED_CONTAINER.put(modId, rt); + return rt; + } +} diff --git a/fabric/src/main/java/io/github/null2264/cobblegen/fabric/compat/ModContainerFabric.java b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/compat/ModContainerFabric.java new file mode 100644 index 00000000..96ff0ae7 --- /dev/null +++ b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/compat/ModContainerFabric.java @@ -0,0 +1,22 @@ +package io.github.null2264.cobblegen.fabric.compat; + +import io.github.null2264.cobblegen.compat.ModContainerCompat; + +public class ModContainerFabric extends ModContainerCompat { + + private final net.fabricmc.loader.api.ModContainer container; + + public ModContainerFabric(String modid) { + this.container = net.fabricmc.loader.api.FabricLoader.getInstance().getModContainer(modid) + #if MC<=11605 + .orElseThrow(NullPointerException::new); + #else + .orElseThrow(); + #endif + } + + @Override + public String getVersionString() { + return container.getMetadata().getVersion().getFriendlyString(); + } +} diff --git a/fabric/src/main/java/io/github/null2264/cobblegen/fabric/mixin/core/CobbleGenMixinPluginFabric.java b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/mixin/core/CobbleGenMixinPluginFabric.java new file mode 100644 index 00000000..b38887c9 --- /dev/null +++ b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/mixin/core/CobbleGenMixinPluginFabric.java @@ -0,0 +1,17 @@ +package io.github.null2264.cobblegen.fabric.mixin.core; + +import io.github.null2264.cobblegen.compat.LoaderCompat; +import io.github.null2264.cobblegen.fabric.util.PluginFinderFabric; +import io.github.null2264.cobblegen.forge.compat.LoaderCompatFabric; +import io.github.null2264.cobblegen.mixin.core.CobbleGenMixinPlugin; +import io.github.null2264.cobblegen.util.PluginFinder; + +public class CobbleGenMixinPluginFabric extends CobbleGenMixinPlugin { + + @Override + public void onLoad(String mixinPackage) { + LoaderCompat.init(new LoaderCompatFabric()); + PluginFinder.init(new PluginFinderFabric()); + super.onLoad(mixinPackage); + } +} diff --git a/fabric/src/main/java/io/github/null2264/cobblegen/fabric/mixin/create/CreateFluidReactionsMixin$PatchE.java b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/mixin/create/CreateFluidReactionsMixin$PatchE.java new file mode 100644 index 00000000..3660eae3 --- /dev/null +++ b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/mixin/create/CreateFluidReactionsMixin$PatchE.java @@ -0,0 +1,37 @@ +#if MC>11605 +package io.github.null2264.cobblegen.fabric.mixin.create; + +import io.github.fabricators_of_create.porting_lib.util.FluidStack; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static io.github.null2264.cobblegen.CobbleGen.FLUID_INTERACTION; + +/** + * Mixin for Create Fabric (pre) Patch F + */ +@Pseudo +@Mixin(targets = {"com.simibubi.create.content.contraptions.fluids.FluidReactions", "com.simibubi.create.content.fluids.FluidReactions"}) +public abstract class CreateFluidReactionsMixin$PatchE +{ + @Inject( + method = "handlePipeFlowCollision", + #if FORGE + remap = false, + #endif + at = @At(value = "HEAD"), cancellable = true + ) + private static void generator$handlePipeFlowCollision( + Level level, BlockPos pos, FluidStack fluid1, FluidStack fluid2, CallbackInfo ci + ) { + final boolean success = FLUID_INTERACTION.interactFromPipe(level, pos, fluid1.getFluid(), fluid2.getFluid()); + if (success) + ci.cancel(); + } +} +#endif diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/create/CreateFluidReactionsMixin$PatchF.java b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/mixin/create/CreateFluidReactionsMixin$PatchF.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/create/CreateFluidReactionsMixin$PatchF.java rename to fabric/src/main/java/io/github/null2264/cobblegen/fabric/mixin/create/CreateFluidReactionsMixin$PatchF.java diff --git a/fabric/src/main/java/io/github/null2264/cobblegen/fabric/util/PluginFinderFabric.java b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/util/PluginFinderFabric.java new file mode 100644 index 00000000..786f03a8 --- /dev/null +++ b/fabric/src/main/java/io/github/null2264/cobblegen/fabric/util/PluginFinderFabric.java @@ -0,0 +1,22 @@ +package io.github.null2264.cobblegen.fabric.util; + +import io.github.null2264.cobblegen.CobbleGenPlugin; +import io.github.null2264.cobblegen.util.PluginFinder; +import net.fabricmc.loader.api.FabricLoader; + +import java.util.List; + +import static io.github.null2264.cobblegen.compat.CollectionCompat.streamToList; + +public class PluginFinderFabric extends PluginFinder { + + @Override + public List getModPlugins() { + return streamToList( + FabricLoader.getInstance() + .getEntrypointContainers("cobblegen_plugin", CobbleGenPlugin.class) + .stream() + .map(entrypoint -> new PlugInContainer(entrypoint.getProvider().getMetadata().getId(), entrypoint.getEntrypoint())) + ); + } +} diff --git a/fabric/src/main/resources/cobblegen.fabric.mixins.json b/fabric/src/main/resources/cobblegen.fabric.mixins.json new file mode 100644 index 00000000..36533336 --- /dev/null +++ b/fabric/src/main/resources/cobblegen.fabric.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.null2264.cobblegen.fabric.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + // Will be added by build script (build.gradle.kts) + ], + "client": [ + // Will be added by build script (build.gradle.kts) + ], + "server": [ + // Will be added by build script (build.gradle.kts) + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/cobblegen/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json similarity index 90% rename from cobblegen/src/main/resources/fabric.mod.json rename to fabric/src/main/resources/fabric.mod.json index 39cd201c..05352967 100644 --- a/cobblegen/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -17,10 +17,10 @@ "environment": "*", "entrypoints": { "preLaunch": [ - "io.github.null2264.cobblegen.CobbleGenPreLaunch" + "io.github.null2264.cobblegen.fabric.CobbleGenPreLaunch" ], "main": [ - "io.github.null2264.cobblegen.CobbleGen" + "io.github.null2264.cobblegen.fabric.CobbleGenFabric" ], "jei_mod_plugin": [ // Will be added by build script (build.gradle.kts) @@ -39,6 +39,7 @@ ] }, "mixins": [ + "cobblegen.fabric.mixins.json", "cobblegen.mixins.json" ], "custom": { diff --git a/forge/README.md b/forge/README.md new file mode 100644 index 00000000..5699f4c9 --- /dev/null +++ b/forge/README.md @@ -0,0 +1,4 @@ +# `:forge` + +This module contains source code that depends on (Neo)Forge. This submodule handles Forge for 1.16.5 up to 1.20.1, +and NeoForge after 1.20.1. There are no Forge support for 1.20.2 onwards and there won't be any in the future. diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts new file mode 100644 index 00000000..d3aaf44b --- /dev/null +++ b/forge/build.gradle.kts @@ -0,0 +1,208 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import dependencies.* +import java.util.Locale +import net.neoforged.moddevgradle.dsl.ModDevExtension +import net.neoforged.moddevgradle.dsl.NeoForgeExtension +import net.neoforged.moddevgradle.legacyforge.dsl.LegacyForgeExtension +import net.neoforged.moddevgradle.legacyforge.dsl.MixinExtension +import net.neoforged.moddevgradle.legacyforge.dsl.ObfuscationExtension +import net.neoforged.moddevgradle.tasks.JarJar +import org.gradle.kotlin.dsl.configureEach + +plugins { + id("multiloader") + id(GradlePlugin.MDG.id) version "2.0.140" apply false + id(GradlePlugin.LegacyMDG.id) version "2.0.140" apply false +} + +val mcVersion = ext["mcVersion"] as CGVer +val isNeo = mcVersion.code >= 12002 +val loaderName = if (isNeo) "neoforge" else "forge" +val projectPlugin = if (mcVersion.code >= 12002) { + GradlePlugin.MDG +} else { + GradlePlugin.LegacyMDG +} + +group = project.properties["maven_group"] as String + +apply(plugin = projectPlugin.id) + +inline fun GradlePlugin.configure(configuration: T.() -> Unit = {}) { + project.the() + .apply { + // FIXME: AccessWidener to AccessTransformer + validateAccessTransformers = mcVersion.code >= 12105 + + runs { +// configureEach { +// javaLauncher.set(javaToolchains.launcherFor(java.toolchain)) +// } + create("client") { + client() + gameDirectory.set(rootProject.file("run/client")) + ideName.set((if (!isNeo) "Forge" else "NeoForge") + " Client") + } + create("server") { + server() + gameDirectory.set(rootProject.file("run/server")) + ideName.set((if (!isNeo) "Forge" else "NeoForge") + " Server") + } + create("gametest") { + type = "gameTestServer" + gameDirectory.set(rootProject.file("run/serverGameTest")) + ideName.set("") + jvmArgument("-Dnull2264.cobblegen.gametest=true") + systemProperty("$loaderName.enabledGameTestNamespaces", "cobblegen") + systemProperty("$loaderName.gameTestServer", "true") + systemProperty("$loaderName.enableGameTest", "true") + } + } + + mods { + create("${base.archivesName.get()}") { + sourceSet(sourceSets.main.get()) + sourceSet(project(":xplat").sourceSets.main.get()) + } + } + } + .configuration() + + // Newer MC handle mixins from (neoforge.)mods.toml file + if (projectPlugin.isLegacy) { + project.the() + .apply { + add(sourceSets.main.get(), "cobblegen.mixins.refmap.json") + config("cobblegen.mixins.json") + } + } +} + +if (projectPlugin.isLegacy) projectPlugin.configure { + version = lexForge.version(mcVersion) +} else projectPlugin.configure { + version = NEO.version(mcVersion) +} + + +fun DependencyHandlerScope.dep(configuration: String, dependency: String) { + add( + configuration.let { + if (projectPlugin.isLegacy) { + it + } else { + it.replace("mod", "").replaceFirstChar { c -> c.lowercase(Locale.getDefault()) } + } + }, + dependency, + ) +} + +dependencies { + if (projectPlugin.isLegacy) { + // needed for legacy forge, for mapping stuff + annotationProcessor("org.spongepowered:mixin:0.8.7:processor") + } + + // Bunch of dummy classes, just so that the mod compiles + compileOnly(project(":stubs")) + + if (mcVersion.code > 11605) { + // FIXME: RuntimeOnly + // We just want their source code so we can mixin it + // modCompileOnly(createMod(isNeo).versioned(0)) { isTransitive = false } + + // <- EMI + if (mcVersion.code <= 11802) { + dep("modCompileOnly", emi(mcVersion, null, api = true).versioned(CGVer.wildcard())) + if (project.properties["recipe_viewer"] == "emi") + dep("modLocalRuntime", emi(mcVersion).versioned(CGVer.wildcard())) + } else { + if (mcVersion.code <= 12105) { + dep("modCompileOnly", emi(mcVersion, loaderName, api = true).versioned(CGVer.wildcard())) + if (project.properties["recipe_viewer"] == "emi") + dep("modLocalRuntime", emi(mcVersion, loaderName).versioned(CGVer.wildcard())) + } + } + // EMI -> + + // <- REI + // Use the full package instead of 'api-' for (neo)forge, since the 'api-' didn't include @REIPlugin* + dep("modCompileOnly", rei(loaderName, true).versioned(mcVersion)) + if (mcVersion.code in 11802..12001) { // FIXME: Not sure why it's not included + dep("modCompileOnly", "me.shedaniel.cloth:basic-math:0.6.1") + dep("modCompileOnly", "dev.architectury:architectury:11.1.13") + } + if (project.properties["recipe_viewer"] == "rei") { + if (mcVersion.code == 11902) // REI's stupid dep bug + dep("modLocalRuntime", "dev.architectury:architectury-fabric:6.5.77") + dep("modLocalRuntime", rei(loaderName).versioned(mcVersion)) + } + // REI -> + + // <- JEI + dep("modCompileOnly", jei(mcVersion, loaderName, common = true, api = true).versioned(CGVer.wildcard())) + dep("modCompileOnly", jei(mcVersion, loaderName, common = false, api = true).versioned(CGVer.wildcard())) + if (project.properties["recipe_viewer"] == "jei") + dep("modLocalRuntime", jei(mcVersion, loaderName, common = false, api = false).versioned(CGVer.wildcard())) + // JEI -> + + /* FIXME: Broken, somehow + if (mcVersion == 11802 && isFabric) { + modLocalRuntime("com.tterrag.registrate_fabric:Registrate:MC1.18.2-1.1.7") + modLocalRuntime("io.github.fabricators_of_create:Porting-Lib:${project.port_lib_version_1_18_2}") + modLocalRuntime("com.simibubi.create:create-fabric-${project.minecraft_version_1_18_2}:${project.create_version_1_18_2}") + } + */ + } +} + +tasks.jar { + manifest.attributes(mapOf( + "Contains-Sources" to "java,class", + "MixinConfigs" to "cobblegen.mixins.json", + )) +} + +if (projectPlugin.isLegacy) project.the().apply { + tasks.jar { + finalizedBy(tasks.named("reobfJar")) + } + reobfuscate(tasks.named("shadowJar"), sourceSets.main.get()) +} else { + tasks.jar { + archiveClassifier = "dev" + } + + val productionJar by tasks.register("productionJar") { + dependsOn(tasks.jar) + archiveClassifier = "" + archiveExtension = "jar" + destinationDirectory = layout.buildDirectory.dir("libs") + from(zipTree(tasks.shadowJar.flatMap { it.archiveFile })) + if (!projectPlugin.isLoom()) from(tasks.named("jarJar")) + } + + tasks.assemble { + dependsOn(productionJar) + } +} + +//val deleteResources by tasks.creating(Delete::class) { +// delete(file("build/resources/main")) +//} + +//tasks.processResources { +// dependsOn(tasks.named("copyCommonLoaderResources")) +//} + +//tasks.getting(RunGameTask::class) { +// dependsOn(tasks.named("copyCommonLoaderResources")) +// finalizedBy(deleteResources) +//} + +//tasks.sourcesJar { +// val commonSources = project(":common").tasks.sourcesJar.get() +// dependsOn(commonSources) +// from(commonSources.archiveFile.map { zipTree(it) }) +//} diff --git a/forge/src/main/java/io/github/null2264/cobblegen/forge/CobbleGenForge.java b/forge/src/main/java/io/github/null2264/cobblegen/forge/CobbleGenForge.java new file mode 100644 index 00000000..aa7bf6f4 --- /dev/null +++ b/forge/src/main/java/io/github/null2264/cobblegen/forge/CobbleGenForge.java @@ -0,0 +1,21 @@ +package io.github.null2264.cobblegen.fabric; + +import io.github.null2264.cobblegen.CobbleGen; + +import static io.github.null2264.cobblegen.CobbleGen.MOD_ID; + +#if MC>=12002 +@net.neoforged.fml.common.Mod(MOD_ID) +#else +@net.minecraftforge.fml.common.Mod(MOD_ID) +#endif +public class CobbleGenForge extends CobbleGen { + + public CobbleGenForge() { + super.init(); + #if MC>=11801 && MC<12105 + // I was gonna do RegisterGameTestsEvent like a normal person, but there's a check that I need to bypass otherwise Forge won't register my test + net.minecraft.gametest.framework.GameTestRegistry.register(io.github.null2264.cobblegen.gametest.BlockGenerationTest.class); + #endif + } +} diff --git a/forge/src/main/java/io/github/null2264/cobblegen/forge/compat/LoaderCompatForge.java b/forge/src/main/java/io/github/null2264/cobblegen/forge/compat/LoaderCompatForge.java new file mode 100644 index 00000000..1cf39594 --- /dev/null +++ b/forge/src/main/java/io/github/null2264/cobblegen/forge/compat/LoaderCompatForge.java @@ -0,0 +1,50 @@ +package io.github.null2264.cobblegen.forge.compat; + +import io.github.null2264.cobblegen.compat.LoaderCompat; +import io.github.null2264.cobblegen.compat.ModContainerCompat; + +import java.nio.file.Path; + +#if MC>=12002 +import net.neoforged.fml.loading.FMLPaths; +import net.neoforged.fml.ModList; +import net.neoforged.fml.loading.LoadingModList; +#else +import net.minecraftforge.fml.loading.FMLPaths; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.loading.LoadingModList; +#endif + +public class LoaderCompatForge extends LoaderCompat { + + @Override + public boolean isModLoaded(String mod) { + ModList modlist = ModList.get(); + if (modlist == null) // mainly for MixinConfigPlugin + return LoadingModList.get().getModFileById(mod) != null; + return modlist.isLoaded(mod); + } + + @Override + public Path getConfigDir() { + return FMLPaths.CONFIGDIR.get(); + } + + @Override + public LoaderType getType() { + #if MC>=12002 + return LoaderType.NEOFORGE; + #else + return LoaderType.FORGE; + #endif + } + + @Override + public ModContainerCompat getMod(String modId) { + if (isModCached(modId)) return super.getMod(modId); + + ModContainerCompat rt = new ModContainerForge(modId); + CACHED_CONTAINER.put(modId, rt); + return rt; + } +} diff --git a/forge/src/main/java/io/github/null2264/cobblegen/forge/compat/ModContainerForge.java b/forge/src/main/java/io/github/null2264/cobblegen/forge/compat/ModContainerForge.java new file mode 100644 index 00000000..875ff223 --- /dev/null +++ b/forge/src/main/java/io/github/null2264/cobblegen/forge/compat/ModContainerForge.java @@ -0,0 +1,59 @@ +package io.github.null2264.cobblegen.forge.compat; + +import io.github.null2264.cobblegen.compat.ModContainerCompat; + +#if MC>=12002 +import net.neoforged.fml.ModList; +#if MC>=12111 +import net.neoforged.fml.loading.FMLLoader; +#endif +import net.neoforged.fml.loading.LoadingModList; +import net.neoforged.neoforgespi.language.IModInfo; +#else +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.loading.LoadingModList; +import net.minecraftforge.forgespi.language.IModInfo; +#endif + +public class ModContainerForge extends ModContainerCompat { + + private final IModInfo container; + + public ModContainerForge(String modId) { + IModInfo modInfo; + if (ModList.get() == null) { // mainly for MixinConfigPlugin + LoadingModList modList = + #if MC>=12111 + FMLLoader.getCurrent().getLoadingModList(); + #else + LoadingModList.get(); + #endif + // I hate this... but should be fine since it happened on loading state + this.container = modList + .getModFileById(modId) + .getMods() + .stream() + .filter(i -> i.getModId().equals(modId)) + .findFirst() + #if MC<=11605 + .orElseThrow(NullPointerException::new); + #else + .orElseThrow(); + #endif + } else { + this.container = ModList.get() + .getModContainerById(modId) + #if MC<=11605 + .orElseThrow(NullPointerException::new) + #else + .orElseThrow() + #endif + .getModInfo(); + } + } + + @Override + public String getVersionString() { + return container.getVersion().toString(); + } +} diff --git a/forge/src/main/java/io/github/null2264/cobblegen/forge/mixin/core/CobbleGenMixinPluginForge.java b/forge/src/main/java/io/github/null2264/cobblegen/forge/mixin/core/CobbleGenMixinPluginForge.java new file mode 100644 index 00000000..7f0a4f0e --- /dev/null +++ b/forge/src/main/java/io/github/null2264/cobblegen/forge/mixin/core/CobbleGenMixinPluginForge.java @@ -0,0 +1,17 @@ +package io.github.null2264.cobblegen.forge.mixin.core; + +import io.github.null2264.cobblegen.compat.LoaderCompat; +import io.github.null2264.cobblegen.forge.compat.LoaderCompatForge; +import io.github.null2264.cobblegen.forge.util.PluginFinderForge; +import io.github.null2264.cobblegen.mixin.core.CobbleGenMixinPlugin; +import io.github.null2264.cobblegen.util.PluginFinder; + +public class CobbleGenMixinPluginForge extends CobbleGenMixinPlugin { + + @Override + public void onLoad(String mixinPackage) { + LoaderCompat.init(new LoaderCompatForge()); + PluginFinder.init(new PluginFinderForge()); + super.onLoad(mixinPackage); + } +} diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/create/CreateFluidReactionsMixin$PatchE.java b/forge/src/main/java/io/github/null2264/cobblegen/forge/mixin/create/CreateFluidReactionsMixin$PatchE.java similarity index 87% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/create/CreateFluidReactionsMixin$PatchE.java rename to forge/src/main/java/io/github/null2264/cobblegen/forge/mixin/create/CreateFluidReactionsMixin$PatchE.java index 745d57e9..f850f0ab 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/create/CreateFluidReactionsMixin$PatchE.java +++ b/forge/src/main/java/io/github/null2264/cobblegen/forge/mixin/create/CreateFluidReactionsMixin$PatchE.java @@ -1,15 +1,5 @@ #if MC>11605 -package io.github.null2264.cobblegen.mixin.create; - -#if FABRIC -import io.github.fabricators_of_create.porting_lib.util.FluidStack; -#else - #if FORGE>=2 && MC>=12002 -import net.neoforged.neoforge.fluids.FluidStack; - #else -import net.minecraftforge.fluids.FluidStack; - #endif -#endif +package io.github.null2264.cobblegen.forge.mixin.create; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; @@ -21,6 +11,12 @@ import static io.github.null2264.cobblegen.CobbleGen.FLUID_INTERACTION; +#if MC>=12002 +import net.neoforged.neoforge.fluids.FluidStack; +#else +import net.minecraftforge.fluids.FluidStack; +#endif + /** * Mixin for Create Fabric (pre) Patch F */ diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/loader/neoforge/NetworkRegistryMixin.java b/forge/src/main/java/io/github/null2264/cobblegen/forge/mixin/network/loader/neoforge/NetworkRegistryMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/loader/neoforge/NetworkRegistryMixin.java rename to forge/src/main/java/io/github/null2264/cobblegen/forge/mixin/network/loader/neoforge/NetworkRegistryMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/util/PluginFinder.java b/forge/src/main/java/io/github/null2264/cobblegen/forge/util/PluginFinderForge.java similarity index 62% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/util/PluginFinder.java rename to forge/src/main/java/io/github/null2264/cobblegen/forge/util/PluginFinderForge.java index 205e3114..b982b4dd 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/util/PluginFinder.java +++ b/forge/src/main/java/io/github/null2264/cobblegen/forge/util/PluginFinderForge.java @@ -1,45 +1,35 @@ -package io.github.null2264.cobblegen.util; +package io.github.null2264.cobblegen.forge.util; +import io.github.null2264.cobblegen.CGPlugin; import io.github.null2264.cobblegen.CobbleGenPlugin; -import org.jetbrains.annotations.ApiStatus; +import io.github.null2264.cobblegen.util.CGLog; +import io.github.null2264.cobblegen.util.PluginFinder; +import java.lang.reflect.Constructor; +import org.objectweb.asm.Type; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; import static io.github.null2264.cobblegen.compat.CollectionCompat.streamToList; -#if FABRIC -import net.fabricmc.loader.api.FabricLoader; -#else -import java.lang.reflect.Constructor; -import io.github.null2264.cobblegen.CGPlugin; - #if FORGE>=2 && MC>=12002 +#if MC>=12002 import net.neoforged.fml.ModList; import net.neoforged.neoforgespi.language.IModInfo; import net.neoforged.neoforgespi.language.ModFileScanData; - #else +#else import net.minecraftforge.fml.ModList; import net.minecraftforge.forgespi.language.IModInfo; import net.minecraftforge.forgespi.language.ModFileScanData; - #endif -import org.objectweb.asm.Type; #endif -public class PluginFinder -{ - public static List getModPlugins() { - #if FABRIC - return streamToList( - FabricLoader.getInstance() - .getEntrypointContainers("cobblegen_plugin", CobbleGenPlugin.class) - .stream() - .map(entrypoint -> new PlugInContainer(entrypoint.getProvider().getMetadata().getId(), entrypoint.getEntrypoint())) - ); - #else +public class PluginFinderForge extends PluginFinder { + + @Override + public List getModPlugins() { return AnnotatedFinder.getInstances(CGPlugin.class, CobbleGenPlugin.class); - #endif } - #if FORGE static class AnnotatedFinder { public static List getInstances(Class annotationClass, Class instanceClass) { Type annotationType = Type.getType(annotationClass); @@ -47,27 +37,26 @@ public static List getInstances(Class annotationClass, C List instances = new ArrayList<>(); for (ModFileScanData data : allScanData) { List modIds = streamToList( - data.getIModInfoData().stream() - .flatMap(info -> info.getMods().stream()) - .map(IModInfo::getModId) + data.getIModInfoData().stream() + .flatMap(info -> info.getMods().stream()) + .map(IModInfo::getModId) ); String modId = "[" + String.join(", ", modIds) + "]"; - + Iterable annotations = data.getAnnotations(); for (ModFileScanData.AnnotationData a : annotations) { - if (!(Objects.equals( #if MC>11605 - a.annotationType(), + a.annotationType(), #else a.getAnnotationType(), #endif - annotationType))) + annotationType))) continue; String className = #if MC>11605 - a.memberName(); + a.memberName(); #else a.getMemberName(); #endif @@ -85,24 +74,4 @@ public static List getInstances(Class annotationClass, C return instances; } } - #endif - - @ApiStatus.Internal - public static class PlugInContainer { - final String modId; - final CobbleGenPlugin plugin; - - public PlugInContainer(String modId, CobbleGenPlugin plugin) { - this.modId = modId; - this.plugin = plugin; - } - - public String getModId() { - return modId; - } - - public CobbleGenPlugin getPlugin() { - return plugin; - } - } } diff --git a/forge/src/main/resources/META-INF/accesstransformer.cfg b/forge/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 00000000..ac883772 --- /dev/null +++ b/forge/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,5 @@ +public net.minecraft.resources.RegistryDataLoader$Loader +public net.minecraft.resources.RegistryDataLoader$Loader (Lnet/minecraft/resources/RegistryDataLoader$RegistryData;Lnet/minecraft/core/WritableRegistry;Ljava/util/Map;)V + +public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager$Source +public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager$Source (Ljava/util/function/Function;Ljava/util/function/Supplier;)V diff --git a/cobblegen/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml similarity index 95% rename from cobblegen/src/main/resources/META-INF/mods.toml rename to forge/src/main/resources/META-INF/mods.toml index f33e4346..cf7b42f0 100644 --- a/cobblegen/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -15,6 +15,9 @@ description = "An MC mod that allows you to customize cobblestone (stone and bas [[mixins]] config = "cobblegen.mixins.json" +[[mixins]] +config = "cobblegen.forge.mixins.json" + [[dependencies.cobblegen]] modId = "${forge}" mandatory = true diff --git a/cobblegen/src/main/resources/META-INF/neoforge.mods.toml b/forge/src/main/resources/META-INF/neoforge.mods.toml similarity index 94% rename from cobblegen/src/main/resources/META-INF/neoforge.mods.toml rename to forge/src/main/resources/META-INF/neoforge.mods.toml index fdf9010d..2dca24ac 100644 --- a/cobblegen/src/main/resources/META-INF/neoforge.mods.toml +++ b/forge/src/main/resources/META-INF/neoforge.mods.toml @@ -15,6 +15,9 @@ description = "An MC mod that allows you to customize cobblestone (stone and bas [[mixins]] config = "cobblegen.mixins.json" +[[mixins]] +config = "cobblegen.forge.mixins.json" + [[dependencies.cobblegen]] modId = "neoforge" mandatory = true diff --git a/forge/src/main/resources/cobblegen.forge.mixins.json b/forge/src/main/resources/cobblegen.forge.mixins.json new file mode 100644 index 00000000..36533336 --- /dev/null +++ b/forge/src/main/resources/cobblegen.forge.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.null2264.cobblegen.fabric.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + // Will be added by build script (build.gradle.kts) + ], + "client": [ + // Will be added by build script (build.gradle.kts) + ], + "server": [ + // Will be added by build script (build.gradle.kts) + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/cobblegen/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta similarity index 100% rename from cobblegen/src/main/resources/pack.mcmeta rename to forge/src/main/resources/pack.mcmeta diff --git a/gradle.properties b/gradle.properties index 50f1e726..0dea1d93 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.jvmargs=-Xmx6G +org.gradle.jvmargs=-Xmx8G # Mod Properties version_stage=BETA @@ -19,7 +19,7 @@ recipe_viewer=none # Dependencies jankson_version=1.2.3 -manifold_version=2025.1.28 +manifold_version=2025.1.31 # Version Specific Dependencies create_version_1_18_2=0.5.1-f-build.1333+mc1.18.2 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f..f8e1ee31 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0ceb5e90..23449a2b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1 +1,7 @@ -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index f5feea6d..adff685a 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -173,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -206,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a218..e509b2dd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,94 +1,93 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/mclib/README.md b/mclib/README.md deleted file mode 100644 index f8718ef7..00000000 --- a/mclib/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# MCLib (`:mclib`) - -Library containing MC related stuff such as helper functions and extension methods diff --git a/mclib/build.gradle.kts b/mclib/build.gradle.kts deleted file mode 100644 index b464b761..00000000 --- a/mclib/build.gradle.kts +++ /dev/null @@ -1,24 +0,0 @@ -dependencies { - // Mostly for Mixin and Arch's dependant on Fabric's @Environment annotations - modCompileOnly("net.fabricmc:fabric-loader:0.17.2") -} - -publishing { - publications { - create("mavenCommon") { - artifactId = "MCLib" - from(components["java"]) - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - } -} - -tasks.jar { - manifest { - attributes["Contains-Sources"] = "java,class" - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index e052f1c9..df302d7d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,6 +2,7 @@ pluginManagement { repositories { maven("https://maven.fabricmc.net/") maven("https://maven.aap.my.id/") // For early access to "unstable" features + maven("https://maven.shedaniel.me/") maven("https://maven.architectury.dev/") maven("https://jitpack.io/") maven("https://files.minecraftforge.net/maven/") @@ -10,22 +11,33 @@ pluginManagement { maven("https://repo.spongepowered.org/maven/") gradlePluginPortal() } + val mcVer: String by settings + val (major, minor, patch) = mcVer + .split(".") + .toMutableList() + .apply { while (this.size < 3) this.add("") } + val mcVersion: Int = "${major}${minor.padStart(2, '0')}${patch.padStart(2, '0')}".toInt() + resolutionStrategy { eachPlugin { if (requested.id.id == "org.spongepowered.gradle.vanilla") { - // REF: https://repo.spongepowered.org/#browse/browse:maven-public:org%2Fspongepowered%2Fvanillagradle%2F0.2.1-SNAPSHOT - useModule("org.spongepowered:vanillagradle:0.2.1-20240507.024226-82") + val targetModule = when (mcVersion) { + in 11605..12111 -> "org.spongepowered:vanillagradle:0.2.2-SNAPSHOT" + else -> "org.spongepowered:vanillagradle:0.3.0-SNAPSHOT" + } + useModule(targetModule) } } } plugins { - id("com.gradleup.shadow") version "8.3.5" + id("com.gradleup.shadow") version "9.3.1" id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } } rootProject.name = "CobbleGen" -include(":mclib") include(":stubs") -include(":cobblegen") // TODO: Maybe split? +include(":xplat") +include(":fabric") +include(":forge") diff --git a/stubs/build.gradle.kts b/stubs/build.gradle.kts index 78857248..00dcc475 100644 --- a/stubs/build.gradle.kts +++ b/stubs/build.gradle.kts @@ -1,10 +1,12 @@ +import dependencies.minecraft as MC + plugins { - id("org.spongepowered.gradle.vanilla") version "0.2.1-SNAPSHOT" + id("org.spongepowered.gradle.vanilla") } minecraft { //accessWideners(project(":mclib").file("")) - version(project.ext["mcVersionStr"] as String) + version(MC.version(project.ext["mcVersion"] as CGVer)) } repositories { diff --git a/versions.json b/versions.json index 19316cd2..207a4bec 100644 --- a/versions.json +++ b/versions.json @@ -1,37 +1,40 @@ { "include": [ - { "mc": "1.16.5", "loader": "fabric", "java": "8", "testVersions": ["1.16.5"] }, - { "mc": "1.16.5", "loader": "forge", "java": "8", "testVersions": ["1.16.5"] }, + { "mc": "1.16.5", "loader": "fabric", "java": "8", "gradleGameTest": false, "testVersions": ["1.16.5"] }, + { "mc": "1.16.5", "loader": "forge", "java": "8", "gradleGameTest": false, "testVersions": ["1.16.5"] }, - { "mc": "1.18.2", "loader": "fabric", "java": "17", "testVersions": ["1.18.2"] }, - { "mc": "1.18.2", "loader": "forge", "java": "17", "testVersions": ["1.18.2"] }, + { "mc": "1.18.2", "loader": "fabric", "java": "17", "gradleGameTest": true, "testVersions": ["1.18.2"] }, + { "mc": "1.18.2", "loader": "forge", "java": "17", "gradleGameTest": false, "testVersions": ["1.18.2"] }, - { "mc": "1.19.2", "loader": "fabric", "java": "17", "testVersions": ["1.19", "1.19.1", "1.19.2"] }, - { "mc": "1.19.2", "loader": "forge", "java": "17", "testVersions": ["1.19", "1.19.1", "1.19.2"] }, + { "mc": "1.19.2", "loader": "fabric", "java": "17", "gradleGameTest": true, "testVersions": ["1.19", "1.19.1", "1.19.2"] }, + { "mc": "1.19.2", "loader": "forge", "java": "17", "gradleGameTest": false, "testVersions": ["1.19", "1.19.1", "1.19.2"] }, - { "mc": "1.19.4", "loader": "fabric", "java": "17", "testVersions": ["1.19.3", "1.19.4"] }, - { "mc": "1.19.4", "loader": "forge", "java": "17", "testVersions": ["1.19.3", "1.19.4"] }, + { "mc": "1.19.4", "loader": "fabric", "java": "17", "gradleGameTest": true, "testVersions": ["1.19.3", "1.19.4"] }, + { "mc": "1.19.4", "loader": "forge", "java": "17", "gradleGameTest": false, "testVersions": ["1.19.3", "1.19.4"] }, - { "mc": "1.20.1", "loader": "fabric", "java": "17", "testVersions": ["1.20.1"] }, - { "mc": "1.20.1", "loader": "forge", "java": "17", "testVersions": ["1.20.1"] }, + { "mc": "1.20.1", "loader": "fabric", "java": "17", "gradleGameTest": true, "testVersions": ["1.20.1"] }, + { "mc": "1.20.1", "loader": "forge", "java": "17", "gradleGameTest": false, "testVersions": ["1.20.1"] }, - { "mc": "1.20.2", "loader": "fabric", "java": "17", "testVersions": ["1.20.2", "1.20.3", "1.20.4"] }, - { "mc": "1.20.2", "loader": "neoforge", "java": "17", "testVersions": ["1.20.2", "1.20.3"] }, - { "mc": "1.20.4", "loader": "neoforge", "java": "17", "testVersions": ["1.20.4"] }, + { "mc": "1.20.2", "loader": "fabric", "java": "17", "gradleGameTest": true, "testVersions": ["1.20.2", "1.20.3", "1.20.4"] }, + { "mc": "1.20.2", "loader": "neoforge", "java": "17", "gradleGameTest": true, "testVersions": ["1.20.2", "1.20.3"] }, + { "mc": "1.20.4", "loader": "neoforge", "java": "17", "gradleGameTest": true, "testVersions": ["1.20.4"] }, - { "mc": "1.20.6", "loader": "fabric", "java": "17", "testVersions": ["1.20.6"] }, - { "mc": "1.20.6", "loader": "neoforge", "java": "17", "testVersions": ["1.20.6"] }, + { "mc": "1.20.6", "loader": "fabric", "java": "17", "gradleGameTest": true, "testVersions": ["1.20.6"] }, + { "mc": "1.20.6", "loader": "neoforge", "java": "17", "gradleGameTest": true, "testVersions": ["1.20.6"] }, - { "mc": "1.21.1", "loader": "fabric", "java": "21", "testVersions": ["1.21", "1.21.1"] }, - { "mc": "1.21.1", "loader": "neoforge", "java": "21", "testVersions": ["1.21", "1.21.1"] }, + { "mc": "1.21.1", "loader": "fabric", "java": "21", "gradleGameTest": true, "testVersions": ["1.21", "1.21.1"] }, + { "mc": "1.21.1", "loader": "neoforge", "java": "21", "gradleGameTest": true, "testVersions": ["1.21", "1.21.1"] }, - { "mc": "1.21.3", "loader": "fabric", "java": "21", "testVersions": ["1.21.3", "1.21.4"] }, - { "mc": "1.21.3", "loader": "neoforge", "java": "21", "testVersions": ["1.21.3", "1.21.4"] }, + { "mc": "1.21.3", "loader": "fabric", "java": "21", "gradleGameTest": true, "testVersions": ["1.21.3", "1.21.4"] }, + { "mc": "1.21.3", "loader": "neoforge", "java": "21", "gradleGameTest": true, "testVersions": ["1.21.3", "1.21.4"] }, - { "mc": "1.21.5", "loader": "fabric", "java": "21", "testVersions": ["1.21.5", "1.21.6", "1.21.7", "1.21.8", "1.21.9", "1.21.10"] }, - { "mc": "1.21.5", "loader": "neoforge", "java": "21", "testVersions": ["1.21.5", "1.21.6", "1.21.7", "1.21.8", "1.21.9", "1.21.10"] }, + { "mc": "1.21.5", "loader": "fabric", "java": "21", "gradleGameTest": true, "testVersions": ["1.21.5", "1.21.6", "1.21.7", "1.21.8", "1.21.9", "1.21.10"] }, + { "mc": "1.21.5", "loader": "neoforge", "java": "21", "gradleGameTest": true, "testVersions": ["1.21.5", "1.21.6", "1.21.7", "1.21.8", "1.21.9", "1.21.10"] }, - { "mc": "1.21.11", "loader": "fabric", "java": "21", "testVersions": ["1.21.11"] }, - { "mc": "1.21.11", "loader": "neoforge", "java": "21", "testVersions": ["1.21.11"] } + { "mc": "1.21.11", "loader": "fabric", "java": "21", "gradleGameTest": true, "testVersions": ["1.21.11"] }, + { "mc": "1.21.11", "loader": "neoforge", "java": "21", "gradleGameTest": true, "testVersions": ["1.21.11"] }, + + { "mc": "26.1", "loader": "fabric", "java": "25", "gradleGameTest": true, "testVersions": ["26.1"] }, + { "mc": "26.1", "loader": "neoforge", "java": "25", "gradleGameTest": true, "testVersions": ["26.1"] } ] } diff --git a/xplat/README.md b/xplat/README.md new file mode 100644 index 00000000..02322085 --- /dev/null +++ b/xplat/README.md @@ -0,0 +1,4 @@ +# `:xplat` + +This module contains source code that can be shared across loader. This mod is designed to use only Vanilla features so +most of the work is done in this module. diff --git a/xplat/build.gradle.kts b/xplat/build.gradle.kts new file mode 100644 index 00000000..12573324 --- /dev/null +++ b/xplat/build.gradle.kts @@ -0,0 +1,67 @@ +import dependencies.jei +import dependencies.minecraft as MC + +plugins { + id("java-library") + id("org.spongepowered.gradle.vanilla") +} + +val mcVersion: CGVer by extra + +minecraft { + version(MC.version(mcVersion)) + if (mcVersion.code >= 12105) { + accessWideners(project.file("src/main/resources/cobblegen.accesswidener")) + } +} + +repositories { + maven("https://repo.spongepowered.org/maven/") +} + +configurations { + register("xplatJava") { + isCanBeResolved = false + isCanBeConsumed = true + } + register("xplatResources") { + isCanBeResolved = false + isCanBeConsumed = true + } +} + +dependencies { + compileOnly(project(":stubs")) + + compileOnly("org.spongepowered:mixin:0.8.5") + compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.5.3")!!) + compileOnly("org.ow2.asm:asm:9.9") + compileOnly("org.ow2.asm:asm-tree:9.9") + + compileOnly(jei(mcVersion, "", common = true, api = true).versioned(CGVer.wildcard())) +} + +artifacts { + add("xplatJava", sourceSets.main.get().java.sourceDirectories.singleFile) + add("xplatResources", sourceSets.main.get().resources.sourceDirectories.singleFile) +} + +publishing { + publications { + create("mavenCommon") { + artifactId = "MCLib" + from(components["java"]) + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } +} + +tasks.jar { + manifest.attributes(mapOf( + "Contains-Sources" to "java,class", + )) +} diff --git a/mclib/src/main/java/io/github/null2264/cobblegen/extensions/net/minecraft/network/FriendlyByteBuf/ByteBufExt.java b/xplat/src/main/java/cobblegen/extensions/net/minecraft/network/FriendlyByteBuf/ByteBufExt.java similarity index 97% rename from mclib/src/main/java/io/github/null2264/cobblegen/extensions/net/minecraft/network/FriendlyByteBuf/ByteBufExt.java rename to xplat/src/main/java/cobblegen/extensions/net/minecraft/network/FriendlyByteBuf/ByteBufExt.java index b4e28729..86291934 100644 --- a/mclib/src/main/java/io/github/null2264/cobblegen/extensions/net/minecraft/network/FriendlyByteBuf/ByteBufExt.java +++ b/xplat/src/main/java/cobblegen/extensions/net/minecraft/network/FriendlyByteBuf/ByteBufExt.java @@ -1,4 +1,4 @@ -package io.github.null2264.cobblegen.extensions.net.minecraft.network.FriendlyByteBuf; +package cobblegen.extensions.net.minecraft.network.FriendlyByteBuf; #if MC<=11605 import com.google.common.collect.Lists; diff --git a/mclib/src/main/java/io/github/null2264/cobblegen/extensions/net/minecraft/world/level/Level/LevelExt.java b/xplat/src/main/java/cobblegen/extensions/net/minecraft/world/level/Level/LevelExt.java similarity index 71% rename from mclib/src/main/java/io/github/null2264/cobblegen/extensions/net/minecraft/world/level/Level/LevelExt.java rename to xplat/src/main/java/cobblegen/extensions/net/minecraft/world/level/Level/LevelExt.java index 5dd43634..7f3cf1ee 100644 --- a/mclib/src/main/java/io/github/null2264/cobblegen/extensions/net/minecraft/world/level/Level/LevelExt.java +++ b/xplat/src/main/java/cobblegen/extensions/net/minecraft/world/level/Level/LevelExt.java @@ -1,10 +1,11 @@ -package io.github.null2264.cobblegen.extensions.net.minecraft.world.level.Level; +package cobblegen.extensions.net.minecraft.world.level.Level; -import manifold.ext.rt.api.Extension; +#if MC>12101 import manifold.ext.rt.api.This; import net.minecraft.world.level.Level; +#endif -@Extension +@manifold.ext.rt.api.Extension public final class LevelExt { #if MC>12101 public static int getMinBuildHeight(@This Level thiz) { diff --git a/mclib/src/main/java/io/github/null2264/cobblegen/extensions/net/minecraft/world/level/LevelAccessor/LevelAccessorExt.java b/xplat/src/main/java/cobblegen/extensions/net/minecraft/world/level/LevelAccessor/LevelAccessorExt.java similarity index 95% rename from mclib/src/main/java/io/github/null2264/cobblegen/extensions/net/minecraft/world/level/LevelAccessor/LevelAccessorExt.java rename to xplat/src/main/java/cobblegen/extensions/net/minecraft/world/level/LevelAccessor/LevelAccessorExt.java index c92606b5..02367c30 100644 --- a/mclib/src/main/java/io/github/null2264/cobblegen/extensions/net/minecraft/world/level/LevelAccessor/LevelAccessorExt.java +++ b/xplat/src/main/java/cobblegen/extensions/net/minecraft/world/level/LevelAccessor/LevelAccessorExt.java @@ -1,11 +1,12 @@ #if FORGE && MC<12002 -package io.github.null2264.cobblegen.extensions.net.minecraft.world.level.LevelAccessor; +package xplat.extensions.net.minecraft.world.level.LevelAccessor; import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.LevelAccessor; @manifold.ext.rt.api.Extension public final class LevelAccessorExt { + public static RegistryAccess registryAccessCompat(@manifold.ext.rt.api.This LevelAccessor thiz) { RegistryAccess access = null; // Pre-runtime-mojmap forge pain (which introduced on NeoForge around MC 1.20.2 and Forge around 1.20.6, be it partially) diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/CGPlugin.java b/xplat/src/main/java/io/github/null2264/cobblegen/CGPlugin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/CGPlugin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/CGPlugin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/CobbleGen.java b/xplat/src/main/java/io/github/null2264/cobblegen/CobbleGen.java similarity index 72% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/CobbleGen.java rename to xplat/src/main/java/io/github/null2264/cobblegen/CobbleGen.java index 4f07fa7f..70d44b84 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/CobbleGen.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/CobbleGen.java @@ -10,20 +10,8 @@ import net.minecraft.commands.CommandSourceStack; import org.jetbrains.annotations.ApiStatus; -import static io.github.null2264.cobblegen.util.Constants.OP_LEVEL_GAMEMASTERS; +public abstract class CobbleGen { -#if FORGE - #if FORGE==2 -@net.neoforged.fml.common.Mod(CobbleGen.MOD_ID) - #elif FORGE==1 -@net.minecraftforge.fml.common.Mod(CobbleGen.MOD_ID) - #endif -#endif -public class CobbleGen -#if FABRIC - implements net.fabricmc.api.ModInitializer -#endif -{ public static final String MOD_ID = "cobblegen"; /** * @deprecated Only for internal usage. Use the parameter {@link CGRegistry registry} instead to register new Fluid Interaction @@ -32,20 +20,13 @@ public class CobbleGen @ApiStatus.Internal public static final FluidInteraction FLUID_INTERACTION = new FluidInteraction(); - public CobbleGen() { - // Force config to be generated when loading up the game instead of having to load a world + /* + * Force config to be generated when loading up the game instead of having to load a world + */ + public void init() { new ConfigData.Factory().load(); - #if FORGE && MC>=11801 && MC<12105 - // I was gonna do RegisterGameTestsEvent like a normal person, but there's a check that I need to bypass otherwise Forge won't register my test - net.minecraft.gametest.framework.GameTestRegistry.register(io.github.null2264.cobblegen.gametest.BlockGenerationTest.class); - #endif } - #if FABRIC - @Override - public void onInitialize() {} - #endif - public static void initCommands(CommandDispatcher dispatcher) { CGLog.info("Registering command..."); dispatcher.register( @@ -54,7 +35,7 @@ public static void initCommands(CommandDispatcher dispatcher LiteralArgumentBuilder. literal("reload-meta") #if MC<12111 - .requires(arg -> arg.hasPermission(OP_LEVEL_GAMEMASTERS)) + .requires(arg -> arg.hasPermission(io.github.null2264.cobblegen.util.Constants.OP_LEVEL_GAMEMASTERS)) #else .requires(net.minecraft.commands.Commands.hasPermission(net.minecraft.commands.Commands.LEVEL_GAMEMASTERS)) #endif diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/CobbleGenPlugin.java b/xplat/src/main/java/io/github/null2264/cobblegen/CobbleGenPlugin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/CobbleGenPlugin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/CobbleGenPlugin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/FluidInteraction.java b/xplat/src/main/java/io/github/null2264/cobblegen/FluidInteraction.java similarity index 99% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/FluidInteraction.java rename to xplat/src/main/java/io/github/null2264/cobblegen/FluidInteraction.java index 0cecf1a5..6b052ac5 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/FluidInteraction.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/FluidInteraction.java @@ -101,7 +101,7 @@ public void apply() { count.set(0); CGRegistry registry = new CGRegistryImpl(); - for (PluginFinder.PlugInContainer container : PluginFinder.getModPlugins()) { + for (PluginFinder.PlugInContainer container : PluginFinder.getInstance().getModPlugins()) { String id = container.getModId(); CobbleGenPlugin plugin = container.getPlugin(); diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/compat/CollectionCompat.java b/xplat/src/main/java/io/github/null2264/cobblegen/compat/CollectionCompat.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/compat/CollectionCompat.java rename to xplat/src/main/java/io/github/null2264/cobblegen/compat/CollectionCompat.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/compat/GraphicsCompat.java b/xplat/src/main/java/io/github/null2264/cobblegen/compat/GraphicsCompat.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/compat/GraphicsCompat.java rename to xplat/src/main/java/io/github/null2264/cobblegen/compat/GraphicsCompat.java diff --git a/xplat/src/main/java/io/github/null2264/cobblegen/compat/LoaderCompat.java b/xplat/src/main/java/io/github/null2264/cobblegen/compat/LoaderCompat.java new file mode 100644 index 00000000..7423d8d5 --- /dev/null +++ b/xplat/src/main/java/io/github/null2264/cobblegen/compat/LoaderCompat.java @@ -0,0 +1,67 @@ +package io.github.null2264.cobblegen.compat; + +import java.nio.file.Path; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +public abstract class LoaderCompat { + + private static LoaderCompat INSTANCE; + public static ConcurrentMap CACHED_CONTAINER = new ConcurrentHashMap<>(); + + public static void init(LoaderCompat impl) { + if (INSTANCE != null) throw new IllegalStateException("Already initialized!"); + INSTANCE = impl; + } + + public static LoaderCompat getInstance() { + if (INSTANCE == null) throw new IllegalStateException("Not yet initialized!"); + return INSTANCE; + } + + public abstract boolean isModLoaded(String mod); + + public abstract Path getConfigDir(); + + public abstract LoaderType getType(); + + public boolean isModCached(String modId) { + return CACHED_CONTAINER.containsKey(modId); + } + + public ModContainerCompat getMod(String modId) { + return CACHED_CONTAINER.get(modId); + } + + public Boolean isFabric() { + return getType() == LoaderType.FABRIC; + } + + public Boolean isQuilt() { + return getType() == LoaderType.QUILT; + } + + public Boolean isFabricLike() { + return isFabric() || isQuilt(); + } + + public Boolean isForge() { + return getType() == LoaderType.FORGE; + } + + public Boolean isNeoForge() { + return getType() == LoaderType.NEOFORGE; + } + + public Boolean isForgeLike() { + return isForge() || isNeoForge(); + } + + @SuppressWarnings("unused") + public enum LoaderType { + FABRIC, + QUILT, + FORGE, + NEOFORGE + } +} diff --git a/xplat/src/main/java/io/github/null2264/cobblegen/compat/ModContainerCompat.java b/xplat/src/main/java/io/github/null2264/cobblegen/compat/ModContainerCompat.java new file mode 100644 index 00000000..cf2e806c --- /dev/null +++ b/xplat/src/main/java/io/github/null2264/cobblegen/compat/ModContainerCompat.java @@ -0,0 +1,8 @@ +package io.github.null2264.cobblegen.compat; + +public abstract class ModContainerCompat { + + protected ModContainerCompat() {} + + public abstract String getVersionString(); +} diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/compat/RegistryCompat.java b/xplat/src/main/java/io/github/null2264/cobblegen/compat/RegistryCompat.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/compat/RegistryCompat.java rename to xplat/src/main/java/io/github/null2264/cobblegen/compat/RegistryCompat.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/compat/TextCompat.java b/xplat/src/main/java/io/github/null2264/cobblegen/compat/TextCompat.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/compat/TextCompat.java rename to xplat/src/main/java/io/github/null2264/cobblegen/compat/TextCompat.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/CGIdentifier.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/CGIdentifier.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/CGIdentifier.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/CGIdentifier.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/CGModifier.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/CGModifier.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/CGModifier.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/CGModifier.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/CGRegistryImpl.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/CGRegistryImpl.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/CGRegistryImpl.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/CGRegistryImpl.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/JanksonSerializable.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/JanksonSerializable.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/JanksonSerializable.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/JanksonSerializable.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/Pair.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/Pair.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/Pair.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/Pair.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/AdvancedGen.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/AdvancedGen.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/AdvancedGen.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/config/AdvancedGen.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/Config.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/Config.java similarity index 92% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/Config.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/config/Config.java index 36c8fc13..7a32e2f0 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/Config.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/Config.java @@ -15,7 +15,7 @@ public interface Config { .registerDeserializer(String.class, CGIdentifier.class, (str, m) -> CGIdentifier.of(str)) .build(); - Path path = LoaderCompat.getConfigDir(); + Path path = LoaderCompat.getInstance().getConfigDir(); interface Factory { T load(); diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/ConfigData.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/ConfigData.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/ConfigData.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/config/ConfigData.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/ConfigHelper.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/ConfigHelper.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/ConfigHelper.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/config/ConfigHelper.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/ConfigMetaData.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/ConfigMetaData.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/ConfigMetaData.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/config/ConfigMetaData.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/CustomGen.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/CustomGen.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/CustomGen.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/config/CustomGen.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/FluidInteractionMap.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/FluidInteractionMap.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/FluidInteractionMap.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/config/FluidInteractionMap.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/GeneratorMap.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/GeneratorMap.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/GeneratorMap.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/config/GeneratorMap.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/ResultList.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/ResultList.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/ResultList.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/config/ResultList.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/WeightedBlock.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/config/WeightedBlock.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/config/WeightedBlock.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/config/WeightedBlock.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/generator/BasaltGenerator.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/generator/BasaltGenerator.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/generator/BasaltGenerator.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/generator/BasaltGenerator.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/generator/CobbleGenerator.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/generator/CobbleGenerator.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/generator/CobbleGenerator.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/generator/CobbleGenerator.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/generator/StoneGenerator.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/generator/StoneGenerator.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/generator/StoneGenerator.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/generator/StoneGenerator.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/model/BlockGenerator.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/model/BlockGenerator.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/model/BlockGenerator.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/model/BlockGenerator.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/model/BuiltInGenerator.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/model/BuiltInGenerator.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/model/BuiltInGenerator.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/model/BuiltInGenerator.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/model/CGRegistry.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/model/CGRegistry.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/model/CGRegistry.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/model/CGRegistry.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/model/Generator.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/model/Generator.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/model/Generator.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/model/Generator.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/data/model/PacketSerializable.java b/xplat/src/main/java/io/github/null2264/cobblegen/data/model/PacketSerializable.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/data/model/PacketSerializable.java rename to xplat/src/main/java/io/github/null2264/cobblegen/data/model/PacketSerializable.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/gametest/BlockGenerationTest.java b/xplat/src/main/java/io/github/null2264/cobblegen/gametest/BlockGenerationTest.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/gametest/BlockGenerationTest.java rename to xplat/src/main/java/io/github/null2264/cobblegen/gametest/BlockGenerationTest.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/gametest/CobbleGenTestLoader.java b/xplat/src/main/java/io/github/null2264/cobblegen/gametest/CobbleGenTestLoader.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/gametest/CobbleGenTestLoader.java rename to xplat/src/main/java/io/github/null2264/cobblegen/gametest/CobbleGenTestLoader.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/gametest/Constants.java b/xplat/src/main/java/io/github/null2264/cobblegen/gametest/Constants.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/gametest/Constants.java rename to xplat/src/main/java/io/github/null2264/cobblegen/gametest/Constants.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/BuiltInPlugin.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/BuiltInPlugin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/BuiltInPlugin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/BuiltInPlugin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/CreatePlugin.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/CreatePlugin.java similarity index 96% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/CreatePlugin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/CreatePlugin.java index 557705bc..317a2043 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/CreatePlugin.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/integration/CreatePlugin.java @@ -46,7 +46,7 @@ public void registerInteraction(CGRegistry registry) { @Override public boolean shouldLoad() { - if (!LoaderCompat.isModLoaded("create")) return false; + if (!LoaderCompat.getInstance().isModLoaded("create")) return false; CreateSupport createSupport = CreateCompatUtil.getCreateSupport(); return createSupport != CreateSupport.NONE; diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/create/CreateCompatUtil.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/create/CreateCompatUtil.java similarity index 95% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/create/CreateCompatUtil.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/create/CreateCompatUtil.java index 308e0fc8..59fa9366 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/create/CreateCompatUtil.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/integration/create/CreateCompatUtil.java @@ -1,6 +1,6 @@ package io.github.null2264.cobblegen.integration.create; -import io.github.null2264.cobblegen.compat.ModContainerCompat; +import io.github.null2264.cobblegen.compat.LoaderCompat; import io.github.null2264.cobblegen.data.config.ConfigMetaData; import io.github.null2264.cobblegen.util.CGLog; import org.jetbrains.annotations.ApiStatus; @@ -21,7 +21,7 @@ public static CreateSupport getCreateSupport() { return CreateSupport.NONE; // We don't support create integration for MC1.16.5 #else try { - String version = ModContainerCompat.fromLoader("create").getVersionString(); + String version = LoaderCompat.getInstance().getMod("create").getVersionString(); ArrayList split = new ArrayList<>(); String patch = "a"; // version = 0.5.1-a-build.69 diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/create/CreateSupport.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/create/CreateSupport.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/create/CreateSupport.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/create/CreateSupport.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/FluidInteractionRecipeHolder.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/FluidInteractionRecipeHolder.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/FluidInteractionRecipeHolder.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/FluidInteractionRecipeHolder.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/CGEMIPlugin.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/CGEMIPlugin.java similarity index 99% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/CGEMIPlugin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/CGEMIPlugin.java index 49a299c7..02bb4f68 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/CGEMIPlugin.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/CGEMIPlugin.java @@ -1,4 +1,5 @@ -#if (FABRIC && MC>11605 && MC<=11802) || (MC>=11900 && MC<12111) || MC>=22601 +#if (FABRIC && MC>11605 && MC<=11802) || (MC>=11900 && MC<12111) +// || MC>=22601 package io.github.null2264.cobblegen.integration.viewer.emi; // FIXME: Enable EMI integration for 1.21.11+ when EMI is updated // UPDATE: Looks like EMI won't be updated to 1.21.11 and probably skip to 26.1 diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/FluidInteractionRecipe.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/FluidInteractionRecipe.java similarity index 99% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/FluidInteractionRecipe.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/FluidInteractionRecipe.java index 2ded7549..6536541b 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/FluidInteractionRecipe.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/emi/FluidInteractionRecipe.java @@ -1,4 +1,5 @@ -#if (FABRIC && MC>11605 && MC<=11802) || (MC>=11900 && MC<12111) || MC>=22601 +#if (FABRIC && MC>11605 && MC<=11802) || (MC>=11900 && MC<12111) +// || MC>=22601 package io.github.null2264.cobblegen.integration.viewer.emi; // FIXME: Enable EMI integration for 1.21.11+ when EMI is updated // UPDATE: Looks like EMI won't be updated to 1.21.11 and probably skip to 26.1 diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/jei/CGJEIPlugin.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/jei/CGJEIPlugin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/jei/CGJEIPlugin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/jei/CGJEIPlugin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/jei/FluidInteractionCategory.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/jei/FluidInteractionCategory.java similarity index 95% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/jei/FluidInteractionCategory.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/jei/FluidInteractionCategory.java index be31526e..eb696678 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/jei/FluidInteractionCategory.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/jei/FluidInteractionCategory.java @@ -209,9 +209,23 @@ public void draw( Minecraft minecraft = Minecraft.getInstance(); Font font = minecraft.font; var minY = recipe.getResult().minY; - if (minY == null) minY = minecraft.level != null ? minecraft.level.getMinBuildHeight() : 0; + if (minY == null) minY = + minecraft.level != null ? + #if MC>12101 + minecraft.level.getMinY() : + #else + minecraft.level.getMinBuildHeight() : + #endif + 0; var maxY = recipe.getResult().maxY; - if (maxY == null) maxY = minecraft.level != null ? minecraft.level.getMaxBuildHeight() : 256; + if (maxY == null) maxY = + minecraft.level != null ? + #if MC>12101 + minecraft.level.getMaxY() : + #else + minecraft.level.getMaxBuildHeight() : + #endif + 256; List texts = List.of( TextCompat.translatable("cobblegen.info.weight") .append(Component.nullToEmpty(recipe.getResult().weight.toString())), diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/CGREIPlugin.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/CGREIPlugin.java similarity index 98% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/CGREIPlugin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/CGREIPlugin.java index 498db1ae..7719a098 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/CGREIPlugin.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/CGREIPlugin.java @@ -1,4 +1,5 @@ -#if MC>11605 && MC<12111 +#if (MC>11605 && MC<12111) +//|| MC>=260100 package io.github.null2264.cobblegen.integration.viewer.rei; // FIXME: Enable REI integration for 1.21.11 when REI is updated // REF: https://github.com/shedaniel/RoughlyEnoughItems/pull/1989 diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionCategory.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionCategory.java similarity index 99% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionCategory.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionCategory.java index a909d824..e8fb2737 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionCategory.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionCategory.java @@ -1,4 +1,5 @@ -#if MC>11605 && MC<12111 +#if (MC>11605 && MC<12111) +//|| MC>=260100 package io.github.null2264.cobblegen.integration.viewer.rei; // FIXME: Enable REI integration for 1.21.11 when REI is updated // REF: https://github.com/shedaniel/RoughlyEnoughItems/pull/1989 diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionRecipe.java b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionRecipe.java similarity index 98% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionRecipe.java rename to xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionRecipe.java index 3f7d3cd5..d1540a2a 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionRecipe.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/integration/viewer/rei/FluidInteractionRecipe.java @@ -1,4 +1,5 @@ -#if MC>11605 && MC<12111 +#if (MC>11605 && MC<12111) +//|| MC>=260100 package io.github.null2264.cobblegen.integration.viewer.rei; // FIXME: Enable REI integration for 1.21.11 when REI is updated // REF: https://github.com/shedaniel/RoughlyEnoughItems/pull/1989 diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mc/Constants.java b/xplat/src/main/java/io/github/null2264/cobblegen/mc/Constants.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mc/Constants.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mc/Constants.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/CommandsMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/CommandsMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/CommandsMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/CommandsMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/MinecraftServerMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/MinecraftServerMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/MinecraftServerMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/MinecraftServerMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/core/CobbleGenMixinPlugin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/core/CobbleGenMixinPlugin.java similarity index 86% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/core/CobbleGenMixinPlugin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/core/CobbleGenMixinPlugin.java index fb77907f..99d2df38 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/core/CobbleGenMixinPlugin.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/core/CobbleGenMixinPlugin.java @@ -14,12 +14,14 @@ import java.util.Set; import java.util.regex.PatternSyntaxException; -public class CobbleGenMixinPlugin implements IMixinConfigPlugin { +public abstract class CobbleGenMixinPlugin implements IMixinConfigPlugin { + /** + * This function is called even earlier than Fabric's PreLaunch.onPreLaunch + */ @Override public void onLoad(String mixinPackage) { - #if FORGE && MC>=12105 - // This is the earliest entrypoint for Forge that I know of... + #if MC>=12105 io.github.null2264.cobblegen.gametest.CobbleGenTestLoader.init(); #endif } @@ -32,7 +34,7 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { if (mixinClassName.contains("CreateFluidReactionsMixin")) { - if (!LoaderCompat.isModLoaded("create")) return false; + if (!LoaderCompat.getInstance().isModLoaded("create")) return false; CreateSupport createSupport = CreateCompatUtil.getCreateSupport(); if (createSupport == CreateSupport.NONE) return false; @@ -47,7 +49,7 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { // Datapack will not register automatically in Fabric without FAPI. // I usually prefer not depending on FAPI, but I'll make this one an exception... // because I ain't dealing with Resource Pack loading ever again - if (LoaderCompat.isFabricLike() && !LoaderCompat.isModLoaded("fabric-resource-loader-v0")) { + if (LoaderCompat.getInstance().isFabricLike() && !LoaderCompat.getInstance().isModLoaded("fabric-resource-loader-v0")) { CGLog.warn(() -> "Fabric API is required to load CobbleGen's GameTests!"); return false; } diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/create/CreateFluidReactionsMixin$OFive.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/create/CreateFluidReactionsMixin$OFive.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/create/CreateFluidReactionsMixin$OFive.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/create/CreateFluidReactionsMixin$OFive.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/fluid/FlowingFluidEventMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/fluid/FlowingFluidEventMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/fluid/FlowingFluidEventMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/fluid/FlowingFluidEventMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/fluid/FluidEventMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/fluid/FluidEventMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/fluid/FluidEventMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/fluid/FluidEventMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/fluid/LavaEventMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/fluid/LavaEventMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/fluid/LavaEventMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/fluid/LavaEventMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/gametest/RegistryDataLoaderMixin$GameTest.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/gametest/RegistryDataLoaderMixin$GameTest.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/gametest/RegistryDataLoaderMixin$GameTest.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/gametest/RegistryDataLoaderMixin$GameTest.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/gametest/StructureTemplateManagerMixin$GameTest.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/gametest/StructureTemplateManagerMixin$GameTest.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/gametest/StructureTemplateManagerMixin$GameTest.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/gametest/StructureTemplateManagerMixin$GameTest.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/ClientCommonPacketListenerMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/ClientCommonPacketListenerMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/ClientCommonPacketListenerMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/ClientCommonPacketListenerMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/ConnectionMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/ConnectionMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/ConnectionMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/ConnectionMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/PlayerManagerMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/PlayerManagerMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/PlayerManagerMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/PlayerManagerMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerCommonPacketListenerMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerCommonPacketListenerMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerCommonPacketListenerMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerCommonPacketListenerMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerConfigurationPacketListenerMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerConfigurationPacketListenerMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerConfigurationPacketListenerMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerConfigurationPacketListenerMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerboundCustomPayloadPacketAccessor.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerboundCustomPayloadPacketAccessor.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerboundCustomPayloadPacketAccessor.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/ServerboundCustomPayloadPacketAccessor.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/ClientboundCustomPayloadPacketMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/ClientboundCustomPayloadPacketMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/ClientboundCustomPayloadPacketMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/ClientboundCustomPayloadPacketMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/CustomPacketPayloadMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/CustomPacketPayloadMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/CustomPacketPayloadMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/CustomPacketPayloadMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/ServerboundCustomPayloadPacketMixin.java b/xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/ServerboundCustomPayloadPacketMixin.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/ServerboundCustomPayloadPacketMixin.java rename to xplat/src/main/java/io/github/null2264/cobblegen/mixin/network/packet/ServerboundCustomPayloadPacketMixin.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/network/CGClientPlayNetworkHandler.java b/xplat/src/main/java/io/github/null2264/cobblegen/network/CGClientPlayNetworkHandler.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/network/CGClientPlayNetworkHandler.java rename to xplat/src/main/java/io/github/null2264/cobblegen/network/CGClientPlayNetworkHandler.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/network/CGServerPlayNetworkHandler.java b/xplat/src/main/java/io/github/null2264/cobblegen/network/CGServerPlayNetworkHandler.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/network/CGServerPlayNetworkHandler.java rename to xplat/src/main/java/io/github/null2264/cobblegen/network/CGServerPlayNetworkHandler.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/network/README.md b/xplat/src/main/java/io/github/null2264/cobblegen/network/README.md similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/network/README.md rename to xplat/src/main/java/io/github/null2264/cobblegen/network/README.md diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGPacketPayload.java b/xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGPacketPayload.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGPacketPayload.java rename to xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGPacketPayload.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGPayloadReader.java b/xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGPayloadReader.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGPayloadReader.java rename to xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGPayloadReader.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGPingC2SPayload.java b/xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGPingC2SPayload.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGPingC2SPayload.java rename to xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGPingC2SPayload.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGPingS2CPayload.java b/xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGPingS2CPayload.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGPingS2CPayload.java rename to xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGPingS2CPayload.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGSyncC2SPayload.java b/xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGSyncC2SPayload.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGSyncC2SPayload.java rename to xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGSyncC2SPayload.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGSyncS2CPayload.java b/xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGSyncS2CPayload.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/network/payload/CGSyncS2CPayload.java rename to xplat/src/main/java/io/github/null2264/cobblegen/network/payload/CGSyncS2CPayload.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/util/CGLog.java b/xplat/src/main/java/io/github/null2264/cobblegen/util/CGLog.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/util/CGLog.java rename to xplat/src/main/java/io/github/null2264/cobblegen/util/CGLog.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/util/Constants.java b/xplat/src/main/java/io/github/null2264/cobblegen/util/Constants.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/util/Constants.java rename to xplat/src/main/java/io/github/null2264/cobblegen/util/Constants.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/util/GeneratorType.java b/xplat/src/main/java/io/github/null2264/cobblegen/util/GeneratorType.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/util/GeneratorType.java rename to xplat/src/main/java/io/github/null2264/cobblegen/util/GeneratorType.java diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/util/PayloadHelper.java b/xplat/src/main/java/io/github/null2264/cobblegen/util/PayloadHelper.java similarity index 100% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/util/PayloadHelper.java rename to xplat/src/main/java/io/github/null2264/cobblegen/util/PayloadHelper.java diff --git a/xplat/src/main/java/io/github/null2264/cobblegen/util/PluginFinder.java b/xplat/src/main/java/io/github/null2264/cobblegen/util/PluginFinder.java new file mode 100644 index 00000000..4dcf4bf8 --- /dev/null +++ b/xplat/src/main/java/io/github/null2264/cobblegen/util/PluginFinder.java @@ -0,0 +1,44 @@ +package io.github.null2264.cobblegen.util; + +import io.github.null2264.cobblegen.CobbleGenPlugin; +import org.jetbrains.annotations.ApiStatus; + +import java.util.*; + +import static io.github.null2264.cobblegen.compat.CollectionCompat.streamToList; + +public abstract class PluginFinder { + + private static PluginFinder INSTANCE; + + public static void init(PluginFinder impl) { + if (INSTANCE != null) throw new IllegalStateException("Already initialized!"); + INSTANCE = impl; + } + + public static PluginFinder getInstance() { + if (INSTANCE == null) throw new IllegalStateException("Not yet initialized!"); + return INSTANCE; + } + + public abstract List getModPlugins(); + + @ApiStatus.Internal + public static class PlugInContainer { + final String modId; + final CobbleGenPlugin plugin; + + public PlugInContainer(String modId, CobbleGenPlugin plugin) { + this.modId = modId; + this.plugin = plugin; + } + + public String getModId() { + return modId; + } + + public CobbleGenPlugin getPlugin() { + return plugin; + } + } +} diff --git a/cobblegen/src/main/java/io/github/null2264/cobblegen/util/Util.java b/xplat/src/main/java/io/github/null2264/cobblegen/util/Util.java similarity index 95% rename from cobblegen/src/main/java/io/github/null2264/cobblegen/util/Util.java rename to xplat/src/main/java/io/github/null2264/cobblegen/util/Util.java index ed7ccbaf..e3367b59 100644 --- a/cobblegen/src/main/java/io/github/null2264/cobblegen/util/Util.java +++ b/xplat/src/main/java/io/github/null2264/cobblegen/util/Util.java @@ -47,13 +47,13 @@ public static Optional optional(@Nullable T nullable) { } public static boolean isPortingLibLoaded() { - return LoaderCompat.isModLoaded("porting_lib"); + return LoaderCompat.getInstance().isModLoaded("porting_lib"); } public static boolean isAnyRecipeViewerLoaded() { - return LoaderCompat.isModLoaded("roughlyenoughitems") || - LoaderCompat.isModLoaded("jei") || - LoaderCompat.isModLoaded("emi"); + return LoaderCompat.getInstance().isModLoaded("roughlyenoughitems") || + LoaderCompat.getInstance().isModLoaded("jei") || + LoaderCompat.getInstance().isModLoaded("emi"); } public static Fluid getFluid(CGIdentifier id) { diff --git a/xplat/src/main/java/io/github/null2264/cobblegen/util/mc/MCConstants.java b/xplat/src/main/java/io/github/null2264/cobblegen/util/mc/MCConstants.java new file mode 100644 index 00000000..ca87dee9 --- /dev/null +++ b/xplat/src/main/java/io/github/null2264/cobblegen/util/mc/MCConstants.java @@ -0,0 +1,7 @@ +package io.github.null2264.cobblegen.util.mc; + +/** + * MC-related constants. Do NOT use during mod loading state (e.g. in MixinPlugin) + */ +public class MCConstants { +} diff --git a/cobblegen/src/main/resources/assets/cobblegen/lang/en_us.json b/xplat/src/main/resources/assets/cobblegen/lang/en_us.json similarity index 100% rename from cobblegen/src/main/resources/assets/cobblegen/lang/en_us.json rename to xplat/src/main/resources/assets/cobblegen/lang/en_us.json diff --git a/cobblegen/src/main/resources/assets/cobblegen/textures/gui/jei.png b/xplat/src/main/resources/assets/cobblegen/textures/gui/jei.png similarity index 100% rename from cobblegen/src/main/resources/assets/cobblegen/textures/gui/jei.png rename to xplat/src/main/resources/assets/cobblegen/textures/gui/jei.png diff --git a/cobblegen/src/main/resources/cobblegen.accesswidener b/xplat/src/main/resources/cobblegen.accesswidener similarity index 100% rename from cobblegen/src/main/resources/cobblegen.accesswidener rename to xplat/src/main/resources/cobblegen.accesswidener diff --git a/cobblegen/src/main/resources/cobblegen.mixins.json b/xplat/src/main/resources/cobblegen.mixins.json similarity index 100% rename from cobblegen/src/main/resources/cobblegen.mixins.json rename to xplat/src/main/resources/cobblegen.mixins.json diff --git a/cobblegen/src/main/resources/icon.png b/xplat/src/main/resources/icon.png similarity index 100% rename from cobblegen/src/main/resources/icon.png rename to xplat/src/main/resources/icon.png