diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c451830..a06e02b 100755 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,55 +1,9 @@ -# Automatically build the project and run any configured tests for every push -# and submitted pull request. This can help catch issues that only occur on -# certain platforms or Java versions, and provides a first line of defence -# against bad commits. - name: build on: [pull_request, push] +permissions: + contents: read + jobs: build: - strategy: - matrix: - java: [ - 25, - ] - - distribution: [ - "temurin", - ] - - os: [ubuntu-24.04] - - runs-on: ${{ matrix.os }} - steps: - - name: checkout repository - uses: actions/checkout@v6 - - name: validate gradle wrapper - uses: gradle/actions/wrapper-validation@v5 - - name: setup jdk ${{ matrix.java }} - uses: actions/setup-java@v5 - with: - java-version: ${{ matrix.java }} - distribution: ${{ matrix.distribution }} - cache: 'gradle' - - name: make gradle wrapper executable - run: chmod +x ./gradlew - - name: cache gradle - uses: actions/cache@v5 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - ~/.gradle/build-cache - ~/.gradle/daemon - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - ${{ runner.os }}- - - name: build - run: ./gradlew chiseledBuild --build-cache --no-configuration-cache - - name: capture build artifacts - uses: actions/upload-artifact@v6 - with: - name: Artifacts - path: build/libs/ + uses: ./.github/workflows/build_reusable.yml diff --git a/.github/workflows/build_reusable.yml b/.github/workflows/build_reusable.yml new file mode 100644 index 0000000..b5db5ee --- /dev/null +++ b/.github/workflows/build_reusable.yml @@ -0,0 +1,58 @@ +name: build (reusable) + +on: + workflow_call: + inputs: + publish: + description: Also upload every target to Modrinth and CurseForge. + type: boolean + default: false + secrets: + MODRINTH_API_KEY: + required: false + CURSEFORGE_TOKEN: + required: false + +jobs: + build: + runs-on: ubuntu-24.04 + steps: + - name: checkout repository + uses: actions/checkout@v6 + + - name: validate gradle wrapper + uses: gradle/actions/wrapper-validation@v5 + # One JDK for everything: the buildscripts pin a Java 25 toolchain and set + # options.release per target, so javac emits the right bytecode level (8 for + # 1.16.5, 17 for 1.18-1.20.4, ...) without a JDK per Minecraft version. + - name: setup jdk + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: 25 + + - name: setup gradle + uses: gradle/actions/setup-gradle@v4 + + - name: make gradle wrapper executable + run: chmod +x ./gradlew + + - name: build all targets + run: ./gradlew chiseledBuild --continue --stacktrace --build-cache --no-configuration-cache + + # -PpublishRelease is what flips publishMods out of dry-run mode. Without this step + # (or without that flag) nothing is ever uploaded. + - name: publish all targets + if: inputs.publish + env: + MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }} + CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} + run: ./gradlew chiseledPublish -PpublishRelease --stacktrace --build-cache --no-configuration-cache + + - name: capture build artifacts + if: always() + uses: actions/upload-artifact@v6 + with: + name: xyzcopy-jars + path: build/libs/**/*.jar + if-no-files-found: warn diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..91c38e8 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,49 @@ +# Tag-triggered release: verifies the tag matches mod.version, builds every target and +# uploads them to Modrinth/CurseForge. The jars are also kept as workflow artifacts. +# +# Requires two repository secrets: MODRINTH_API_KEY and CURSEFORGE_TOKEN. +# Tag either `1.0.0` or `v1.0.0` — both are accepted as long as the number matches +# mod.version in stonecutter.properties.toml. + +name: release + +on: + push: + tags: + - '*' + +permissions: + contents: read + +jobs: + validate: + name: validate tag + runs-on: ubuntu-24.04 + steps: + - name: checkout repository + uses: actions/checkout@v6 + + # Guards against tagging a commit whose mod.version was never bumped, which would + # otherwise publish a release under the previous version number. + - name: check tag matches mod.version + run: | + set -euo pipefail + tag="${GITHUB_REF_NAME#v}" + version="$(sed -n 's/^mod\.version[[:space:]]*=[[:space:]]*"\(.*\)"/\1/p' stonecutter.properties.toml)" + if [ -z "$version" ]; then + echo "::error::could not read mod.version from stonecutter.properties.toml" + exit 1 + fi + if [ "$tag" != "$version" ]; then + echo "::error::tag '${GITHUB_REF_NAME}' does not match mod.version '${version}'" + exit 1 + fi + echo "tag '${GITHUB_REF_NAME}' matches mod.version '${version}'" + + publish: + name: build and publish + needs: validate + uses: ./.github/workflows/build_reusable.yml + with: + publish: true + secrets: inherit diff --git a/.gitignore b/.gitignore index 3dbbae6..7ac7076 100755 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,11 @@ .VolumeIcon.icns .com.apple.timemachine.donotpresent +# shhhh ai +.ai +.claude +.codex + # Directories potentially created on remote AFP share .AppleDB .AppleDesktop @@ -95,4 +100,7 @@ run/ # architectury .architectury-transformer\debug.log -.architectury-transformer/debug.log \ No newline at end of file +.architectury-transformer/debug.log + +# superpowers +docs/superpowers/ \ No newline at end of file diff --git a/.sc_active_version b/.sc_active_version new file mode 100644 index 0000000..0bd139e --- /dev/null +++ b/.sc_active_version @@ -0,0 +1 @@ +26.1-fabric \ No newline at end of file diff --git a/CHANGES.md b/CHANGES.md index ff4ad0b..c12ef66 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,2 +1,2 @@ changes: -- initial release \ No newline at end of file +- 26.x support \ No newline at end of file diff --git a/build.fabric.gradle.kts b/build.fabric.gradle.kts new file mode 100644 index 0000000..c9e2446 --- /dev/null +++ b/build.fabric.gradle.kts @@ -0,0 +1,135 @@ +import dev.kikugie.stonecutter.data.deserialization.SCList +import dev.kikugie.stonecutter.data.deserialization.SCPrimitive +import me.modmuss50.mpp.ReleaseType + +plugins { + id("loom-plugin-chooser") + alias(libs.plugins.mod.publish) +} + +val modVersion = property("mod.version") as String +val modId = property("mod.id") as String +val mcCompat = property("mod.mc_compat") as String +val versionName = property("mod.version_name") as String +val obfuscated = sc.current.version.startsWith("1.") +val keyBindingApi = if (sc.current.parsed >= "26.1") "fabric-key-mapping-api-v1" else "fabric-key-binding-api-v1" + +version = "$modVersion+$versionName-fabric" +group = property("mod.group") as String +base.archivesName = modId + +val requiredJava: JavaVersion = when { + sc.current.parsed >= "26.1" -> JavaVersion.VERSION_25 + sc.current.parsed >= "1.20.5" -> JavaVersion.VERSION_21 + sc.current.parsed >= "1.18" -> JavaVersion.VERSION_17 + sc.current.parsed >= "1.17" -> JavaVersion.VERSION_16 + else -> JavaVersion.VERSION_1_8 +} + +repositories { + maven("https://maven.shedaniel.me/") + maven("https://maven.terraformersmc.com/releases/") +} + +dependencies { + minecraft("com.mojang:minecraft:${sc.current.version}") + if (obfuscated) mappings(loom.officialMojangMappings()) + + modImplementation("net.fabricmc:fabric-loader:${property("deps.fabric_loader")}") + modImplementation("me.shedaniel.cloth:cloth-config-fabric:${property("deps.cloth_config")}") + modImplementation("com.terraformersmc:modmenu:${property("deps.mod_menu")}") + modImplementation("net.fabricmc.fabric-api:fabric-api:${property("deps.fabric_api")}") +} + +loom { + runConfigs.all { + generateRunConfig = true + runDirectory = rootProject.layout.projectDirectory.dir("run") + } + decompilers { + get("vineflower").apply { options.put("mark-corresponding-synthetics", "1") } + } +} + +java { + withSourcesJar() + toolchain { + vendor = JvmVendorSpec.ADOPTIUM + languageVersion = JavaLanguageVersion.of(25) + } +} + +tasks.withType().configureEach { + options.release = requiredJava.majorVersion.toInt() +} + +val runLauncher = extensions.getByType().launcherFor { + languageVersion = JavaLanguageVersion.of(requiredJava.majorVersion) + vendor = JvmVendorSpec.ADOPTIUM +} +tasks.withType().matching { it.name.startsWith("run") }.configureEach { + javaLauncher = runLauncher +} + +val mainJar = tasks.named(if (obfuscated) "remapJar" else "jar") +val srcJar = tasks.named(if (obfuscated) "remapSourcesJar" else "sourcesJar") + +tasks { + processResources { + val mixinJava = "JAVA_${requiredJava.majorVersion}" + val props = mapOf("version" to modVersion, "minecraftVersion" to mcCompat, "javaVersion" to requiredJava.majorVersion, "keyBindingApi" to keyBindingApi) + props.forEach { (k, v) -> inputs.property(k, v) } + filesMatching("fabric.mod.json") { expand(props) } + filesMatching("*.mixins.json") { expand("java" to mixinJava) } + exclude("META-INF/mods.toml", "META-INF/neoforge.mods.toml", "pack.mcmeta") + } + register("buildAndCollect") { + group = "build" + from(mainJar, srcJar) + into(rootProject.layout.buildDirectory.file("libs/$modVersion/fabric")) + } +} + +val modrinthToken = providers.environmentVariable("MODRINTH_API_KEY") + .orElse(providers.systemProperty("MODRINTH_API_KEY")) +val curseforgeToken = providers.environmentVariable("CURSEFORGE_TOKEN") + .orElse(providers.systemProperty("CURSEFORGE_TOKEN")) + +val mcReleases = (sc.properties.raw("mod", "mc_releases") as SCList) + .map { (it as SCPrimitive).content.toString() } + +publishMods { + file = tasks.named(if (obfuscated) "remapJar" else "jar") + .flatMap { it.archiveFile } + type = ReleaseType.STABLE + displayName = "Fabric | $versionName [v$modVersion]" + version = project.version.toString() + changelog = "## [Fabric API](https://modrinth.com/mod/fabric-api) is required for Custom Keybinds!\n\n" + + rootProject.file("CHANGES.md").readText() + modLoaders.add("fabric") + modLoaders.add("quilt") + + dryRun = !project.hasProperty("publishRelease") + + modrinth { + accessToken = modrinthToken + projectId = "w4Xqquyv" + minecraftVersions.addAll(mcReleases) + requires("cloth-config") + optional("fabric-api") + optional("modmenu") + } + + curseforge { + accessToken = curseforgeToken + projectId = "1421731" + minecraftVersions.addAll(mcReleases) + javaVersions.add(requiredJava) + client = true + server = false + changelogType = "markdown" + requires("cloth-config") + optional("fabric-api") + optional("modmenu") + } +} diff --git a/build.forge.gradle.kts b/build.forge.gradle.kts new file mode 100644 index 0000000..97dbf22 --- /dev/null +++ b/build.forge.gradle.kts @@ -0,0 +1,129 @@ +import dev.kikugie.stonecutter.data.deserialization.SCList +import dev.kikugie.stonecutter.data.deserialization.SCPrimitive +import me.modmuss50.mpp.ReleaseType + +plugins { + id("loom-plugin-chooser") + alias(libs.plugins.mod.publish) +} + +val modVersion = property("mod.version") as String +val modId = property("mod.id") as String +val mcCompat = property("mod.mc_compat") as String +val versionName = property("mod.version_name") as String +val obfuscated = sc.current.version.startsWith("1.") +val clothSep = if (sc.current.version == "1.16.5") "-" else "_" + +version = "$modVersion+$versionName-forge" +group = property("mod.group") as String +base.archivesName = modId + +val requiredJava: JavaVersion = when { + sc.current.parsed >= "26.1" -> JavaVersion.VERSION_25 + sc.current.parsed >= "1.20.5" -> JavaVersion.VERSION_21 + sc.current.parsed >= "1.18" -> JavaVersion.VERSION_17 + sc.current.parsed >= "1.17" -> JavaVersion.VERSION_16 + else -> JavaVersion.VERSION_1_8 +} + +repositories { + maven("https://maven.shedaniel.me/") + maven("https://maven.minecraftforge.net/") + exclusiveContent { + forRepository { maven("https://api.modrinth.com/maven") } + filter { includeGroup("maven.modrinth") } + } +} + +dependencies { + minecraft("com.mojang:minecraft:${sc.current.version}") + if (obfuscated) mappings(loom.officialMojangMappings()) + "forge"("net.minecraftforge:forge:${sc.current.version}-${property("deps.forge_loader")}") + // shedaniel stopped shipping Forge builds after 1.21.x; 26.x+ uses the + // community port (https://modrinth.com/mod/cloth-config-forge) + val clothGroup = if (obfuscated) "me.shedaniel.cloth" else "maven.modrinth" + modImplementation("$clothGroup:cloth-config-forge:${property("deps.cloth_config")}") +} + +loom { + forge { + mixinConfig("xyzcopy.mixins.json") + } + decompilers { + get("vineflower").apply { options.put("mark-corresponding-synthetics", "1") } + } +} + +java { + withSourcesJar() + toolchain { + vendor = JvmVendorSpec.ADOPTIUM + languageVersion = JavaLanguageVersion.of(25) + } +} + +tasks.withType().configureEach { + options.release = requiredJava.majorVersion.toInt() +} + +val runLauncher = extensions.getByType().launcherFor { + languageVersion = JavaLanguageVersion.of(requiredJava.majorVersion) + vendor = JvmVendorSpec.ADOPTIUM +} +tasks.withType().matching { it.name.startsWith("run") }.configureEach { + javaLauncher = runLauncher +} + + +tasks { + processResources { + val mixinJava = "JAVA_${requiredJava.majorVersion}" + val props = mapOf("version" to modVersion, "minecraftVersion" to mcCompat, "javaVersion" to requiredJava.majorVersion, "cloth_config_separator" to clothSep) + props.forEach { (k, v) -> inputs.property(k, v) } + filesMatching("META-INF/mods.toml") { expand(props) } + filesMatching("*.mixins.json") { expand("java" to mixinJava) } + exclude("fabric.mod.json", "META-INF/neoforge.mods.toml", "pack.mcmeta") + } + register("buildAndCollect") { + group = "build" + from(named(if (obfuscated) "remapJar" else "jar"), named(if (obfuscated) "remapSourcesJar" else "sourcesJar")) + into(rootProject.layout.buildDirectory.file("libs/$modVersion/forge")) + } +} + +val modrinthToken = providers.environmentVariable("MODRINTH_API_KEY") + .orElse(providers.systemProperty("MODRINTH_API_KEY")) +val curseforgeToken = providers.environmentVariable("CURSEFORGE_TOKEN") + .orElse(providers.systemProperty("CURSEFORGE_TOKEN")) + +val mcReleases = (sc.properties.raw("mod", "mc_releases") as SCList) + .map { (it as SCPrimitive).content.toString() } + +publishMods { + file = tasks.named(if (obfuscated) "remapJar" else "jar").flatMap { it.archiveFile } + type = ReleaseType.STABLE + displayName = "Forge | $versionName [v$modVersion]" + version = project.version.toString() + changelog = rootProject.file("CHANGES.md").readText() + modLoaders.add("forge") + + dryRun = !project.hasProperty("publishRelease") + + modrinth { + accessToken = modrinthToken + projectId = "w4Xqquyv" + minecraftVersions.addAll(mcReleases) + requires("cloth-config") + } + + curseforge { + accessToken = curseforgeToken + projectId = "1421731" + minecraftVersions.addAll(mcReleases) + javaVersions.add(requiredJava) + client = true + server = false + changelogType = "markdown" + requires("cloth-config") + } +} diff --git a/build.gradle.kts b/build.gradle.kts deleted file mode 100644 index 4c29a8a..0000000 --- a/build.gradle.kts +++ /dev/null @@ -1,217 +0,0 @@ -plugins { - id("dev.architectury.loom") - id("architectury-plugin") - id("me.modmuss50.mod-publish-plugin") - id("com.gradleup.shadow") -} - -val minecraft = stonecutter.current.version -val loader = loom.platform.get().name.lowercase() - -version = "${mod.version}+${mod.prop("version_name")}-$loader" -group = mod.group -base { - archivesName.set(mod.id) -} - -val isFabric = loader == "fabric" -val isForge = loader == "forge" -val isNeoForge = loader == "neoforge" - -stonecutter.const("fabric", isFabric) -stonecutter.const("forge", isForge) -stonecutter.const("neoforge", isNeoForge) - -architectury.common(stonecutter.tree.branches.mapNotNull { - if (stonecutter.current.project !in it) null - else it.project.prop("loom.platform") -}) -repositories { - maven("https://maven.shedaniel.me/") - maven("https://maven.terraformersmc.com/releases/") - maven("https://maven.neoforged.net/releases") - maven("https://maven.minecraftforge.net") - -} -dependencies { - minecraft("com.mojang:minecraft:$minecraft") - mappings(loom.officialMojangMappings()) - - modImplementation("me.shedaniel.cloth:cloth-config-${loader}:${mod.dep("cloth_config_version")}") - - if (isFabric) { - modImplementation("net.fabricmc:fabric-loader:${mod.dep("fabric_loader")}") - modImplementation("com.terraformersmc:modmenu:${mod.dep("mod_menu_version")}") - } - if (isForge) { - "forge"("net.minecraftforge:forge:${minecraft}-${mod.dep("forge_loader")}") - } - if (isNeoForge) { - "neoForge"("net.neoforged:neoforge:${mod.dep("neoforge_loader")}") - } -} - -loom { - decompilers { - get("vineflower").apply { // Adds names to lambdas - useful for mixins - options.put("mark-corresponding-synthetics", "1") - } - } - - accessWidenerPath = rootProject.file("src/main/resources/xyzcopy.accesswidener") - - if (isForge) { - forge { - mixinConfig("xyzcopy.mixins.json") - - convertAccessWideners = true - extraAccessWideners.add(accessWidenerPath.get().asFile.name) - } - } - -} - -java { - withSourcesJar() - val javaVersion = mod.dep("java") - val java = when (javaVersion) { - "8" -> JavaVersion.VERSION_1_8 - "17" -> JavaVersion.VERSION_17 - "21" -> JavaVersion.VERSION_21 - "25" -> JavaVersion.VERSION_25 - else -> JavaVersion.VERSION_21 - } - targetCompatibility = java - sourceCompatibility = java -} - -val shadowBundle: Configuration by configurations.creating { - isCanBeConsumed = false - isCanBeResolved = true -} - -tasks.shadowJar { - configurations = listOf(shadowBundle) - archiveClassifier = "dev-shadow" -} - -tasks.remapJar { - injectAccessWidener = true - inputFile.set(tasks.shadowJar.get().archiveFile) - archiveClassifier = null - dependsOn(tasks.shadowJar) -} - -tasks.jar { - archiveClassifier = "dev" -} - -val buildAndCollect = tasks.register("buildAndCollect") { - group = "versioned" - description = "Must run through 'chiseledBuild'" - from(tasks.remapJar.get().archiveFile, tasks.remapSourcesJar.get().archiveFile) - into(rootProject.layout.buildDirectory.file("libs/${mod.version}/$loader")) - dependsOn("build") -} - -if (stonecutter.current.isActive) { - rootProject.tasks.register("buildActive") { - group = "project" - dependsOn(buildAndCollect) - } - - rootProject.tasks.register("runActive") { - group = "project" - dependsOn(tasks.named("runClient")) - } -} - -tasks.processResources { - var clothConfigSeparator = "_" - if(minecraft == "1.16.5") clothConfigSeparator = "-" - - val expandProps = mapOf( - "version" to version, - "minecraftVersion" to mod.prop("mc_dep"), - "javaVersion" to mod.dep("java"), - "cloth_config_separator" to clothConfigSeparator - ) - - if (isFabric) { - filesMatching("fabric.mod.json") { expand(expandProps) } - exclude("META-INF/mods.toml", "META-INF/neoforge.mods.toml", "pack.mcmeta") - } - - if(isForge || isNeoForge) { - filesMatching("META-INF/*mods.toml") { expand(expandProps) } - exclude("fabric.mod.json") - } - - inputs.properties(expandProps) - -} - -tasks.build { - group = "versioned" - description = "Must run through 'chiseledBuild'" -} - -publishMods { - version.set(project.version.toString()) - displayName.set("${loader.upperCaseFirst()} | ${mod.prop("version_name")} [v${mod.version}]") - type = STABLE - file.set(tasks.remapJar.get().archiveFile) - val mcVersions = mod.prop("mc_targets").split(",") - - changelog = rootProject.file("CHANGES.md").readText() - if(isFabric) changelog = "## [Fabric API](https://modrinth.com/mod/fabric-api) is required for Custom Keybinds!\n\n" + changelog.get() - - - modLoaders.add(loader) - if(isFabric) modLoaders.add("quilt") - - - modrinth { - accessToken = providers.environmentVariable("MODRINTH_API_KEY") - - projectId = "w4Xqquyv" - minecraftVersions.addAll(mcVersions) - - requires("cloth-config") - if(isFabric) { - optional("fabric-api") - optional("modmenu") - } - } - - curseforge { - accessToken = providers.environmentVariable("CURSEFORGE_TOKEN") - - projectId = "1421731" - minecraftVersions.addAll(mcVersions) - - val javaVersion = mod.dep("java") - val java = when (javaVersion) { - "8" -> JavaVersion.VERSION_1_8 - "17" -> JavaVersion.VERSION_17 - "21" -> JavaVersion.VERSION_21 - "25" -> JavaVersion.VERSION_25 - else -> JavaVersion.VERSION_21 - } - javaVersions.add(java) - - clientRequired = true - serverRequired = false - - changelogType = "markdown" - - requires("cloth-config") - if(isFabric) { - optional("fabric-api") - optional("modmenu") - } - } - - //TODO: remove this when actually want to release - dryRun = true -} \ No newline at end of file diff --git a/build.neoforge.gradle.kts b/build.neoforge.gradle.kts new file mode 100644 index 0000000..17d4cab --- /dev/null +++ b/build.neoforge.gradle.kts @@ -0,0 +1,137 @@ +import dev.kikugie.stonecutter.data.deserialization.SCList +import dev.kikugie.stonecutter.data.deserialization.SCPrimitive +import me.modmuss50.mpp.ReleaseType + +plugins { + alias(libs.plugins.neoforge.moddev) + id("neoforge-mutex") + alias(libs.plugins.mod.publish) +} + +val modVersion = property("mod.version") as String +val modId = property("mod.id") as String +val mcCompat = property("mod.mc_compat") as String +val versionName = property("mod.version_name") as String + +version = "$modVersion+$versionName-neoforge" +group = property("mod.group") as String +base.archivesName = modId + +val requiredJava: JavaVersion = when { + sc.current.parsed >= "26.1" -> JavaVersion.VERSION_25 + sc.current.parsed >= "1.20.5" -> JavaVersion.VERSION_21 + else -> JavaVersion.VERSION_17 +} + +repositories { + maven("https://maven.shedaniel.me/") +} + +dependencies { + implementation("me.shedaniel.cloth:cloth-config-neoforge:${property("deps.cloth_config")}") +} + +neoForge { + version = property("deps.neo_loader") as String + + mods { + register(modId) { + sourceSet(sourceSets.main.get()) + } + } + + runs { + register("client") { gameDirectory = rootProject.file("run"); client() } + } +} + +java { + withSourcesJar() + toolchain { + vendor = JvmVendorSpec.ADOPTIUM + languageVersion = JavaLanguageVersion.of(25) + } +} + +tasks.withType().configureEach { + options.release = requiredJava.majorVersion.toInt() +} + +val runLauncher = extensions.getByType().launcherFor { + languageVersion = JavaLanguageVersion.of(requiredJava.majorVersion) + vendor = JvmVendorSpec.ADOPTIUM +} +// older versions dont like being ran with java 25 +tasks.withType().matching { it.name.startsWith("run") }.configureEach { + javaLauncher = runLauncher +} + +val java25 = extensions.getByType().launcherFor { + languageVersion = JavaLanguageVersion.of(25) + vendor = JvmVendorSpec.ADOPTIUM +} +tasks.withType().configureEach { + toolsJavaExecutable = java25.map { it.executablePath.asFile.absolutePath } +} + + +tasks { + processResources { + val mixinJava = "JAVA_${requiredJava.majorVersion}" + val props = mapOf( + "version" to modVersion, + "minecraftVersion" to mcCompat, + "javaVersion" to requiredJava.majorVersion, + "cloth_config_separator" to "_" + ) + props.forEach { (k, v) -> inputs.property(k, v) } + filesMatching("META-INF/neoforge.mods.toml") { expand(props) } + filesMatching("*.mixins.json") { expand("java" to mixinJava) } + exclude("fabric.mod.json", "META-INF/mods.toml") + } + + named("createMinecraftArtifacts") { dependsOn("stonecutterGenerate") } + + register("buildAndCollect") { + group = "build" + from(named("jar").flatMap { it.archiveFile }, named("sourcesJar").flatMap { it.archiveFile }) + into(rootProject.layout.buildDirectory.file("libs/$modVersion/neoforge")) + } +} + +val modrinthToken = providers.environmentVariable("MODRINTH_API_KEY") + .orElse(providers.systemProperty("MODRINTH_API_KEY")) +val curseforgeToken = providers.environmentVariable("CURSEFORGE_TOKEN") + .orElse(providers.systemProperty("CURSEFORGE_TOKEN")) + +val mcReleases = (sc.properties.raw("mod", "mc_releases") as SCList) + .map { (it as SCPrimitive).content.toString() } + +publishMods { + file = tasks.named("jar").flatMap { it.archiveFile } + type = ReleaseType.STABLE + displayName = "NeoForge | $versionName [v$modVersion]" + version = project.version.toString() + changelog = rootProject.file("CHANGES.md").readText() + modLoaders.add("neoforge") + + dryRun = !project.hasProperty("publishRelease") + + modrinth { + accessToken = modrinthToken + projectId = "w4Xqquyv" + minecraftVersions.addAll(mcReleases) + requires("cloth-config") + } + + curseforge { + accessToken = curseforgeToken + projectId = "1421731" + minecraftVersions.addAll(mcReleases) + javaVersions.add(requiredJava) + client = true + server = false + changelogType = "markdown" + requires("cloth-config") + } +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index c7082a3..f129248 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,8 +1,15 @@ plugins { `kotlin-dsl` - kotlin("jvm") version "2.1.10" } - repositories { + gradlePluginPortal() mavenCentral() -} \ No newline at end of file +} +gradlePlugin { + plugins { + register("loom-plugin-chooser") { + id = "loom-plugin-chooser" + implementationClass = "LoomPluginChooser" + } + } +} diff --git a/buildSrc/src/main/kotlin/LoomPluginChooser.kt b/buildSrc/src/main/kotlin/LoomPluginChooser.kt new file mode 100644 index 0000000..507c0b1 --- /dev/null +++ b/buildSrc/src/main/kotlin/LoomPluginChooser.kt @@ -0,0 +1,28 @@ +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.extra + +// loom.platform must be set before the Loom plugin applies (the only reliably-early +// point); 26.x is unobfuscated so it uses loom-no-remap with mod* configs recreated. +open class LoomPluginChooser : Plugin { + override fun apply(target: Project): Unit = with(target) { + val loader = name.substringAfterLast('-') + if (loader != "fabric") extra.set("loom.platform", loader) + + val obfuscated = name.substringBefore('-').startsWith("1.") + if (obfuscated) { + plugins.apply("dev.architectury.loom") + } else { + plugins.apply("dev.architectury.loom-no-remap") + for (cfg in listOf("api", "implementation", "compileOnly", "runtimeOnly", "localRuntime")) { + val loomified = "mod" + cfg.replaceFirstChar(Char::uppercaseChar) + val new = configurations.create(loomified) + configurations.named(cfg) { extendsFrom(new) } + } + configurations.register("mappings") { + isCanBeResolved = false + isCanBeConsumed = false + } + } + } +} diff --git a/buildSrc/src/main/kotlin/build-extensions.kt b/buildSrc/src/main/kotlin/build-extensions.kt deleted file mode 100644 index 6f27ab9..0000000 --- a/buildSrc/src/main/kotlin/build-extensions.kt +++ /dev/null @@ -1,31 +0,0 @@ -import org.gradle.api.Project -import org.gradle.api.artifacts.dsl.RepositoryHandler -import org.gradle.kotlin.dsl.maven -import org.gradle.language.jvm.tasks.ProcessResources - -val Project.mod: ModData get() = ModData(this) -fun Project.prop(key: String): String? = findProperty(key)?.toString() -fun String.upperCaseFirst() = replaceFirstChar { if (it.isLowerCase()) it.uppercaseChar() else it } - -fun RepositoryHandler.strictMaven(url: String, alias: String, vararg groups: String) = exclusiveContent { - forRepository { maven(url) { name = alias } } - filter { groups.forEach(::includeGroup) } -} - -fun ProcessResources.properties(files: Iterable, vararg properties: Pair) { - for ((name, value) in properties) inputs.property(name, value) - filesMatching(files) { - expand(properties.toMap()) - } -} - -@JvmInline -value class ModData(private val project: Project) { - val id: String get() = requireNotNull(project.prop("mod.id")) { "Missing 'mod.id'" } - val name: String get() = requireNotNull(project.prop("mod.name")) { "Missing 'mod.name'" } - val version: String get() = requireNotNull(project.prop("mod.version")) { "Missing 'mod.version'" } - val group: String get() = requireNotNull(project.prop("mod.group")) { "Missing 'mod.group'" } - - fun prop(key: String) = requireNotNull(project.prop("mod.$key")) { "Missing 'mod.$key'" } - fun dep(key: String) = requireNotNull(project.prop("deps.$key")) { "Missing 'deps.$key'" } -} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/neoforge-mutex.gradle.kts b/buildSrc/src/main/kotlin/neoforge-mutex.gradle.kts new file mode 100644 index 0000000..29bc7f4 --- /dev/null +++ b/buildSrc/src/main/kotlin/neoforge-mutex.gradle.kts @@ -0,0 +1,13 @@ +import org.gradle.api.services.BuildService +import org.gradle.api.services.BuildServiceParameters + +// Serializes NeoForge's Minecraft artifact creation so building many versions doesn't recompile MC in parallel. +interface NeoForgeMutex : BuildService + +val mutex = gradle.sharedServices.registerIfAbsent("createMinecraftArtifactsMutex", NeoForgeMutex::class.java) { + maxParallelUsages.set(1) +} + +tasks.named { it == "createMinecraftArtifacts" }.configureEach { + usesService(mutex) +} diff --git a/gradle.properties b/gradle.properties index 3ebdac7..0d9441a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,33 +1,3 @@ -# Done to increase the memory available to Gradle. org.gradle.jvmargs=-Xmx4G -#org.gradle.parallel=true -org.gradle.caching=false -org.gradle.caching.debug=false -org.gradle.parallel=false -#org.gradle.configureondemand=true - -# Mod properties -mod.version=1.0.0 -mod.group=net.notcoded -mod.id=xyzcopy -mod.name=XYZ Copy - -# Used for the mod metadata -mod.mc_dep=[VERSIONED] -# Used for the release title. I.e. '1.20.x' -mod.version_name=[VERSIONED] -# Space separated versions for publishing. I.e. '1.20, 1.20.1' -mod.mc_targets=[VERSIONED] - -# Mod setup -deps.mixin_extras=0.4.1 -deps.fabric_loader=0.14.20 -deps.fabric_version=[VERSIONED] - -deps.forge_loader=[VERSIONED] -deps.neoforge_loader=[VERSIONED] - -# Mod dependencies -deps.mod_menu_version=[VERSIONED] -deps.cloth_config_version=[VERSIONED] -deps.java=[VERSIONED] +org.gradle.parallel=true +org.gradle.configuration-cache=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..aaf0d37 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,12 @@ +# Stonecutter and the foojay resolver are declared in settings.gradle.kts instead — +# Gradle can't resolve catalog accessors inside a settings `plugins {}` block. +[versions] +architectury-loom = "1.17-SNAPSHOT" +neoforge-moddev = "2.0.140" +mod-publish = "2.1.1" + +[plugins] +architectury-loom = { id = "dev.architectury.loom", version.ref = "architectury-loom" } +architectury-loom-no-remap = { id = "dev.architectury.loom-no-remap", version.ref = "architectury-loom" } +neoforge-moddev = { id = "net.neoforged.moddev", version.ref = "neoforge-moddev" } +mod-publish = { id = "me.modmuss50.mod-publish-plugin", version.ref = "mod-publish" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55..b1b8ef5 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 23449a2..a9db115 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,9 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 +retries=0 +retryBackOffMs=500 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 23d15a9..249efbb 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. @@ -20,7 +20,7 @@ ############################################################################## # -# Gradle start up script for POSIX generated by Gradle. +# gradlew start up script for POSIX generated by Gradle. # # Important for running: # @@ -29,7 +29,7 @@ # bash, then to run this script, type that shell name before the whole # command line, like: # -# ksh Gradle +# ksh gradlew # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,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" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index db3a6ac..a51ec4f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -19,12 +19,12 @@ @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -51,7 +51,7 @@ 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 +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -65,30 +65,18 @@ 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 +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line -set CLASSPATH= -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +@rem Execute gradlew +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -: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 +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/settings.gradle.kts b/settings.gradle.kts index 17c957b..99918eb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,34 +3,43 @@ pluginManagement { mavenCentral() gradlePluginPortal() maven("https://maven.fabricmc.net/") - maven("https://maven.architectury.dev") - maven("https://maven.minecraftforge.net") maven("https://maven.neoforged.net/releases/") + maven("https://maven.minecraftforge.net") + maven("https://maven.architectury.dev") + maven("https://maven.kikugie.dev/releases") maven("https://maven.kikugie.dev/snapshots") + maven("https://maven.parchmentmc.org") } } plugins { - id("dev.kikugie.stonecutter") version "0.6.1" + id("dev.kikugie.stonecutter") version "0.9.6" + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } stonecutter { - centralScript = "build.gradle.kts" - kotlinController = true - shared { - fun mc(loader: String, vararg versions: String) { - for (version in versions) vers("$version-$loader", version) + create(rootProject) { + fun match(project: String, vararg loaders: String, version: String = project) { + for (loader in loaders) version("$project-$loader", version).buildscript("build.$loader.gradle.kts") } - - // TODO: 26.1 (requires seperate build script) - mc("fabric", "1.16.5", "1.17.1", "1.19", "1.19.4", "1.20.1", "1.21.9", "1.21.11") - mc("forge", "1.16.5", "1.17.1", "1.18.2", "1.19", "1.19.4", "1.20.1", "1.20.6", "1.21.6", "1.21.9", "1.21.11") - mc("neoforge", "1.20.4", "1.20.6", "1.21.9", "1.21.11") + match("1.16.5", "fabric", "forge") + match("1.17.1", "fabric", "forge") + match("1.18.2", "forge") + match("1.19", "fabric", "forge") + match("1.19.4", "fabric", "forge") + match("1.20.1", "fabric", "forge") + match("1.21.6", "forge") + match("1.20.4", "neoforge") + match("1.20.6", "neoforge", "forge") + match("1.21.9", "fabric", "neoforge", "forge") + match("1.21.11", "fabric", "neoforge", "forge") + match("26.1", "fabric", "neoforge", "forge") + match("26.2", "fabric", "neoforge", "forge") vcsVersion = "1.16.5-fabric" } - create(rootProject) } -rootProject.name = "xyzcopy" \ No newline at end of file +rootProject.name = "xyzcopy" + diff --git a/src/main/java/net/notcoded/xyzcopy/XYZCopy.java b/src/main/java/net/notcoded/xyzcopy/XYZCopy.java index 03dd4f3..61dd2bf 100644 --- a/src/main/java/net/notcoded/xyzcopy/XYZCopy.java +++ b/src/main/java/net/notcoded/xyzcopy/XYZCopy.java @@ -7,8 +7,8 @@ //? if 1.21.9 { //import net.minecraft.resources.ResourceLocation; //?} elif >=1.21.11 { -/*import net.minecraft.resources.Identifier; -*///?} +import net.minecraft.resources.Identifier; +//?} import net.notcoded.xyzcopy.config.ModClothConfig; import net.notcoded.xyzcopy.config.ModConfig; import net.notcoded.xyzcopy.platforms.ModPlatform; @@ -22,17 +22,17 @@ public class XYZCopy { public static ModPlatform platform; //? if >=1.21.9 { - /*public static final KeyMapping.Category category = new KeyMapping.Category( + public static final KeyMapping.Category category = new KeyMapping.Category( //? if 1.21.9 { //ResourceLocation //?} elif >=1.21.11 { - /^Identifier - ^///?} + Identifier + //?} .fromNamespaceAndPath("xyzcopy", "keybind") ); - *///?} else { - private static final String category = "key.category.xyzcopy.keybind"; - //?} + //?} else { + /*private static final String category = "key.category.xyzcopy.keybind"; + *///?} public static KeyMapping openConfigKeybind = new KeyMapping("xyzcopy.keybind.open_config", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_UNKNOWN, category); diff --git a/src/main/java/net/notcoded/xyzcopy/mixin/KeyMappingAccessor.java b/src/main/java/net/notcoded/xyzcopy/mixin/KeyMappingAccessor.java new file mode 100644 index 0000000..6d227d9 --- /dev/null +++ b/src/main/java/net/notcoded/xyzcopy/mixin/KeyMappingAccessor.java @@ -0,0 +1,12 @@ +package net.notcoded.xyzcopy.mixin; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(KeyMapping.class) +public interface KeyMappingAccessor { + @Accessor("key") + InputConstants.Key getKey(); +} diff --git a/src/main/java/net/notcoded/xyzcopy/mixin/KeyboardHandlerMixin.java b/src/main/java/net/notcoded/xyzcopy/mixin/KeyboardHandlerMixin.java index 0aa387a..e042d4a 100644 --- a/src/main/java/net/notcoded/xyzcopy/mixin/KeyboardHandlerMixin.java +++ b/src/main/java/net/notcoded/xyzcopy/mixin/KeyboardHandlerMixin.java @@ -3,16 +3,16 @@ import net.minecraft.client.KeyboardHandler; //? if >=1.21.9 { -/*import net.minecraft.client.Minecraft; +import net.minecraft.client.Minecraft; import net.minecraft.client.input.KeyEvent; -*///?} +//?} //? if >=1.21.11 { -/*import net.minecraft.util.Util; -*///?} else { -import net.minecraft.Util; +import net.minecraft.util.Util; +//?} else { +/*import net.minecraft.Util; import org.lwjgl.glfw.GLFW; -//?} +*///?} import net.notcoded.xyzcopy.XYZCopy; import net.notcoded.xyzcopy.config.ModConfig; import net.notcoded.xyzcopy.util.LocationUtil; @@ -29,33 +29,33 @@ public abstract class KeyboardHandlerMixin { private long debugCrashKeyTime; //? if <1.21.9 { - @Inject(method = "handleDebugKeys", at = @At("HEAD"), cancellable = true) - private void debugKey(int i, CallbackInfoReturnable cir) { - //?} elif >=1.21.9 { /*@Inject(method = "handleDebugKeys", at = @At("HEAD"), cancellable = true) + private void debugKey(int i, CallbackInfoReturnable cir) { + *///?} elif >=1.21.9 { + @Inject(method = "handleDebugKeys", at = @At("HEAD"), cancellable = true) private void debugKey(KeyEvent arg, CallbackInfoReturnable cir) { int i = arg.key(); - *///?} + //?} if (this.debugCrashKeyTime > 0L && this.debugCrashKeyTime < Util.getMillis() - 100L) return; ModConfig config = XYZCopy.config; - if(XYZCopy.config.location.useKeybindWithF3 && i == XYZCopy.copyLocationKeybind.key.getValue()) { + if(config.location.useKeybindWithF3 && i == ((KeyMappingAccessor) XYZCopy.copyLocationKeybind).getKey().getValue()) { cir.setReturnValue(true); LocationUtil.copyLocation(); return; } - if(XYZCopy.config.block.useKeybindWithF3 && i == XYZCopy.copyBlockKeybind.key.getValue()) { + if(config.block.useKeybindWithF3 && i == ((KeyMappingAccessor) XYZCopy.copyBlockKeybind).getKey().getValue()) { cir.setReturnValue(true); LocationUtil.copyBlockLocation(); return; } //? if >=1.21.11 { - /*boolean f3CKey = Minecraft.getInstance().options.keyDebugCopyLocation.matches(arg); - *///?} else { - boolean f3CKey = i == GLFW.GLFW_KEY_C; - //?} + boolean f3CKey = Minecraft.getInstance().options.keyDebugCopyLocation.matches(arg); + //?} else { + /*boolean f3CKey = i == GLFW.GLFW_KEY_C; + *///?} if(f3CKey && config.location.replaceDebugKey) { cir.setReturnValue(true); diff --git a/src/main/java/net/notcoded/xyzcopy/mixin/MinecraftMixin.java b/src/main/java/net/notcoded/xyzcopy/mixin/MinecraftMixin.java index 67c22a3..aeb7c97 100644 --- a/src/main/java/net/notcoded/xyzcopy/mixin/MinecraftMixin.java +++ b/src/main/java/net/notcoded/xyzcopy/mixin/MinecraftMixin.java @@ -27,7 +27,11 @@ private void tick(CallbackInfo ci) { } while(XYZCopy.openConfigKeybind.consumeClick()) { + //? if >=26.2 { + /*Minecraft.getInstance().gui.setScreen(ModClothConfig.buildScreen(Minecraft.getInstance().gui.screen())); + *///?} else { Minecraft.getInstance().setScreen(ModClothConfig.buildScreen(Minecraft.getInstance().screen)); + //?} } } } diff --git a/src/main/java/net/notcoded/xyzcopy/platforms/fabric/XYZCopyFabric.java b/src/main/java/net/notcoded/xyzcopy/platforms/fabric/XYZCopyFabric.java index 68f6499..268b853 100644 --- a/src/main/java/net/notcoded/xyzcopy/platforms/fabric/XYZCopyFabric.java +++ b/src/main/java/net/notcoded/xyzcopy/platforms/fabric/XYZCopyFabric.java @@ -2,8 +2,11 @@ package net.notcoded.xyzcopy.platforms.fabric; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; -import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; +//? if >=26.1 { +import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; +//?} else { +/*import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +*///?} import net.fabricmc.loader.api.FabricLoader; import net.notcoded.xyzcopy.XYZCopy; import net.notcoded.xyzcopy.platforms.ModPlatform; @@ -12,11 +15,19 @@ public class XYZCopyFabric implements ClientModInitializer { @Override public void onInitializeClient() { - if(FabricLoader.getInstance().isModLoaded("fabric-key-binding-api-v1")) { + //? if >=26.1 { + if(FabricLoader.getInstance().isModLoaded("fabric-key-mapping-api-v1")) { + XYZCopy.openConfigKeybind = KeyMappingHelper.registerKeyMapping(XYZCopy.openConfigKeybind); + XYZCopy.copyBlockKeybind = KeyMappingHelper.registerKeyMapping(XYZCopy.copyBlockKeybind); + XYZCopy.copyLocationKeybind = KeyMappingHelper.registerKeyMapping(XYZCopy.copyLocationKeybind); + } + //?} else { + /*if(FabricLoader.getInstance().isModLoaded("fabric-key-binding-api-v1")) { XYZCopy.openConfigKeybind = KeyBindingHelper.registerKeyBinding(XYZCopy.openConfigKeybind); XYZCopy.copyBlockKeybind = KeyBindingHelper.registerKeyBinding(XYZCopy.copyBlockKeybind); XYZCopy.copyLocationKeybind = KeyBindingHelper.registerKeyBinding(XYZCopy.copyLocationKeybind); } + *///?} XYZCopy.init(new FabricPlatform()); } diff --git a/src/main/java/net/notcoded/xyzcopy/platforms/forge/XYZCopyForge.java b/src/main/java/net/notcoded/xyzcopy/platforms/forge/XYZCopyForge.java index 3561c9d..200bc3f 100644 --- a/src/main/java/net/notcoded/xyzcopy/platforms/forge/XYZCopyForge.java +++ b/src/main/java/net/notcoded/xyzcopy/platforms/forge/XYZCopyForge.java @@ -43,25 +43,54 @@ @Mod("xyzcopy") @OnlyIn(Dist.CLIENT) public class XYZCopyForge { - //? if <1.20.6 { + private static ModLoadingContext modLoadingContext; + + // Forge only injects the loading context into the mod constructor on 1.19.4 and 1.20.6+. + // On 1.19/1.20.1 it looks up a no-arg constructor, so the deprecated get() is the only option there. + //? if <1.19.4 { /^public XYZCopyForge() { + modLoadingContext = ModLoadingContext.get(); IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); modEventBus.addListener(XYZCopyForge::onClientSetup); //? if >=1.19 { modEventBus.addListener(XYZCopyForge::registerBindings); //?} } - ^///?} elif >=1.20.6 <1.21.6 { - /^public XYZCopyForge(IEventBus modEventBus) { + ^///?} elif <1.20 { + /^public XYZCopyForge(FMLJavaModLoadingContext context) { + modLoadingContext = context; + IEventBus modEventBus = context.getModEventBus(); modEventBus.addListener(XYZCopyForge::onClientSetup); modEventBus.addListener(XYZCopyForge::registerBindings); } - ^///?} elif >=1.21.6 { - public XYZCopyForge(FMLJavaModLoadingContext context) { + ^///?} elif <1.20.6 { + /^public XYZCopyForge() { + modLoadingContext = ModLoadingContext.get(); + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + modEventBus.addListener(XYZCopyForge::onClientSetup); + modEventBus.addListener(XYZCopyForge::registerBindings); + } + ^///?} elif <1.21.6 { + /^public XYZCopyForge(FMLJavaModLoadingContext context) { + modLoadingContext = context; + IEventBus modEventBus = context.getModEventBus(); + modEventBus.addListener(XYZCopyForge::onClientSetup); + modEventBus.addListener(XYZCopyForge::registerBindings); + } + ^///?} elif <1.21.9 { + /^public XYZCopyForge(FMLJavaModLoadingContext context) { + modLoadingContext = context; BusGroup modBusGroup = context.getModBusGroup(); FMLClientSetupEvent.getBus(modBusGroup).addListener(XYZCopyForge::onClientSetup); RegisterKeyMappingsEvent.getBus(modBusGroup).addListener(XYZCopyForge::registerBindings); } + ^///?} else { + public XYZCopyForge(FMLJavaModLoadingContext context) { + modLoadingContext = context; + BusGroup modBusGroup = context.getModBusGroup(); + FMLClientSetupEvent.getBus(modBusGroup).addListener(XYZCopyForge::onClientSetup); + RegisterKeyMappingsEvent.BUS.addListener(XYZCopyForge::registerBindings); + } //?} public static void onClientSetup(final FMLClientSetupEvent event) { @@ -94,7 +123,10 @@ public String getModLoader() { @Override public boolean isModLoaded(String modId) { - return ModList.get().isLoaded(modId); + //? if >=26.1 { + return ModList.isLoaded(modId); + //?} else { + /^return ModList.get().isLoaded(modId);^///?} } @Override @@ -105,19 +137,20 @@ public boolean isDevelopmentEnvironment() { static void setupConfigScreen() { //? if >=1.19 { - ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () -> + modLoadingContext.registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () -> new ConfigScreenHandler.ConfigScreenFactory( (client, parent) -> ModClothConfig.buildScreen(parent) ) ); //?} elif >1.16.5 <1.19 { - /^ModLoadingContext.get().registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class, () -> + /^modLoadingContext.registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class, () -> new ConfigGuiHandler.ConfigGuiFactory((client, parent) -> ModClothConfig.buildScreen(parent) )); ^///?} elif 1.16.5 { - /^ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> + /^modLoadingContext.registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (client, parent) -> ModClothConfig.buildScreen(parent) ); ^///?} } -}*/ \ No newline at end of file +} +*///?} diff --git a/src/main/java/net/notcoded/xyzcopy/util/LocationUtil.java b/src/main/java/net/notcoded/xyzcopy/util/LocationUtil.java index c63cd7c..04fcb15 100644 --- a/src/main/java/net/notcoded/xyzcopy/util/LocationUtil.java +++ b/src/main/java/net/notcoded/xyzcopy/util/LocationUtil.java @@ -2,10 +2,10 @@ import net.minecraft.client.Minecraft; //? if <1.19.4 { -import net.minecraft.core.Registry; -//?} elif >=1.19.4 { -/*import net.minecraft.core.registries.BuiltInRegistries; -*///?} +/*import net.minecraft.core.Registry; +*///?} elif >=1.19.4 { +import net.minecraft.core.registries.BuiltInRegistries; +//?} import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.BlockHitResult; @@ -37,20 +37,14 @@ public static void copyLocation() { .replace("%dimension", VersionUtil.getLevel(client.player).dimension() //? if >=1.21.11 { - /*.identifier() - *///?} else { - .location() - //?} + .identifier() + //?} else { + /*.location() + *///?} .toString() ); - if(sendInChat) { - client.gui.getChat().addMessage(VersionUtil.getTranslatableText(config.location.copyMessage.replaceAll("&", "§"))); - client.gui.getChat().addMessage(VersionUtil.getTranslatableText(locationTemplate)); - } else { - client.gui.getChat().addMessage(VersionUtil.getTranslatableText(config.location.copyMessageClipboard.replaceAll("&", "§"))); - client.keyboardHandler.setClipboard(locationTemplate); - } + handleLocation(config.location.copyMessage, config.location.copyMessageClipboard, locationTemplate, sendInChat); } public static void copyBlockLocation() { @@ -72,19 +66,19 @@ public static void copyBlockLocation() { if(XYZCopy.config.block.includeFluids) { FluidState fluidState = VersionUtil.getLevel(client.player).getFluidState(hitResult.getBlockPos()); //? if <1.19.4 { - block = String.valueOf(Registry.FLUID.getKey(fluidState.getType())); - //?} elif >=1.19.4 { - /*block = String.valueOf(BuiltInRegistries.FLUID.getKey(fluidState.getType())); - *///?} + /*block = String.valueOf(Registry.FLUID.getKey(fluidState.getType())); + *///?} elif >=1.19.4 { + block = String.valueOf(BuiltInRegistries.FLUID.getKey(fluidState.getType())); + //?} } if(block == null || block.equals("minecraft:empty")) { BlockState blockState = VersionUtil.getLevel(client.player).getBlockState(hitResult.getBlockPos()); //? if <1.19.4 { - block = String.valueOf(Registry.BLOCK.getKey(blockState.getBlock())); - //?} elif >=1.19.4 { - /*block = String.valueOf(BuiltInRegistries.BLOCK.getKey(blockState.getBlock())); - *///?} + /*block = String.valueOf(Registry.BLOCK.getKey(blockState.getBlock())); + *///?} elif >=1.19.4 { + block = String.valueOf(BuiltInRegistries.BLOCK.getKey(blockState.getBlock())); + //?} } String locationTemplate = config.block.locationTemplate @@ -94,19 +88,24 @@ public static void copyBlockLocation() { .replace("%block", block) .replace("%dimension", VersionUtil.getLevel(client.player).dimension() //? if >=1.21.11 { - /*.identifier() - *///?} else { - .location() - //?} + .identifier() + //?} else { + /*.location() + *///?} .toString() ); + handleLocation(config.block.copyMessage, config.block.copyMessageClipboard, locationTemplate, sendInChat); + } + + private static void handleLocation(String copyMessage, String clipboardMessage, String location, boolean sendInChat) { + Minecraft client = Minecraft.getInstance(); if(sendInChat) { - client.gui.getChat().addMessage(VersionUtil.getTranslatableText(config.block.copyMessage.replaceAll("&", "§"))); - client.gui.getChat().addMessage(VersionUtil.getTranslatableText(locationTemplate)); + VersionUtil.sendChatMessage(VersionUtil.getTranslatableText(copyMessage.replace("&", "§"))); + VersionUtil.sendChatMessage(VersionUtil.getTranslatableText(location)); } else { - client.gui.getChat().addMessage(VersionUtil.getTranslatableText(config.block.copyMessageClipboard.replaceAll("&", "§"))); - client.keyboardHandler.setClipboard(locationTemplate); + VersionUtil.sendChatMessage(VersionUtil.getTranslatableText(clipboardMessage.replace("&", "§"))); + client.keyboardHandler.setClipboard(location); } } } diff --git a/src/main/java/net/notcoded/xyzcopy/util/VersionUtil.java b/src/main/java/net/notcoded/xyzcopy/util/VersionUtil.java index 56ebae4..338e359 100644 --- a/src/main/java/net/notcoded/xyzcopy/util/VersionUtil.java +++ b/src/main/java/net/notcoded/xyzcopy/util/VersionUtil.java @@ -5,39 +5,50 @@ import net.minecraft.world.level.Level; //? if <1.19 { -import net.minecraft.network.chat.TranslatableComponent; -//?} +/*import net.minecraft.network.chat.TranslatableComponent; +*///?} public class VersionUtil { + + public static void sendChatMessage(Component message) { + net.minecraft.client.Minecraft client = net.minecraft.client.Minecraft.getInstance(); + //? if >=26.2 { + /*client.gui.chatListener().handleSystemMessage(message, false); + *///?} elif >=26.1 { + client.getChatListener().handleSystemMessage(message, false); + //?} else { + /*client.gui.getChat().addMessage(message); + *///?} + } public static float getYRot(LocalPlayer player) { //? if 1.16.5 { - return player.yRot; - //?} elif >1.16.5 { - /*return player.getYRot(); - *///?} + /*return player.yRot; + *///?} elif >1.16.5 { + return player.getYRot(); + //?} } public static float getXRot(LocalPlayer player) { //? if 1.16.5 { - return player.xRot; - //?} elif >1.16.5 { - /*return player.getXRot(); - *///?} + /*return player.xRot; + *///?} elif >1.16.5 { + return player.getXRot(); + //?} } public static Level getLevel(LocalPlayer player) { //? if >=1.20 { - /*return player.level(); - *///?} elif <1.20 { - return player.level; - //?} + return player.level(); + //?} elif <1.20 { + /*return player.level; + *///?} } public static Component getTranslatableText(String key) { //? if >=1.19 { - /*return Component.translatable(key); - *///?} elif <1.19 { - return new TranslatableComponent(key); - //?} + return Component.translatable(key); + //?} elif <1.19 { + /*return new TranslatableComponent(key); + *///?} } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index b2c16f3..785ad32 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -38,6 +38,6 @@ }, "recommends": { "modmenu": "*", - "fabric-key-binding-api-v1": "*" + "${keyBindingApi}": "*" } -} \ No newline at end of file +} diff --git a/src/main/resources/xyzcopy.accesswidener b/src/main/resources/xyzcopy.accesswidener deleted file mode 100644 index f9cb8ba..0000000 --- a/src/main/resources/xyzcopy.accesswidener +++ /dev/null @@ -1,2 +0,0 @@ -accessWidener v1 named -accessible field net/minecraft/client/KeyMapping key Lcom/mojang/blaze3d/platform/InputConstants$Key; \ No newline at end of file diff --git a/src/main/resources/xyzcopy.mixins.json b/src/main/resources/xyzcopy.mixins.json index 64dda16..abb8dc6 100644 --- a/src/main/resources/xyzcopy.mixins.json +++ b/src/main/resources/xyzcopy.mixins.json @@ -2,10 +2,11 @@ "required": true, "minVersion": "0.8", "package": "net.notcoded.xyzcopy.mixin", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "${java}", "client": [ "KeyboardHandlerMixin", - "MinecraftMixin" + "MinecraftMixin", + "KeyMappingAccessor" ], "injectors": { "defaultRequire": 1 diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index dabcf3f..dd45599 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -1,49 +1,31 @@ plugins { id("dev.kikugie.stonecutter") - id("dev.architectury.loom") version "1.14-SNAPSHOT" apply false - id("architectury-plugin") version "3.5-SNAPSHOT" apply false - id("com.gradleup.shadow") version "9.4.1" apply false - id("me.modmuss50.mod-publish-plugin") version "1.1.0" apply false + alias(libs.plugins.architectury.loom).apply(false) + alias(libs.plugins.architectury.loom.no.remap).apply(false) } -stonecutter active "1.16.5-fabric" /* [SC] DO NOT EDIT */ -// Builds every version into `build/libs/{mod.version}/{loader}` -stonecutter registerChiseled tasks.register("chiseledBuild", stonecutter.chiseled) { - group = "project" - ofTask("buildAndCollect") -} -stonecutter registerChiseled tasks.register("chiseledPublishMods", stonecutter.chiseled) { - group = "project" - ofTask("publishMods") -} -stonecutter registerChiseled tasks.register("chiseledRunAllClients", stonecutter.chiseled) { - group = "project" - ofTask("runClient") -} +stonecutter active file(".sc_active_version") +stonecutter parameters { + val (version, loader) = current.project.split('-', limit = 2) + properties { + tags(version, loader) + } -// Builds loader-specific versions into `build/libs/{mod.version}/{loader}` -for (it in stonecutter.tree.branches) { - if (it.id.isEmpty()) continue - val loader = it.id.upperCaseFirst() - stonecutter registerChiseled tasks.register("chiseledBuild$loader", stonecutter.chiseled) { - group = "project" - versions { branch, _ -> branch == it.id } - ofTask("buildAndCollect") + constants { + match(loader, "fabric", "forge", "neoforge") } } -/* -// Runs active versions for each loader -for (it in stonecutter.tree.nodes) { - if (it.metadata != stonecutter.current || it.branch.id.isEmpty()) continue - val types = listOf("Client", "Server") - val loader = it.branch.id.upperCaseFirst() - for (type in types) it.tasks.register("runActive$type$loader") { - group = "project" - dependsOn("run$type") - } +// there is no chiseledBuild task anymore +tasks.register("chiseledBuild") { + group = "project" + dependsOn(stonecutter.tasks.named("buildAndCollect").map { it.values }) } - */ +// Runs as a Dry run unless -PpublishRelease is specified +tasks.register("chiseledPublish") { + group = "publishing" + dependsOn(stonecutter.tasks.named("publishMods").map { it.values }) +} diff --git a/stonecutter.properties.toml b/stonecutter.properties.toml new file mode 100644 index 0000000..1bc4158 --- /dev/null +++ b/stonecutter.properties.toml @@ -0,0 +1,204 @@ +mod.id = "xyzcopy" +mod.name = "XYZ Copy" +mod.group = "net.notcoded" +mod.version = "1.0.1" + +deps.fabric_loader = "0.18.6" + +[fabric."1.16.5"] +mod.version_name = "1.16.x" +mod.mc_compat = "1.16.x" +mod.mc_releases = ["1.16", "1.16.1", "1.16.2", "1.16.3", "1.16.4", "1.16.5"] +deps.cloth_config = "4.17.101" +deps.mod_menu = "1.16.23" +deps.fabric_api = "0.42.0+1.16" + +[fabric."1.17.1"] +mod.version_name = "1.17-1.18.2" +mod.mc_compat = ">=1.17- <=1.18.2" +mod.mc_releases = ["1.17", "1.17.1", "1.18", "1.18.1", "1.18.2"] +deps.cloth_config = "5.3.63" +deps.mod_menu = "2.0.17" +deps.fabric_api = "0.46.1+1.17" + +[fabric."1.19"] +mod.version_name = "1.19-1.19.2" +mod.mc_compat = ">=1.19- <=1.19.2" +mod.mc_releases = ["1.19", "1.19.1", "1.19.2"] +deps.cloth_config = "8.3.134" +deps.mod_menu = "4.0.0" +deps.fabric_api = "0.58.0+1.19" + +[fabric."1.19.4"] +mod.version_name = "1.19.3-1.19.4" +mod.mc_compat = ">=1.19.3- <=1.19.4" +mod.mc_releases = ["1.19.3", "1.19.4"] +deps.cloth_config = "9.0.94" +deps.mod_menu = "5.1.0" +deps.fabric_api = "0.87.2+1.19.4" + +[fabric."1.20.1"] +mod.version_name = "1.20-1.21.8" +mod.mc_compat = ">=1.20- <=1.21.8" +mod.mc_releases = ["1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5", "1.20.6", "1.21", "1.21.1", "1.21.2", "1.21.3", "1.21.4", "1.21.5", "1.21.6", "1.21.7", "1.21.8"] +deps.cloth_config = "9.0.94" +deps.mod_menu = "5.1.0" +deps.fabric_api = "0.92.9+1.20.1" + +[fabric."1.21.9"] +mod.version_name = "1.21.9-1.21.10" +mod.mc_compat = ">=1.21.9- <=1.21.10" +mod.mc_releases = ["1.21.9", "1.21.10"] +deps.cloth_config = "17.0.144" +deps.mod_menu = "16.0.0" +deps.fabric_api = "0.134.1+1.21.9" + +[fabric."1.21.11"] +mod.version_name = "1.21.11" +mod.mc_compat = ">=1.21.11- <26.1" +mod.mc_releases = ["1.21.11"] +deps.cloth_config = "17.0.144" +deps.mod_menu = "16.0.0" +deps.fabric_api = "0.141.4+1.21.11" + +[fabric."26.1"] +mod.version_name = "26.1" +mod.mc_compat = ">=26.1- <26.2" +mod.mc_releases = ["26.1", "26.1.1", "26.1.2"] +deps.cloth_config = "26.1.154" +deps.mod_menu = "18.0.0-alpha.8" +deps.fabric_api = "0.145.1+26.1" + +[fabric."26.2"] +mod.version_name = "26.2" +mod.mc_compat = ">=26.2" +mod.mc_releases = ["26.2"] +deps.cloth_config = "26.2.155" +deps.mod_menu = "20.0.1" +deps.fabric_api = "0.155.2+26.2" + +[forge."1.16.5"] +mod.version_name = "1.16.x" +mod.mc_compat = "[1.16, 1.16.5]" +mod.mc_releases = ["1.16", "1.16.1", "1.16.2", "1.16.3", "1.16.4", "1.16.5"] +deps.cloth_config = "4.17.101" +deps.forge_loader = "36.2.34" + +[forge."1.17.1"] +mod.version_name = "1.17.x" +mod.mc_compat = "[1.17, 1.17.1]" +mod.mc_releases = ["1.17", "1.17.1"] +deps.cloth_config = "5.3.63" +deps.forge_loader = "37.1.1" + +[forge."1.18.2"] +mod.version_name = "1.18.x" +mod.mc_compat = "[1.18, 1.18.2]" +mod.mc_releases = ["1.18", "1.18.1", "1.18.2"] +deps.cloth_config = "6.5.102" +deps.forge_loader = "40.3.0" + +[forge."1.19"] +mod.version_name = "1.19-1.19.2" +mod.mc_compat = "[1.19, 1.19.1, 1.19.2]" +mod.mc_releases = ["1.19", "1.19.1", "1.19.2"] +deps.cloth_config = "8.3.134" +deps.forge_loader = "41.1.0" + +[forge."1.19.4"] +mod.version_name = "1.19.3-1.19.4" +mod.mc_compat = "[1.19.3, 1.19.4]" +mod.mc_releases = ["1.19.3", "1.19.4"] +deps.cloth_config = "9.0.94" +deps.forge_loader = "45.4.0" + +[forge."1.20.1"] +mod.version_name = "1.20-1.20.4" +mod.mc_compat = "[1.20, 1.20.4]" +mod.mc_releases = ["1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4"] +deps.cloth_config = "11.1.136" +deps.forge_loader = "47.3.0" + +[forge."1.20.6"] +mod.version_name = "1.20.5-1.21.5" +mod.mc_compat = "[1.20.5, 1.21.5]" +mod.mc_releases = ["1.20.5", "1.20.6", "1.21", "1.21.1", "1.21.2", "1.21.3", "1.21.4", "1.21.5"] +deps.cloth_config = "14.0.139" +deps.forge_loader = "50.2.0" + +[forge."1.21.6"] +mod.version_name = "1.21.6-1.21.8" +mod.mc_compat = "[1.21.6, 1.21.8]" +mod.mc_releases = ["1.21.6", "1.21.7", "1.21.8"] +deps.cloth_config = "17.0.144" +deps.forge_loader = "56.0.2" + +[forge."1.21.9"] +mod.version_name = "1.21.9-1.21.10" +mod.mc_compat = "[1.21.9, 1.21.10]" +mod.mc_releases = ["1.21.9", "1.21.10"] +deps.cloth_config = "17.0.144" +deps.forge_loader = "59.0.5" + +[forge."1.21.11"] +mod.version_name = "1.21.11" +mod.mc_compat = "[1.21.11]" +mod.mc_releases = ["1.21.11"] +deps.cloth_config = "17.0.144" +deps.forge_loader = "61.1.0" + +[forge."26.1"] +mod.version_name = "26.1" +mod.mc_compat = "[26.1, 26.1.2]" +mod.mc_releases = ["26.1", "26.1.1", "26.1.2"] +deps.cloth_config = "26.1.154" +deps.forge_loader = "62.0.9" + +[forge."26.2"] +mod.version_name = "26.2" +mod.mc_compat = "[26.2,)" +mod.mc_releases = ["26.2"] +deps.cloth_config = "26.2.155" +deps.forge_loader = "65.0.5" + +[neoforge."1.20.4"] +mod.version_name = "1.20.2-1.20.4" +mod.mc_compat = "[1.20.2, 1.20.4]" +mod.mc_releases = ["1.20.2", "1.20.3", "1.20.4"] +deps.cloth_config = "13.0.138" +deps.neo_loader = "20.4.251" + +[neoforge."1.20.6"] +mod.version_name = "1.20.5-1.21.8" +mod.mc_compat = "[1.20.5, 1.21.8]" +mod.mc_releases = ["1.20.5", "1.20.6", "1.21", "1.21.1", "1.21.2", "1.21.3", "1.21.4", "1.21.5", "1.21.6", "1.21.7", "1.21.8"] +deps.cloth_config = "14.0.139" +deps.neo_loader = "20.6.125" + +[neoforge."1.21.9"] +mod.version_name = "1.21.9-1.21.10" +mod.mc_compat = "[1.21.9, 1.21.10]" +mod.mc_releases = ["1.21.9", "1.21.10"] +deps.cloth_config = "20.0.149" +deps.neo_loader = "21.9.16-beta" + +[neoforge."1.21.11"] +mod.version_name = "1.21.11" +mod.mc_compat = "[1.21.11]" +mod.mc_releases = ["1.21.11"] +deps.cloth_config = "20.0.149" +deps.neo_loader = "21.11.38-beta" + +[neoforge."26.1"] +mod.version_name = "26.1" +mod.mc_compat = "[26.1, 26.1.2]" +mod.mc_releases = ["26.1", "26.1.1", "26.1.2"] +deps.cloth_config = "26.1.154" +deps.neo_loader = "26.1.2.83" + +[neoforge."26.2"] +mod.version_name = "26.2" +mod.mc_compat = "[26.2,)" +mod.mc_releases = ["26.2"] +deps.cloth_config = "26.2.155" +deps.neo_loader = "26.2.0.25-beta" diff --git a/versions/1.16.5-fabric/gradle.properties b/versions/1.16.5-fabric/gradle.properties deleted file mode 100644 index 30f726e..0000000 --- a/versions/1.16.5-fabric/gradle.properties +++ /dev/null @@ -1,10 +0,0 @@ -mod.mc_dep=1.16.x -mod.version_name=1.16.x -mod.mc_targets=1.16,1.16.1,1.16.2,1.16.3,1.16.4,1.16.5 - -deps.cloth_config_version=4.17.101 -deps.mod_menu_version=1.16.23 - -deps.java=8 - -loom.platform=fabric \ No newline at end of file diff --git a/versions/1.16.5-forge/gradle.properties b/versions/1.16.5-forge/gradle.properties deleted file mode 100644 index b47e14a..0000000 --- a/versions/1.16.5-forge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.16, 1.16.5] -mod.version_name=1.16.x -mod.mc_targets=1.16,1.16.1,1.16.2,1.16.3,1.16.4,1.16.5 - -deps.forge_loader=36.2.34 - -deps.cloth_config_version=4.17.101 - -deps.java=8 - -loom.platform=forge \ No newline at end of file diff --git a/versions/1.17.1-fabric/gradle.properties b/versions/1.17.1-fabric/gradle.properties deleted file mode 100644 index b6e4c56..0000000 --- a/versions/1.17.1-fabric/gradle.properties +++ /dev/null @@ -1,10 +0,0 @@ -mod.mc_dep=>=1.17- <=1.18.2 -mod.version_name=1.17-1.18.2 -mod.mc_targets=1.17,1.17.1,1.18,1.18.1,1.18.2 - -deps.cloth_config_version=5.3.63 -deps.mod_menu_version=2.0.17 - -deps.java=8 - -loom.platform=fabric \ No newline at end of file diff --git a/versions/1.17.1-forge/gradle.properties b/versions/1.17.1-forge/gradle.properties deleted file mode 100644 index 25f4d00..0000000 --- a/versions/1.17.1-forge/gradle.properties +++ /dev/null @@ -1,12 +0,0 @@ -mod.mc_dep=[1.17, 1.17.1] -mod.version_name=1.17.x -mod.mc_targets=1.17,1.17.1 - -deps.forge_loader=37.1.1 - -# 5.3.63 -deps.cloth_config_version=4.17.101 - -deps.java=8 - -loom.platform=forge \ No newline at end of file diff --git a/versions/1.18.2-forge/gradle.properties b/versions/1.18.2-forge/gradle.properties deleted file mode 100644 index 8d7ec5d..0000000 --- a/versions/1.18.2-forge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.18, 1.18.2] -mod.version_name=1.18.x -mod.mc_targets=1.18,1.18.1,1.18.2 - -deps.forge_loader=40.3.0 - -deps.cloth_config_version=6.5.102 - -deps.java=17 - -loom.platform=forge \ No newline at end of file diff --git a/versions/1.19-fabric/gradle.properties b/versions/1.19-fabric/gradle.properties deleted file mode 100644 index b8f9b59..0000000 --- a/versions/1.19-fabric/gradle.properties +++ /dev/null @@ -1,10 +0,0 @@ -mod.mc_dep=>=1.19- <=1.19.2 -mod.version_name=1.19-1.19.2 -mod.mc_targets=1.19,1.19.1,1.19.2 - -deps.cloth_config_version=8.3.134 -deps.mod_menu_version=4.0.0 - -deps.java=17 - -loom.platform=fabric \ No newline at end of file diff --git a/versions/1.19-forge/gradle.properties b/versions/1.19-forge/gradle.properties deleted file mode 100644 index b073a28..0000000 --- a/versions/1.19-forge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.19, 1.19.1, 1.19.2] -mod.version_name=1.19-1.19.2 -mod.mc_targets=1.19,1.19.1,1.19.2 - -deps.forge_loader=41.1.0 - -deps.cloth_config_version=8.3.134 - -deps.java=17 - -loom.platform=forge \ No newline at end of file diff --git a/versions/1.19.4-fabric/gradle.properties b/versions/1.19.4-fabric/gradle.properties deleted file mode 100644 index b1431f1..0000000 --- a/versions/1.19.4-fabric/gradle.properties +++ /dev/null @@ -1,10 +0,0 @@ -mod.mc_dep=>=1.19.3- <=1.19.4 -mod.version_name=1.19.3-1.19.4 -mod.mc_targets=1.19.3,1.19.4 - -deps.cloth_config_version=9.0.94 -deps.mod_menu_version=5.1.0 - -deps.java=17 - -loom.platform=fabric \ No newline at end of file diff --git a/versions/1.19.4-forge/gradle.properties b/versions/1.19.4-forge/gradle.properties deleted file mode 100644 index 5e5502a..0000000 --- a/versions/1.19.4-forge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.19.3, 1.19.4] -mod.version_name=1.19.3-1.19.4 -mod.mc_targets=1.19.3,1.19.4 - -deps.forge_loader=45.4.0 - -deps.cloth_config_version=8.3.134 - -deps.java=17 - -loom.platform=forge \ No newline at end of file diff --git a/versions/1.20.1-fabric/gradle.properties b/versions/1.20.1-fabric/gradle.properties deleted file mode 100644 index 43b0c73..0000000 --- a/versions/1.20.1-fabric/gradle.properties +++ /dev/null @@ -1,10 +0,0 @@ -mod.mc_dep=>=1.20- <=1.21.8 -mod.version_name=1.20-1.21.8 -mod.mc_targets=1.20,1.20.1,1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8 - -deps.cloth_config_version=9.0.94 -deps.mod_menu_version=5.1.0 - -deps.java=17 - -loom.platform=fabric \ No newline at end of file diff --git a/versions/1.20.1-forge/gradle.properties b/versions/1.20.1-forge/gradle.properties deleted file mode 100644 index b1e8b24..0000000 --- a/versions/1.20.1-forge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.20, 1.20.4] -mod.version_name=1.20-1.20.4 -mod.mc_targets=1.20,1.20.1,1.20.2,1.20.3,1.20.4 - -deps.forge_loader=47.3.0 - -deps.cloth_config_version=11.1.136 - -deps.java=17 - -loom.platform=forge \ No newline at end of file diff --git a/versions/1.20.4-neoforge/gradle.properties b/versions/1.20.4-neoforge/gradle.properties deleted file mode 100644 index f1b6eb0..0000000 --- a/versions/1.20.4-neoforge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.20.2, 1.20.4] -mod.version_name=1.20.2-1.20.4 -mod.mc_targets=1.20.2,1.20.3,1.20.4 - -deps.neoforge_loader=20.4.237 - -deps.cloth_config_version=13.0.138 - -deps.java=17 - -loom.platform=neoforge \ No newline at end of file diff --git a/versions/1.20.6-forge/gradle.properties b/versions/1.20.6-forge/gradle.properties deleted file mode 100644 index 9691714..0000000 --- a/versions/1.20.6-forge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.20.5, 1.21.5] -mod.version_name=1.20.5-1.21.5 -mod.mc_targets=1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5 - -deps.forge_loader=50.2.0 - -deps.cloth_config_version=14.0.139 - -deps.java=17 - -loom.platform=forge \ No newline at end of file diff --git a/versions/1.20.6-neoforge/gradle.properties b/versions/1.20.6-neoforge/gradle.properties deleted file mode 100644 index b17e6cc..0000000 --- a/versions/1.20.6-neoforge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.20.5, 1.21.8] -mod.version_name=1.20.5-1.21.8 -mod.mc_targets=1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8 - -deps.neoforge_loader=20.6.125 - -deps.cloth_config_version=14.0.139 - -deps.java=21 - -loom.platform=neoforge diff --git a/versions/1.21.11-fabric/gradle.properties b/versions/1.21.11-fabric/gradle.properties deleted file mode 100644 index e011017..0000000 --- a/versions/1.21.11-fabric/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=>=1.21.11- <26.1 -# https://www.minecraft.net/en-us/article/minecraft-new-version-numbering-system -mod.version_name=1.21.11 -mod.mc_targets=1.21.11 - -deps.cloth_config_version=17.0.144 -deps.mod_menu_version=16.0.0 - -deps.java=17 - -loom.platform=fabric \ No newline at end of file diff --git a/versions/1.21.11-forge/gradle.properties b/versions/1.21.11-forge/gradle.properties deleted file mode 100644 index 3cc2b91..0000000 --- a/versions/1.21.11-forge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.21.11,) -mod.version_name=1.21.11 -mod.mc_targets=1.21.11 - -deps.forge_loader=61.1.0 - -deps.cloth_config_version=17.0.144 - -deps.java=17 - -loom.platform=forge \ No newline at end of file diff --git a/versions/1.21.11-neoforge/gradle.properties b/versions/1.21.11-neoforge/gradle.properties deleted file mode 100644 index 1271ca4..0000000 --- a/versions/1.21.11-neoforge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.21.11,) -mod.version_name=1.21.11 -mod.mc_targets=1.21.11 - -deps.neoforge_loader=21.11.38-beta - -deps.cloth_config_version=20.0.149 - -deps.java=21 - -loom.platform=neoforge diff --git a/versions/1.21.6-forge/gradle.properties b/versions/1.21.6-forge/gradle.properties deleted file mode 100644 index 1140417..0000000 --- a/versions/1.21.6-forge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.21.6, 1.21.8] -mod.version_name=1.21.6-1.21.8 -mod.mc_targets=1.21.6,1.21.7,1.21.8 - -deps.forge_loader=56.0.2 - -deps.cloth_config_version=17.0.144 - -deps.java=17 - -loom.platform=forge \ No newline at end of file diff --git a/versions/1.21.9-fabric/gradle.properties b/versions/1.21.9-fabric/gradle.properties deleted file mode 100644 index 3de815c..0000000 --- a/versions/1.21.9-fabric/gradle.properties +++ /dev/null @@ -1,10 +0,0 @@ -mod.mc_dep=>=1.21.9- <=1.21.10 -mod.version_name=1.21.9-1.21.10 -mod.mc_targets=1.21.9,1.21.10 - -deps.cloth_config_version=17.0.144 -deps.mod_menu_version=16.0.0 - -deps.java=17 - -loom.platform=fabric \ No newline at end of file diff --git a/versions/1.21.9-forge/gradle.properties b/versions/1.21.9-forge/gradle.properties deleted file mode 100644 index 3aee65b..0000000 --- a/versions/1.21.9-forge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.21.9, 1.21.10] -mod.version_name=1.21.9-1.21.10 -mod.mc_targets=1.21.9,1.21.10 - -deps.forge_loader=59.0.5 - -deps.cloth_config_version=17.0.144 - -deps.java=17 - -loom.platform=forge \ No newline at end of file diff --git a/versions/1.21.9-neoforge/gradle.properties b/versions/1.21.9-neoforge/gradle.properties deleted file mode 100644 index f6c3360..0000000 --- a/versions/1.21.9-neoforge/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -mod.mc_dep=[1.21.9, 1.21.10] -mod.version_name=1.21.9-1.21.10 -mod.mc_targets=1.21.9,1.21.10 - -deps.neoforge_loader=21.9.16-beta - -deps.cloth_config_version=20.0.149 - -deps.java=21 - -loom.platform=neoforge diff --git a/versions/26.1-fabric/gradle.properties b/versions/26.1-fabric/gradle.properties deleted file mode 100644 index 42e15e6..0000000 --- a/versions/26.1-fabric/gradle.properties +++ /dev/null @@ -1,10 +0,0 @@ -mod.mc_dep=>=26.1 -mod.version_name=26.1 -mod.mc_targets=26.1 - -deps.cloth_config_version=26.1.154 -deps.mod_menu_version=18.0.0-alpha.8 - -deps.java=25 - -loom.platform=fabric \ No newline at end of file