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