From 48cdcf8b4bfbe67dfdabe423227965ab5785fd89 Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Fri, 18 Sep 2026 10:34:59 +0100 Subject: [PATCH 1/2] Backport IronAgeFurniture to NeoForge 1.20.1 --- .github/workflows/ci.yml | 24 +-- .github/workflows/codeql-analysis.yml | 6 +- .github/workflows/validate-gradle-build.yml | 4 +- CHANGELOG.md | 22 ++- README.md | 31 ++-- build.gradle | 109 +++++++++---- ci-fixtures/tools/README.md | 20 ++- ...craft-mavenizer-0.5.21-orespawn-compat.jar | Bin 2567353 -> 2567563 bytes ...aft-mavenizer-0.5.21-orespawn-compat.patch | 154 ++++++++++++++++-- .../tools/minecraft-source-compatibility.json | 2 +- docs/OPTIONAL-INTEGRATION-TEST.md | 34 +++- docs/VERSIONS.md | 2 +- gradle.properties | 14 +- gradle/furniture-catalog.gradle | 31 +++- .../optional-integration-mods.json | 32 ++-- .../mc/ironagefurniture/Ironagefurniture.java | 8 +- src/main/resources/META-INF/mods.toml | 4 +- .../OptionalIntegrationRecipeProbe.java | 8 +- .../resources/META-INF/mods.toml | 8 +- 19 files changed, 373 insertions(+), 140 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 433d69cbc2..17aae2e44a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,24 +1,24 @@ -name: IronAgeFurniture 1.20.1 CI +name: IronAgeFurniture NeoForge 1.20.1 CI on: push: branches: - - master-1.20.1 + - master-1.20.1-neo - 'feature/**' pull_request: branches: - - master-1.20.1 + - master-1.20.1-neo permissions: contents: read concurrency: - group: iron-age-furniture-1.19-${{ github.workflow }}-${{ github.ref }} + group: iron-age-furniture-1.20.1-neoforge-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: cold-forge-bootstrap: - name: Cold Forge bootstrap + name: Cold early-NeoForge bootstrap runs-on: ubuntu-latest timeout-minutes: 60 @@ -44,7 +44,7 @@ jobs: distribution: temurin java-version: '17.0.1+12' - - name: Bootstrap Forge from an empty cache + - name: Bootstrap early NeoForge from an empty cache shell: bash env: GRADLE_USER_HOME: ${{ runner.temp }}/iron-age-furniture-cold-gradle @@ -62,7 +62,7 @@ jobs: | tee "$RUNNER_TEMP/cold-forge-bootstrap.log" grep -F "OreSpawn Mavenizer compatibility runtime: Java 25.0.3" \ "$RUNNER_TEMP/cold-forge-bootstrap.log" - grep -F "OreSpawn Mavenizer compatibility: applied 8 rule(s) for net.minecraftforge:forge:1.20.1-47.4.10" \ + grep -F "OreSpawn Mavenizer compatibility: applied 8 rule(s) for net.neoforged:forge:1.20.1-47.1.106" \ "$RUNNER_TEMP/cold-forge-bootstrap.log" find "$GRADLE_USER_HOME" .gradle/mavenizer \ -name '*.orespawn-compatibility' -type f -print0 \ @@ -135,13 +135,13 @@ jobs: - name: Upload audited release candidate uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: iron-age-furniture-1.20.1-${{ github.sha }} + name: iron-age-furniture-1.20.1-neoforge-${{ github.sha }} if-no-files-found: error retention-days: 30 path: | - build/libs/iron-age-furniture-0.3.0.120011.jar - build/libs/iron-age-furniture-0.3.0.120011-sources.jar - build/libs/iron-age-furniture-0.3.0.120011-javadoc.jar + build/libs/iron-age-furniture-0.3.0.120012.jar + build/libs/iron-age-furniture-0.3.0.120012-sources.jar + build/libs/iron-age-furniture-0.3.0.120012-javadoc.jar build/release/SHA256SUMS CHANGELOG.md @@ -149,7 +149,7 @@ jobs: if: failure() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: iron-age-furniture-1.20.1-diagnostics-${{ github.sha }} + name: iron-age-furniture-1.20.1-neoforge-diagnostics-${{ github.sha }} if-no-files-found: ignore retention-days: 14 path: | diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c70c1f7050..aa657cb5c0 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -3,11 +3,11 @@ name: CodeQL on: push: branches: - - master-1.20.1 + - master-1.20.1-neo - 'feature/**' pull_request: branches: - - master-1.20.1 + - master-1.20.1-neo schedule: - cron: '43 7 * * 4' @@ -69,7 +69,7 @@ jobs: echo "CodeQL compilation failed after $attempt attempts." >&2 exit 1 fi - echo "::warning::CodeQL compilation attempt $attempt failed; retrying with the preserved Forge cache." + echo "::warning::CodeQL compilation attempt $attempt failed; retrying with the preserved early-NeoForge ForgeGradle cache." done - name: Analyze diff --git a/.github/workflows/validate-gradle-build.yml b/.github/workflows/validate-gradle-build.yml index 63abc33fb6..79f330f69a 100644 --- a/.github/workflows/validate-gradle-build.yml +++ b/.github/workflows/validate-gradle-build.yml @@ -3,11 +3,11 @@ name: Validate Gradle Wrapper on: push: branches: - - master-1.20.1 + - master-1.20.1-neo - 'feature/**' pull_request: branches: - - master-1.20.1 + - master-1.20.1-neo permissions: contents: read diff --git a/CHANGELOG.md b/CHANGELOG.md index 3362cc1ef0..162c944f89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,18 @@ -# IronAgeFurniture 0.3.0.120011 +# IronAgeFurniture 0.3.0.120012 -First IronAgeFurniture release for Minecraft 1.20.1 and Forge 47.4.10. +First IronAgeFurniture release for Minecraft 1.20.1 and early NeoForge. It is +built against NeoForge 47.1.106 and supports the 47.1.99+ 47.x line. ## Player-visible changes - Add furniture for the vanilla mangrove, cherry, and bamboo wood families. -- Support the Biomes O' Plenty wood set shared by its compatible 1.20.1 - releases, and conditionally add Empyreal, Maple, and Pine furniture when BOP - 19.0.0.96 or newer is installed, without imposing a minimum BOP version. +- Support the complete Biomes O' Plenty 18.0.0.598 wood set. BOP 19.0.0.96 and + its GlitchCore dependency require Forge 47.3+ and cannot start on early + NeoForge 47.1, so its extra Empyreal, Maple, and Pine tier is not advertised + for this branch. - Replace the retired Oh The Biomes You'll Go integration with Oh The Biomes - We've Gone furniture, while retaining Immersive Engineering treated-wood + We've Gone furniture using BWG 1.5.11, the newest 1.20.1 build explicitly + published for NeoForge, while retaining Immersive Engineering treated-wood furniture. - Remap IronAgeFurniture's former Biomes O' Plenty cherry furniture to vanilla cherry. On installations with BWG, remap supported BYG furniture names to @@ -37,7 +40,7 @@ First IronAgeFurniture release for Minecraft 1.20.1 and Forge 47.4.10. resource, configuration, entity, NBT, and saved-world identities. - Keep the supported Java API namespace at `zone.moddev.mc.ironagefurniture`. The Maven coordinate is - `zone.moddev.mc:iron-age-furniture:0.3.0.120011`. + `zone.moddev.mc:iron-age-furniture:0.3.0.120012`. - Add a deterministic, checked-in furniture catalog covering registrations, blockstates, models, recipes, advancements, and translations. - Resolve each generated optional wood model to that wood's actual texture @@ -45,7 +48,10 @@ First IronAgeFurniture release for Minecraft 1.20.1 and Forge 47.4.10. treated-wood paths. - Verify the supported optional integrations with pinned positive-path runtime probes while keeping their test fixtures out of release artifacts. -- Build with ForgeGradle 7.0.34, Gradle 9.6.1, and pinned Java toolchains. +- Build the early-NeoForge `net.neoforged:forge` artifact with ForgeGradle + 7.0.34, Gradle 9.6.1, and pinned Java toolchains. +- Preserve the loader's Forge-era Java API, `mods.toml`, and `forge:*` + conditional-data contracts while publishing this target as NeoForge. - Produce deterministic main, sources, and Javadoc jars with SHA-256 checksums. - Provide reproducible Eclipse/Buildship setup and guarded CI, validation, and release workflows. diff --git a/README.md b/README.md index 1ae094875a..984ed5795a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![Discord](https://img.shields.io/badge/Discord-MMD-green.svg?style=flat&logo=Discord)](https://discord.moddev.zone) [![CurseForge](https://img.shields.io/badge/CurseForge-Iron%20Age%20Furniture-orange.svg)](https://www.curseforge.com/minecraft/mc-mods/iron-age-furniture) -[![Build, test, and audit](https://github.com/MinecraftModDevelopmentMods/IronAgeFurniture/actions/workflows/ci.yml/badge.svg?branch=master-1.20.1)](https://github.com/MinecraftModDevelopmentMods/IronAgeFurniture/actions/workflows/ci.yml?query=branch%3Amaster-1.20.1) +[![Build, test, and audit](https://github.com/MinecraftModDevelopmentMods/IronAgeFurniture/actions/workflows/ci.yml/badge.svg?branch=master-1.20.1-neo)](https://github.com/MinecraftModDevelopmentMods/IronAgeFurniture/actions/workflows/ci.yml?query=branch%3Amaster-1.20.1-neo) # IronAgeFurniture @@ -9,9 +9,14 @@ olde-style furniture to Minecraft. Seating is functional, furniture supports the appropriate vanilla and optional-mod materials, and lighting includes falling and throwable lava lamps. -This branch provides IronAgeFurniture `0.3.0.120011` for Minecraft 1.20.1 and -Forge 47.4.10. It requires Java 17 and can be installed on both clients and -dedicated servers. +This branch provides IronAgeFurniture `0.3.0.120012` for Minecraft 1.20.1 and +early NeoForge 47.1.99 or newer in the 47.x line. It is built against NeoForge +47.1.106, requires Java 17, and can be installed on both clients and dedicated +servers. + +NeoForge 1.20.1 retained the Forge-era Java API, `mods.toml`, `forge:*` data +conditions, and ForgeGradle user-development contract. Those names are +therefore intentional on this branch and do not indicate a Forge loader build. ## Optional integrations @@ -25,11 +30,15 @@ installed: They are optional. Their recipes and recipe advancements are conditionally loaded, so a normal installation does not need any of them. -Biomes O' Plenty 18 and 19 both receive furniture for their shared wood set. -When BOP 19.0.0.96 or newer is detected, IronAgeFurniture additionally enables -Empyreal, Maple, and Pine furniture. This does not impose a minimum BOP version. -Back up a world before downgrading from BOP 19 to BOP 18: those three source -woods, and furniture made from them, are not available in BOP 18. +The positive-path compatibility set pins BWG 1.5.11, the newest published +1.20.1 build explicitly marked for NeoForge. Later Forge-only BWG releases +require Forge 47.4+ and are not compatible with this early NeoForge line. + +The tested Biomes O' Plenty target is 18.0.0.598, which receives furniture for +its complete 1.20.1 wood set. BOP 19.0.0.96 was also inspected, but it and its +GlitchCore dependency require Forge 47.3+ and cannot start on the early +NeoForge 47.1 line. Its Empyreal, Maple, and Pine tier is therefore not +advertised as supported by this branch. ## Compatibility @@ -42,7 +51,7 @@ migration. The supported Java source namespace is `zone.moddev.mc.ironagefurniture`. The Maven coordinate is -`zone.moddev.mc:iron-age-furniture:0.3.0.120011`. +`zone.moddev.mc:iron-age-furniture:0.3.0.120012`. See [CHANGELOG.md](CHANGELOG.md) for the release notes and [docs/VERSIONS.md](docs/VERSIONS.md) for the versioning scheme. Bugs can be @@ -60,7 +69,7 @@ gradlew.bat clean check build javadoc verifyReleaseArtifacts verifyReleaseChecks ``` Before importing the nested project into its Eclipse workspace, generate the -reproducible Buildship metadata and Forge launch profiles with: +reproducible Buildship metadata and early-NeoForge launch profiles with: ```text gradlew.bat prepareEclipse verifyEclipseProductionClasspath diff --git a/build.gradle b/build.gradle index 47c0b37076..f2d23795af 100644 --- a/build.gradle +++ b/build.gradle @@ -40,15 +40,15 @@ def mavenizerLicense = mavenizerToolsDirectory.file('LICENSE-MAVENIZER.txt') def mavenizerReadme = mavenizerToolsDirectory.file('README.md') def mavenizerFixtureChecksums = [ (mavenizerCompatibilityJar.asFile): - '416DCA4797BC55826F0DDCF03FDC405F1990FC15C2133FA27A1F143BF7976177', + 'F4DB44F64C98F6401ED3A856ECEBCC5E1C2126E7C02BD1237FAB38793B4AF275', (mavenizerRuleManifest.asFile): - '8945511DFF53B8F1A91EE44B14AF9EC7DB34C373617EA37A608C6958BFEEB22E', + '351746200B44A4B9656C9AD5888DA3371E69AA601880FECA048C0131223DCCAC', (mavenizerSourcePatch.asFile): - 'D856190DEF5574716C5E4F4379912C451B1F5952B0B111576651A98EECF58544', + '0AC522C64FEBA87C14792364D86FE1487E064681C54629F747E7DC80E8A83650', (mavenizerLicense.asFile): '20C17D8B8C48A600800DFD14F95D5CB9FF47066A9641DDEAB48DC54AEC96E331', (mavenizerReadme.asFile): - '177C1DDEDEF9704B9FDC8EA24B8DCDF4DDCC826DD0E253E7872A00DB2EA34518' + '2F95F09D20EABE8A7010EA68FF04FB770FC5E2F4F6A3856D1495AF0B1AAB676B' ] [mavenizerCompatibilityJar.asFile, mavenizerRuleManifest.asFile].each { fixture -> @@ -239,7 +239,7 @@ sourceSets.main.resources.srcDir 'src/generated/resources' def developmentModOutput = layout.buildDirectory.dir('forge-run-mod-classes/main') def prepareDevelopmentMod = tasks.register('prepareDevelopmentMod', Sync) { group = 'ide' - description = 'Merges production classes and resources for Forge 47 development discovery.' + description = 'Merges production classes and resources for early NeoForge 47 development discovery.' dependsOn tasks.named('classes') from sourceSets.main.output.classesDirs from sourceSets.main.output.resourcesDir @@ -261,6 +261,10 @@ tasks.withType(JavaExec).configureEach { JavaExec runTask -> repositories { minecraft.mavenizer(it) + maven { + name = 'NeoForge' + url = 'https://maven.neoforged.net/releases' + } maven fg.forgeMaven maven fg.minecraftLibsMaven mavenCentral() @@ -268,7 +272,7 @@ repositories { dependencies { implementation minecraft.dependency( - "net.minecraftforge:forge:${project.minecraft_version}-${project.forge_version}") + "net.neoforged:forge:${project.minecraft_version}-${project.neo_version}") } renamer.mappings.from minecraft.dependency.toSrgFile @@ -279,6 +283,7 @@ tasks.withType(Test).configureEach { def optionalIntegrationManifestFile = layout.projectDirectory.file( 'gradle/verification/optional-integration-mods.json') +def optionalIntegrationRuntimeTotals = [recipes: '1380', advancements: '1364'] def optionalIntegrationRunDirectory = layout.projectDirectory.dir('run-optional-integrations') def optionalIntegrationServerDirectory = providers.gradleProperty('optionalIntegrationServerDir') .map { project.file(it) } @@ -297,7 +302,7 @@ tasks.register('verifyOptionalIntegrationMods') { doLast { Map manifest = new JsonSlurper().parse(optionalIntegrationManifestFile.asFile) as Map if (manifest.minecraft != project.minecraft_version.toString() - || !(manifest.mods instanceof List) || manifest.mods.size() != 8) { + || !(manifest.mods instanceof List) || manifest.mods.size() != 7) { throw new GradleException('Optional-integration mod manifest is incomplete or targets the wrong game') } File modsDirectory = optionalIntegrationModsDirectory.get() @@ -399,7 +404,7 @@ tasks.register('generateOptionalIntegrationFixtureData') { tasks.register('compileOptionalIntegrationFixture', JavaCompile) { group = 'verification' - description = 'Compiles the test-only Forge probe for positive optional-integration validation.' + description = 'Compiles the test-only early-NeoForge probe for positive optional-integration validation.' dependsOn tasks.named('classes') source fileTree('src/optionalIntegrationTest/java') classpath = files(sourceSets.main.output, sourceSets.main.compileClasspath) @@ -452,7 +457,7 @@ tasks.register('stageOptionalIntegrationFixture', Copy) { tasks.register('runOptionalIntegrationServer', Exec) { group = 'verification' - description = 'Runs the packaged Forge server and proves all optional recipes are loaded.' + description = 'Runs the packaged NeoForge server and proves all optional recipes are loaded.' dependsOn tasks.named('stageOptionalIntegrationFixture') doFirst { File serverDirectory = optionalIntegrationServerDirectory.get() @@ -463,11 +468,11 @@ tasks.register('runOptionalIntegrationServer', Exec) { String argumentFileName = System.getProperty('os.name').toLowerCase(Locale.ROOT) .contains('windows') ? 'win_args.txt' : 'unix_args.txt' File argumentFile = new File(serverDirectory, - "libraries/net/minecraftforge/forge/${minecraft_version}-${forge_version}/" + + "libraries/net/neoforged/forge/${minecraft_version}-${neo_version}/" + argumentFileName) File userArguments = new File(serverDirectory, 'user_jvm_args.txt') if (!argumentFile.isFile() || !userArguments.isFile()) { - throw new GradleException("Install the Forge ${minecraft_version}-${forge_version} " + + throw new GradleException("Install NeoForge ${minecraft_version}-${neo_version} " + "server in ${serverDirectory} before running this test") } workingDir serverDirectory @@ -483,8 +488,8 @@ tasks.register('runOptionalIntegrationServer', Exec) { Properties result = new Properties() marker.withInputStream { result.load(it) } if (result.getProperty('status') != 'PASS' - || result.getProperty('conditional_recipes_loaded') != '1497' - || result.getProperty('conditional_advancements_loaded') != '1481') { + || result.getProperty('conditional_recipes_loaded') != optionalIntegrationRuntimeTotals.recipes + || result.getProperty('conditional_advancements_loaded') != optionalIntegrationRuntimeTotals.advancements) { throw new GradleException("Unexpected optional-integration result ${result}") } } @@ -495,8 +500,8 @@ tasks.named('processResources', ProcessResources) { def replaceProperties = [ version : project.version, minecraft_version : project.minecraft_version, - forge_version : project.forge_version, - forge_version_range : project.forge_version_range, + neo_version : project.neo_version, + neo_version_range : project.neo_version_range, loader_version_range : project.loader_version_range, mod_id : project.mod_id, mod_name : project.mod_name, @@ -532,7 +537,7 @@ def commonManifest = { 'Implementation-Vendor' : project.mod_authors, 'Maven-Artifact' : "${project.group}:${base.archivesName.get()}:${project.version}", 'Built-On-Java' : project.java_version, - 'Built-On' : "${project.minecraft_version}-${project.forge_version}" + 'Built-On' : "${project.minecraft_version}-${project.neo_version}" ]) } @@ -670,10 +675,10 @@ tasks.register('verifyMavenizerCompatibilityFixture') { } def parsed = new JsonSlurper().parse(mavenizerRuleManifest.asFile) if (parsed.schema != 1 || parsed.targets.keySet() != - ['net.minecraftforge:forge:1.20.1-47.4.10'] as Set) { + ['net.neoforged:forge:1.20.1-47.1.106'] as Set) { throw new GradleException('Mavenizer target-rule manifest has unexpected targets or schema') } - def rules = parsed.targets['net.minecraftforge:forge:1.20.1-47.4.10'] + def rules = parsed.targets['net.neoforged:forge:1.20.1-47.1.106'] if (rules.expectedApplications != 8 || rules.rules.size() != 8 || rules.rules.collect { it.id }.toSet().size() != 8) { throw new GradleException('Mavenizer target-rule manifest must define eight unique Forge 47 rules') @@ -703,6 +708,7 @@ tasks.register('verifyMavenizerCompatibilityFixture') { } if (!mavenizerReadme.asFile.getText('UTF-8').contains('Temurin `25.0.3+9`') || !mavenizerSourcePatch.asFile.getText('UTF-8').contains('SourceCompatibilityPatcher.java') + || !mavenizerSourcePatch.asFile.getText('UTF-8').contains('NEOFORGE_LEGACY_ARTIFACT') || !mavenizerLicense.asFile.getText('UTF-8').contains('GNU LESSER GENERAL PUBLIC LICENSE')) { throw new GradleException('Mavenizer provenance, patch, or license documentation is incomplete') } @@ -715,15 +721,15 @@ tasks.register('verifyReleaseConfiguration') { dependsOn tasks.named('verifyMavenizerCompatibilityFixture') doLast { Map expected = [ - mod_version : '0.3.0.120011', + mod_version : '0.3.0.120012', mod_group : 'zone.moddev.mc', mod_archive_name : 'iron-age-furniture', mod_id : 'ironagefurniture', minecraft_version : '1.20.1', - loader_name : 'forge', - loader_code : '1', - forge_version : '47.4.10', - forge_version_range : '[47.4.10,48)', + loader_name : 'neoforge', + loader_code : '2', + neo_version : '47.1.106', + neo_version_range : '[47.1.99,48)', loader_version_range : '[47,)', mcp_mappings_channel : 'official', mcp_mappings_version : '1.20.1', @@ -1017,7 +1023,7 @@ tasks.register('verifyNamespace') { tasks.register('verifyVersionMetadata') { group = 'verification' - description = 'Checks authoritative version and generated Forge metadata.' + description = 'Checks authoritative version and generated early-NeoForge metadata.' dependsOn tasks.named('processResources') doLast { String source = file( @@ -1036,7 +1042,7 @@ tasks.register('verifyVersionMetadata') { 'modId="ironagefurniture"', "version=\"${project.version}\"", 'license="LGPL-2.1"', - 'versionRange="[47.4.10,48)"', + 'versionRange="[47.1.99,48)"', 'versionRange="[1.20.1]"' ].each { required -> if (!metadata.contains(required)) { @@ -1049,6 +1055,51 @@ tasks.register('verifyVersionMetadata') { } } +tasks.register('verifyEarlyNeoForgeContract') { + group = 'verification' + description = 'Guards the Forge-era API and data contracts used by early NeoForge 1.20.1.' + dependsOn tasks.named('processResources') + doLast { + List productionSources = fileTree('src/main/java') { include '**/*.java' }.files as List + List laterApiSources = productionSources.findAll { + it.getText('UTF-8').contains('net.neoforged.') + }.collect { project.relativePath(it) } + if (!laterApiSources.isEmpty()) { + throw new GradleException("Later NeoForge Java APIs leaked into the early-loader branch: ${laterApiSources}") + } + + if (file('src/main/resources/META-INF/neoforge.mods.toml').exists()) { + throw new GradleException('Early NeoForge 1.20.1 must use META-INF/mods.toml') + } + String sourceMetadata = file('src/main/resources/META-INF/mods.toml').getText('UTF-8') + if (!sourceMetadata.contains('modId="forge"') + || !sourceMetadata.contains('versionRange="${neo_version_range}"')) { + throw new GradleException('Early NeoForge metadata must retain the Forge loader identity') + } + + List runtimeJson = fileTree('src/main/resources') { include '**/*.json' }.files as List + List laterConditionFiles = runtimeJson.findAll { + it.getText('UTF-8').contains('"neoforge:') + }.collect { project.relativePath(it) } + if (!laterConditionFiles.isEmpty()) { + throw new GradleException("Later NeoForge data conditions leaked into the early-loader branch: " + + laterConditionFiles.take(10)) + } + int forgeConditionFiles = runtimeJson.count { + String text = it.getText('UTF-8') + text.contains('"forge:mod_loaded"') || text.contains('"forge:item_exists"') + } + if (forgeConditionFiles == 0) { + throw new GradleException('Expected Forge-era optional integration conditions') + } + + String buildScript = file('build.gradle').getText('UTF-8') + if (!buildScript.contains('net.neoforged:forge:${project.minecraft_version}-${project.neo_version}')) { + throw new GradleException('Build does not declare the official early-NeoForge Maven coordinate') + } + } +} + tasks.register('verifyDedicatedServerBoundaries') { group = 'verification' description = 'Keeps common proxy code free of client-only Minecraft and Forge types.' @@ -1100,6 +1151,7 @@ tasks.register('verifyReleaseArtifacts') { dependsOn tasks.named('verifyResourceJson') dependsOn tasks.named('verifyNamespace') dependsOn tasks.named('verifyVersionMetadata') + dependsOn tasks.named('verifyEarlyNeoForgeContract') doLast { File libs = layout.buildDirectory.dir('libs').get().asFile List jars = (libs.listFiles() ?: [] as File[]) @@ -1275,7 +1327,7 @@ tasks.withType(PublishToMavenRepository).configureEach { tasks.register('syncForge47EclipseLaunches') { group = 'ide' - description = 'Synchronizes processed resources and hardens Forge 47 Eclipse launches.' + description = 'Synchronizes processed resources and hardens early NeoForge 47 Eclipse launches.' dependsOn tasks.named('processResources') dependsOn tasks.named('verifyBuildEnvironment') doLast { @@ -1379,7 +1431,7 @@ tasks.register('syncForge47EclipseLaunches') { tasks.register('verifyEclipseProductionClasspath') { group = 'verification' - description = 'Verifies Buildship and production-only Forge 47 launch metadata.' + description = 'Verifies Buildship and production-only early NeoForge 47 launch metadata.' dependsOn tasks.named('syncForge47EclipseLaunches') doLast { File classpath = file('.classpath') @@ -1461,7 +1513,7 @@ tasks.matching { it.name == 'eclipse' }.configureEach { tasks.register('prepareEclipse') { group = 'ide' - description = 'Creates the Buildship project model and ForgeGradle 7 launch profiles.' + description = 'Creates the Buildship project model and early-NeoForge ForgeGradle 7 launch profiles.' dependsOn tasks.named('eclipse') dependsOn tasks.named('isolateEclipseProductionRuns') } @@ -1474,6 +1526,7 @@ tasks.named('check') { dependsOn tasks.named('verifyResourceJson') dependsOn tasks.named('verifyNamespace') dependsOn tasks.named('verifyVersionMetadata') + dependsOn tasks.named('verifyEarlyNeoForgeContract') dependsOn tasks.named('verifyWorkflowPins') dependsOn tasks.named('verifyDedicatedServerBoundaries') } diff --git a/ci-fixtures/tools/README.md b/ci-fixtures/tools/README.md index 5cb98ca6fc..6ef8b58dbe 100644 --- a/ci-fixtures/tools/README.md +++ b/ci-fixtures/tools/README.md @@ -1,9 +1,9 @@ -# ForgeGradle 7 Mavenizer compatibility fixture +# Early NeoForge 1.20.1 ForgeGradle 7 Mavenizer compatibility fixture This directory contains a build-only derivative of MinecraftForge's MinecraftMavenizer `0.5.21`. It is used only while ForgeGradle prepares the -exact Forge `1.20.1-47.4.10` development dependency and is excluded from every -OreSpawn publication artifact. +exact NeoForge `net.neoforged:forge:1.20.1-47.1.106` development dependency and +is excluded from every IronAgeFurniture publication artifact. ## Provenance and licence @@ -15,13 +15,17 @@ OreSpawn publication artifact. - Embedded/external rule manifest: `minecraft-source-compatibility.json` The patch adds a target-aware compatibility stage before Mavenizer recompiles -decompiled sources. Rules run only for an exact Maven artifact listed in the +decompiled sources. It also permits the early-NeoForge +`net.neoforged:forge` group to use Mavenizer's existing Forge userdev pipeline +while preserving that group in downloaded and generated Maven artifacts. The +alias is limited to the `forge` artifact; ordinary Forge behavior is unchanged. +Compatibility rules run only for an exact Maven artifact listed in the manifest. Each rule requires one exact source file, one exact record declaration and one accessor in that record. Missing, partial, duplicate or ambiguous states fail preparation. Targets without an explicit rule set are left unchanged. -For Forge `1.20.1-47.4.10`, the manifest removes the eight explicit accessors +For NeoForge `1.20.1-47.1.106`, the manifest removes the eight explicit accessors that duplicate compiler-generated record accessors in `Holder.Direct`, `OptionInstance` and `MemoryCondition`. The implicit record methods have the same public contract. A marker beside Mavenizer's output records the target, @@ -29,8 +33,8 @@ manifest SHA-256 and applied rule IDs. Reprocessing already-patched sources is validated and idempotent. The derivative also propagates Gradle offline mode when the build sets -`ORESPAWN_MAVENIZER_OFFLINE=true`. Mavenizer itself runs on Java 25; OreSpawn -and Minecraft 1.20.1 continue to compile for Java 17. +`ORESPAWN_MAVENIZER_OFFLINE=true`. Mavenizer itself runs on Java 25; +IronAgeFurniture and Minecraft 1.20.1 continue to compile for Java 17. ## Rebuild @@ -41,7 +45,7 @@ and Minecraft 1.20.1 continue to compile for Java 17. 4. Run `./gradlew clean build --no-daemon` (or `gradlew.bat` on Windows). 5. Copy `build/libs/minecraft-mavenizer-0.5.21.jar` to `minecraft-mavenizer-0.5.21-orespawn-compat.jar`. -6. Run OreSpawn's `verifyMavenizerCompatibilityFixture` task. The build script +6. Run IronAgeFurniture's `verifyMavenizerCompatibilityFixture` task. The build script contains the authoritative checksums and also verifies the embedded manifest, Java class version and licence/provenance files. diff --git a/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar b/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar index 2c068aaec21bdadeeea2ed3bb41182f17ec7cb30..a82197366d3b375df75a736abca8636cfeb38d06 100644 GIT binary patch delta 77479 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 H$6x;f2#YEC delta 76985 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 diff --git a/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.patch b/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.patch index 28951fba98..b3cf82345a 100644 --- a/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.patch +++ b/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.patch @@ -1,4 +1,4 @@ -From 10279f8ab1adadb87b56f36c85dbda3cf64e62b3 Mon Sep 17 00:00:00 2001 +From 89a912c5487156a26fc5812d4c15f697646f2f5b Mon Sep 17 00:00:00 2001 From: OreSpawn Build Fixture Date: Fri, 28 Aug 2026 15:21:10 +0100 Subject: [PATCH] Add target-aware source compatibility rules @@ -7,10 +7,13 @@ Subject: [PATCH] Add target-aware source compatibility rules build.gradle | 2 +- .../net/minecraftforge/mcmaven/cli/Main.java | 18 +- .../minecraftforge/mcmaven/cli/MavenTask.java | 3 + + .../mcmaven/impl/MinecraftMaven.java | 4 +- + .../mcmaven/impl/repo/forge/ForgeRepo.java | 26 +- + .../mcmaven/impl/util/Constants.java | 2 + .../mcmaven/impl/util/ProcessUtils.java | 2 + .../impl/util/SourceCompatibilityPatcher.java | 241 ++++++++++++++++++ .../minecraft-source-compatibility.json | 58 +++++ - 6 files changed, 322 insertions(+), 2 deletions(-) + 9 files changed, 343 insertions(+), 13 deletions(-) create mode 100644 src/main/java/net/minecraftforge/mcmaven/impl/util/SourceCompatibilityPatcher.java create mode 100644 src/main/resources/META-INF/orespawn/minecraft-source-compatibility.json @@ -96,6 +99,133 @@ index 825820e..39bb9b3 100644 var mappings = getMappings(options, mappingsO, parchmentO); var foreignRepositories = new HashMap(); +diff --git a/src/main/java/net/minecraftforge/mcmaven/impl/MinecraftMaven.java b/src/main/java/net/minecraftforge/mcmaven/impl/MinecraftMaven.java +index c5435b1..ec9e281 100644 +--- a/src/main/java/net/minecraftforge/mcmaven/impl/MinecraftMaven.java ++++ b/src/main/java/net/minecraftforge/mcmaven/impl/MinecraftMaven.java +@@ -114,8 +114,8 @@ public record MinecraftMaven( + } + + var mcprepo = new MCPConfigRepo(this.cache, dependenciesOnly); +- if (Constants.FORGE_GROUP.equals(artifact.getGroup()) && Constants.FORGE_NAME.equals(artifact.getName())) { +- var repo = new ForgeRepo(this.cache, mcprepo); ++ if ((Constants.FORGE_ARTIFACT.equals(module) || Constants.NEOFORGE_LEGACY_ARTIFACT.equals(module))) { ++ var repo = new ForgeRepo(this.cache, mcprepo, artifact.getGroup(), artifact.getName()); + createForge(artifact, mcprepo, repo, outputJson); + } else if (Constants.MC_GROUP.equals(artifact.getGroup())) { + createMinecraft(artifact, mcprepo, outputJson); +diff --git a/src/main/java/net/minecraftforge/mcmaven/impl/repo/forge/ForgeRepo.java b/src/main/java/net/minecraftforge/mcmaven/impl/repo/forge/ForgeRepo.java +index 559ec78..d712a52 100644 +--- a/src/main/java/net/minecraftforge/mcmaven/impl/repo/forge/ForgeRepo.java ++++ b/src/main/java/net/minecraftforge/mcmaven/impl/repo/forge/ForgeRepo.java +@@ -73,6 +73,8 @@ public final class ForgeRepo extends Repo { + + final MCPConfigRepo mcpconfig; + final File globalBuild; ++ final String forgeGroup; ++ final String forgeName; + + /** + * Creates a new Forge repository. +@@ -80,10 +82,12 @@ public final class ForgeRepo extends Repo { + * @param cache The cache directory + * @param mcpconfig The MCPConfig repo + */ +- public ForgeRepo(Cache cache, MCPConfigRepo mcpconfig) { ++ public ForgeRepo(Cache cache, MCPConfigRepo mcpconfig, String forgeGroup, String forgeName) { + super(cache); + this.mcpconfig = mcpconfig; + this.globalBuild = new File(cache.root(), "forge/.global"); ++ this.forgeGroup = forgeGroup; ++ this.forgeName = forgeName; + } + + public static boolean isSupported(String version) { +@@ -110,7 +114,7 @@ public final class ForgeRepo extends Repo { + public List process(Artifact artifact, Mappings mappings, Map> outputJson) { + var module = artifact.getGroup() + ':' + artifact.getName(); + var version = artifact.getVersion(); +- if (!Constants.FORGE_ARTIFACT.equals(module)) ++ if (!(Constants.FORGE_ARTIFACT.equals(module) || Constants.NEOFORGE_LEGACY_ARTIFACT.equals(module))) + throw new IllegalArgumentException("Unknown or unsupported module: " + module); + + var fg = FGVersion.fromForge(version); +@@ -150,11 +154,15 @@ public final class ForgeRepo extends Repo { + } + } + +- private static Artifact getUserdev(String forge) { ++ private Artifact getUserdev(String forge) { ++ return getUserdev(this.forgeGroup, this.forgeName, forge); ++ } ++ ++ private static Artifact getUserdev(String forgeGroup, String forgeName, String forge) { + var forgever = new ComparableVersion(forge); + // userdev3, old attempt to make 1.12.2 FG3 compatible + var userdev3 = forgever.compareTo(USERDEV3_START) >= 0 && forgever.compareTo(USERDEV3_END) < 0; +- return Artifact.from(Constants.FORGE_GROUP, Constants.FORGE_NAME, forge, userdev3 ? "userdev3" : "userdev", "jar"); ++ return Artifact.from(forgeGroup, forgeName, forge, userdev3 ? "userdev3" : "userdev", "jar"); + } + + /// This handles legacy FG2.0->2.3 artifacts +@@ -171,7 +179,7 @@ public final class ForgeRepo extends Repo { + /// - `net.minecraft:mappings_{CHANNEL}:{MCP_VERSION}[-{VERSION}]@zip` + /// - A zip file containing fields, methods, and params.csv files mapping SRG->MCP names. + private List processV2(String version, Mappings baseMappings, Map> outputJson, FGVersion fgVersion) { +- var name = Artifact.from(Constants.FORGE_GROUP, Constants.FORGE_NAME, version); ++ var name = Artifact.from(this.forgeGroup, this.forgeName, version); + var userdev = getUserdev(version); + + var build = new File(this.cache.root(), "forge/" + userdev.getFolder()); +@@ -248,7 +256,7 @@ public final class ForgeRepo extends Repo { + /// - Standard maven pom file that contains all dependency information. + // Made this an MD comment to make it easier to read in IDE - Jonathan + private List processV3(String version, Mappings baseMappings, Map> outputJson) { +- var name = Artifact.from(Constants.FORGE_GROUP, Constants.FORGE_NAME, version); ++ var name = Artifact.from(this.forgeGroup, this.forgeName, version); + var userdev = getUserdev(version); + + var build = new File(this.cache.root(), "forge/" + userdev.getFolder()); +@@ -401,7 +409,7 @@ public final class ForgeRepo extends Repo { + }); + } + +- private static Task pom(File build, ForgeVersionCommon forge, String version, @Nullable Artifact clientExtra, @Nullable Artifact mappings) { ++ private Task pom(File build, ForgeVersionCommon forge, String version, @Nullable Artifact clientExtra, @Nullable Artifact mappings) { + return Task.named("pom[forge]", () -> { + var output = new File(build, "forge.pom"); + +@@ -418,7 +426,7 @@ public final class ForgeRepo extends Repo { + if (Mavenizer.checkCache(output, cache)) + return output; + +- var builder = new POMBuilder(Constants.FORGE_GROUP, Constants.FORGE_NAME, version).preferGradleModule().dependencies(dependencies -> { ++ var builder = new POMBuilder(this.forgeGroup, this.forgeName, version).preferGradleModule().dependencies(dependencies -> { + if (clientExtra != null) + dependencies.add(clientExtra); + +@@ -529,7 +537,7 @@ public final class ForgeRepo extends Repo { + } + @SuppressWarnings("unused") + private static List gatherVariants(MavenCache cache, String version, @Nullable FGVersion fg) { +- var userdev = getUserdev(version); ++ var userdev = getUserdev(Constants.FORGE_GROUP, Constants.FORGE_NAME, version); + if (fg == null) + userdev = userdev.withClassifier("src").withExtension("zip"); + var mappingsFiles = new ArrayList(); +diff --git a/src/main/java/net/minecraftforge/mcmaven/impl/util/Constants.java b/src/main/java/net/minecraftforge/mcmaven/impl/util/Constants.java +index 3b39894..8dfd653 100644 +--- a/src/main/java/net/minecraftforge/mcmaven/impl/util/Constants.java ++++ b/src/main/java/net/minecraftforge/mcmaven/impl/util/Constants.java +@@ -13,6 +13,8 @@ public final class Constants { + public static final String FORGE_GROUP = "net.minecraftforge"; + public static final String FORGE_NAME = "forge"; + public static final String FORGE_ARTIFACT = FORGE_GROUP + ':' + FORGE_NAME; ++ public static final String NEOFORGE_LEGACY_GROUP = "net.neoforged"; ++ public static final String NEOFORGE_LEGACY_ARTIFACT = NEOFORGE_LEGACY_GROUP + ':' + FORGE_NAME; + public static final String FORGE_MAVEN = "https://maven.minecraftforge.net/"; + public static final String MCP_DOWNLOADS = FORGE_FILES + "mcp/"; + diff --git a/src/main/java/net/minecraftforge/mcmaven/impl/util/ProcessUtils.java b/src/main/java/net/minecraftforge/mcmaven/impl/util/ProcessUtils.java index 9fa2888..d8c14fd 100644 --- a/src/main/java/net/minecraftforge/mcmaven/impl/util/ProcessUtils.java @@ -358,60 +488,60 @@ index 0000000..2cb07e0 +} diff --git a/src/main/resources/META-INF/orespawn/minecraft-source-compatibility.json b/src/main/resources/META-INF/orespawn/minecraft-source-compatibility.json new file mode 100644 -index 0000000..462d571 +index 0000000..ddf2eba --- /dev/null +++ b/src/main/resources/META-INF/orespawn/minecraft-source-compatibility.json @@ -0,0 +1,58 @@ +{ + "schema": 1, + "targets": { -+ "net.minecraftforge:forge:1.19.4-45.4.0": { ++ "net.neoforged:forge:1.20.1-47.1.106": { + "expectedApplications": 8, + "rules": [ + { -+ "id": "forge-1.19.4-holder-direct-value", ++ "id": "forge-1.20.1-holder-direct-value", + "file": "net/minecraft/core/Holder.java", + "recordDeclaration": "public static record Direct(T value) implements Holder", + "accessor": "\n public T value() {\n return this.value;\n }\n" + }, + { -+ "id": "forge-1.19.4-option-alt-enum-value-setter", ++ "id": "forge-1.20.1-option-alt-enum-value-setter", + "file": "net/minecraft/client/OptionInstance.java", + "recordDeclaration": "public static record AltEnum(List values, List altValues, BooleanSupplier altCondition, OptionInstance.CycleableValueSet.ValueSetter valueSetter, Codec codec)", + "accessor": "\n public OptionInstance.CycleableValueSet.ValueSetter valueSetter() {\n return this.valueSetter;\n }\n" + }, + { -+ "id": "forge-1.19.4-option-alt-enum-codec", ++ "id": "forge-1.20.1-option-alt-enum-codec", + "file": "net/minecraft/client/OptionInstance.java", + "recordDeclaration": "public static record AltEnum(List values, List altValues, BooleanSupplier altCondition, OptionInstance.CycleableValueSet.ValueSetter valueSetter, Codec codec)", + "accessor": "\n public Codec codec() {\n return this.codec;\n }\n" + }, + { -+ "id": "forge-1.19.4-option-enum-codec", ++ "id": "forge-1.20.1-option-enum-codec", + "file": "net/minecraft/client/OptionInstance.java", + "recordDeclaration": "public static record Enum(List values, Codec codec)", + "accessor": "\n public Codec codec() {\n return this.codec;\n }\n" + }, + { -+ "id": "forge-1.19.4-option-lazy-enum-codec", ++ "id": "forge-1.20.1-option-lazy-enum-codec", + "file": "net/minecraft/client/OptionInstance.java", + "recordDeclaration": "public static record LazyEnum(Supplier> values, Function> validateValue, Codec codec)", + "accessor": "\n public Codec codec() {\n return this.codec;\n }\n" + }, + { -+ "id": "forge-1.19.4-memory-absent-memory", ++ "id": "forge-1.20.1-memory-absent-memory", + "file": "net/minecraft/world/entity/ai/behavior/declarative/MemoryCondition.java", + "recordDeclaration": "public static record Absent(MemoryModuleType memory)", + "accessor": "\n public MemoryModuleType memory() {\n return this.memory;\n }\n" + }, + { -+ "id": "forge-1.19.4-memory-present-memory", ++ "id": "forge-1.20.1-memory-present-memory", + "file": "net/minecraft/world/entity/ai/behavior/declarative/MemoryCondition.java", + "recordDeclaration": "public static record Present(MemoryModuleType memory)", + "accessor": "\n public MemoryModuleType memory() {\n return this.memory;\n }\n" + }, + { -+ "id": "forge-1.19.4-memory-registered-memory", ++ "id": "forge-1.20.1-memory-registered-memory", + "file": "net/minecraft/world/entity/ai/behavior/declarative/MemoryCondition.java", + "recordDeclaration": "public static record Registered(MemoryModuleType memory)", + "accessor": "\n public MemoryModuleType memory() {\n return this.memory;\n }\n" diff --git a/ci-fixtures/tools/minecraft-source-compatibility.json b/ci-fixtures/tools/minecraft-source-compatibility.json index 858f197622..ddf2ebada2 100644 --- a/ci-fixtures/tools/minecraft-source-compatibility.json +++ b/ci-fixtures/tools/minecraft-source-compatibility.json @@ -1,7 +1,7 @@ { "schema": 1, "targets": { - "net.minecraftforge:forge:1.20.1-47.4.10": { + "net.neoforged:forge:1.20.1-47.1.106": { "expectedApplications": 8, "rules": [ { diff --git a/docs/OPTIONAL-INTEGRATION-TEST.md b/docs/OPTIONAL-INTEGRATION-TEST.md index bde2355893..25c518ac6a 100644 --- a/docs/OPTIONAL-INTEGRATION-TEST.md +++ b/docs/OPTIONAL-INTEGRATION-TEST.md @@ -1,7 +1,7 @@ # Optional integration runtime test -This positive-path test starts Forge 1.20.1 with Iron Age Furniture and all three -supported optional integrations. A test-only Forge mod then checks the live server +This positive-path test starts early NeoForge 1.20.1 with Iron Age Furniture and +all three supported optional integrations. A test-only early-NeoForge mod then checks the live server registries for every conditional recipe and recipe advancement and stops the server. The third-party mod jars are deliberately not committed or redistributed. Their @@ -10,7 +10,7 @@ exact filenames, versions, SHA-256 checksums, roles, and source pages are pinned ## Setup -1. Install the Forge `1.20.1-47.4.10` server into the ignored +1. Install the NeoForge `1.20.1-47.1.106` server into the ignored `run-optional-integrations` directory and accept its EULA. 2. Download every jar listed in the manifest into `run-optional-integrations/mods`. This directory may also contain the generated @@ -18,7 +18,7 @@ exact filenames, versions, SHA-256 checksums, roles, and source pages are pinned 3. Run `gradlew.bat runOptionalIntegrationServer` with the project's pinned Java installations available as described in `gradle.properties`. -An existing disposable Forge server can be used without moving it by adding +An existing disposable NeoForge server can be used without moving it by adding `-PoptionalIntegrationServerDir=` to the command. The manifest jars must be in that server's `mods` directory. The task stages only the current packaged Iron Age Furniture jar and generated probe; the server installation and @@ -33,11 +33,27 @@ It then builds and stages `ironagefurniture-optional-integration-probe.jar`, removes any stale result, and accepts success only when the probe writes `optional-integration-pass.properties` in the selected server directory with all -applicable conditional data present. The BOP 18 profile expects 1,380 recipes -and 1,364 recipe advancements; the BOP 19 profile additionally enables the 117 -Empyreal, Maple, and Pine recipes and advancements, for totals of 1,497 and -1,481. Version-tiered entries are selected by their public registry capability, -using Forge's `forge:item_exists` condition. +applicable conditional data present. The BOP 18.0.0.598 profile expects 1,380 +recipes and 1,364 recipe advancements. Version-tiered entries are selected by +their public registry capability using the early loader's `forge:item_exists` +condition. + +BOP 19.0.0.96 and its required GlitchCore 0.0.1.1 were inspected and exercised +as a negative compatibility probe. Both require Forge 47.3+, so they are not a +qualifying runtime combination for NeoForge 47.1.106 and are deliberately not +present in the positive manifest. Core packaged server smokes are also run on +the minimum supported NeoForge 47.1.99 loader. + +The profile uses BWG 1.5.11 because it is the newest 1.20.1 BWG publication +whose loader metadata explicitly includes NeoForge. BWG 1.8.0 is Forge-only +and requires Forge 47.4+, so it is deliberately not used on this target. + +BWG 1.5.11 emits an upstream, non-fatal `EatBlockGoalMixin` descriptor warning +on NeoForge 47.1.106 (plus two CorgiLib/Oh The Trees overwrite-conflict +warnings). The isolated BWG server still reaches `Done`, registers the BWG +furniture, and passes all 936 BWG recipe and 936 recipe-advancement checks. +Treat any additional error, missing texture/model, registry failure, or IAF +recipe/advancement warning as a test failure. The probe also records the loaded versions and per-integration counts. It is built from `src/optionalIntegrationTest` and is explicitly excluded from all release diff --git a/docs/VERSIONS.md b/docs/VERSIONS.md index 607e057e1a..6b7642bfe5 100644 --- a/docs/VERSIONS.md +++ b/docs/VERSIONS.md @@ -4,7 +4,7 @@ IronAgeFurniture releases use `Major.Minor.Bug.Target`. The first three componen The target is calculated as `MmmppL`: Minecraft major without padding, two-digit minor, two-digit patch, and a one-digit loader code. Forge uses loader code `1`; NeoForge uses `2`. -For Minecraft 1.20.1 Forge, the target is `120011`, so the current functionally equivalent `0.3.0` release is `0.3.0.120011`. The release tag is exactly that complete version. +For Minecraft 1.20.1 NeoForge, the target is `120012`, so the current functionally equivalent `0.3.0` release is `0.3.0.120012`. The release tag is exactly that complete version. This early NeoForge generation still uses ForgeGradle and Forge-era runtime metadata; the loader code follows the distributed loader, not the build-plugin package names. Equivalent forward ports retain `0.3.0` and change only the target. A player-visible feature or fix changes Major, Minor, or Bug independently of the target. diff --git a/gradle.properties b/gradle.properties index ca2bef238c..8cfb7102ae 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -# Reproducible Gradle and ForgeGradle configuration. +# Reproducible Gradle and early-NeoForge/ForgeGradle configuration. org.gradle.jvmargs=-Xmx4G org.gradle.daemon=false org.gradle.configuration-cache=false @@ -7,7 +7,7 @@ org.gradle.parallel=false net.minecraftforge.gradle.merge-source-sets=false # Project and release identity. -mod_version=0.3.0.120011 +mod_version=0.3.0.120012 mod_group=zone.moddev.mc mod_archive_name=iron-age-furniture mod_id=ironagefurniture @@ -18,8 +18,8 @@ mod_license=LGPL-2.1 # Generic release-dispatcher metadata. minecraft_version=1.20.1 -loader_name=forge -loader_code=1 +loader_name=neoforge +loader_code=2 java_version=17 java_toolchain_version=17.0.1+12 java_setup_version=17.0.1+12 @@ -27,9 +27,9 @@ gradle_java_version=17 curseforge_project_id=341834 curseforge_optionals=biomes-o-plenty,immersive-engineering,oh-the-biomes-weve-gone -# Forge 1.20.1 build coordinates. -forge_version=47.4.10 -forge_version_range=[47.4.10,48) +# NeoForge 1.20.1 retained the Forge-era userdev and metadata contracts. +neo_version=47.1.106 +neo_version_range=[47.1.99,48) loader_version_range=[47,) mcp_mappings_channel=official mcp_mappings_version=1.20.1 diff --git a/gradle/furniture-catalog.gradle b/gradle/furniture-catalog.gradle index 01eea9cd42..f1e43cbce4 100644 --- a/gradle/furniture-catalog.gradle +++ b/gradle/furniture-catalog.gradle @@ -317,7 +317,7 @@ tasks.register('updateFurnitureCatalog') { tasks.register('verifyFurnitureCatalog') { group = 'verification' - description = 'Regenerates furniture into a temporary tree and compares it byte-for-byte with committed output.' + description = 'Regenerates furniture into a temporary tree and compares canonical text with committed output.' inputs.file furnitureCatalogFile inputs.dir furnitureTemplateDirectory doLast { @@ -329,7 +329,9 @@ tasks.register('verifyFurnitureCatalog') { File expectedFile = new File(expectedRoot, relative) File actualFile = new File(project.projectDir, relative) if (!actualFile.isFile()) throw new GradleException("Missing catalog output: ${relative}") - if (Files.mismatch(expectedFile.toPath(), actualFile.toPath()) != -1L) { + String expectedText = expectedFile.getText('UTF-8').replace('\r\n', '\n') + String actualText = actualFile.getText('UTF-8').replace('\r\n', '\n') + if (expectedText != actualText) { throw new GradleException("Catalog output differs; run updateFurnitureCatalog: ${relative}") } } @@ -380,11 +382,31 @@ tasks.register('verifyOptionalIntegrationTextures') { } } + def catalog = readFurnitureCatalog() + Set unavailableTierSuffixes = new TreeSet<>() + catalog.integrations.each { integration -> + integrationFurnitureTiers(integration).findAll { it.minimumVersion }.each { tier -> + tier.woods.each { wood -> + Map textures = integrationTextureValues(integration, wood) + Set expectedEntries = [ + textures.externalLogTexture, + textures.externalLogTopTexture, + textures.externalPlanksTexture + ].collect { "assets/${integration.namespace}/textures/${it}.png" } as Set + if (!jarEntries[integration.namespace].containsAll(expectedEntries)) { + unavailableTierSuffixes.add( + "_${integration.integration}_${wood.wood}.json".toString()) + } + } + } + } + List blockModels = fileTree('src/main/resources/assets/ironagefurniture/models/block') { include '**/*.json' }.files.sort { it.path } Set referencedTextures = new TreeSet<>() blockModels.each { modelFile -> + if (unavailableTierSuffixes.any { modelFile.name.endsWith(it) }) return Map model = new JsonSlurper().parse(modelFile) as Map if (!(model.textures instanceof Map)) return ((Map) model.textures).values().findAll { it instanceof String }.each { value -> @@ -403,7 +425,6 @@ tasks.register('verifyOptionalIntegrationTextures') { } } - def catalog = readFurnitureCatalog() catalog.integrations.each { integration -> integrationFurnitureTiers(integration).each { tier -> tier.woods.each { wood -> @@ -414,6 +435,7 @@ tasks.register('verifyOptionalIntegrationTextures') { "${integration.namespace}:${textures.externalPlanksTexture}" ] as Set String suffix = "_${integration.integration}_${wood.wood}.json" + if (unavailableTierSuffixes.contains(suffix)) return List woodModels = blockModels.findAll { it.name.endsWith(suffix) } if (woodModels.isEmpty()) { throw new GradleException("No generated block models found for " + @@ -439,7 +461,8 @@ tasks.register('verifyOptionalIntegrationTextures') { throw new GradleException('No optional-mod texture references were audited') } logger.lifecycle("Verified ${referencedTextures.size()} optional-mod textures against " + - "${integrationJars.size()} pinned integration jars") + "${integrationJars.size()} pinned integration jars; skipped " + + "${unavailableTierSuffixes.size()} unavailable version-tier woods") } } diff --git a/gradle/verification/optional-integration-mods.json b/gradle/verification/optional-integration-mods.json index 4f3766b6fe..6e554ec2b8 100644 --- a/gradle/verification/optional-integration-mods.json +++ b/gradle/verification/optional-integration-mods.json @@ -4,26 +4,26 @@ { "modId": "biomesoplenty", "role": "integration", - "version": "19.0.0.96", - "file": "BiomesOPlenty-forge-1.20.1-19.0.0.96.jar", - "sha256": "84bbfe8fa25a453dae3a8e6c46e8e129f48f7d9df58e33bb7f3d28b90f591b3f", - "source": "https://modrinth.com/mod/biomes-o-plenty/version/jxUqRzSD" + "version": "18.0.0.598", + "file": "BiomesOPlenty-1.20.1-18.0.0.598.jar", + "sha256": "71eb3ddb35c1c2db6c15f80f001a6655508435a5f3828c7e2f666eada616c19d", + "source": "https://modrinth.com/mod/biomes-o-plenty/version/peO5lWzX" }, { "modId": "biomeswevegone", "role": "integration", - "version": "1.8.0-Forge", - "file": "Oh-The-Biomes-Weve-Gone-Forge-1.8.0.jar", - "sha256": "a6d21a08170dbfb6c3983b571bb2c1cd92aa93109f5b3a9b47101688dd81ea01", - "source": "https://modrinth.com/mod/oh-the-biomes-weve-gone/version/8L5cwpjz" + "version": "1.5.11-Forge", + "file": "Oh-The-Biomes-Weve-Gone-Forge-1.5.11.jar", + "sha256": "f672244dbe664119c8704199ced51ba5114ed7b49207669be2d405069c6b7e33", + "source": "https://modrinth.com/mod/oh-the-biomes-weve-gone/version/qj6FvHC7" }, { "modId": "immersiveengineering", "role": "integration", - "version": "10.2.0-183", - "file": "ImmersiveEngineering-1.20.1-10.2.0-183.jar", - "sha256": "061dd0e8e066dc39277736d5607a47a18fee4aff428de3363882f96e5c405aaa", - "source": "https://modrinth.com/mod/immersiveengineering/version/WUzj4tgJ" + "version": "1.20.1-10.1.0-171", + "file": "ImmersiveEngineering-1.20.1-10.1.0-171.jar", + "sha256": "bbb04345b8263b1de026521500e28ceba207470e0dd78c9f022331d7fbca42d2", + "source": "https://modrinth.com/mod/immersiveengineering/version/MAqXk6P8" }, { "modId": "terrablender", @@ -56,14 +56,6 @@ "file": "Oh-The-Trees-Youll-Grow-forge-1.20.1-1.7.0.jar", "sha256": "b3495f6b0ffa38bc5bf7189e29a27eef0c23b58540dc2f32033889c2943e5694", "source": "https://modrinth.com/mod/oh-the-trees-youll-grow/version/AAp1NdQX" - }, - { - "modId": "glitchcore", - "role": "dependency", - "version": "0.0.1.1", - "file": "GlitchCore-forge-1.20.1-0.0.1.1.jar", - "sha256": "dedd857b1ee356f002471ec97a2174c7d193d6d1aede60782d0bbe2c241b2a7f", - "source": "https://modrinth.com/mod/glitchcore/version/pYPZ5MNI" } ] } diff --git a/src/main/java/zone/moddev/mc/ironagefurniture/Ironagefurniture.java b/src/main/java/zone/moddev/mc/ironagefurniture/Ironagefurniture.java index 159d11252f..a519333dbb 100644 --- a/src/main/java/zone/moddev/mc/ironagefurniture/Ironagefurniture.java +++ b/src/main/java/zone/moddev/mc/ironagefurniture/Ironagefurniture.java @@ -4,10 +4,10 @@ import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import zone.moddev.mc.ironagefurniture.api.entity.Entities; import zone.moddev.mc.ironagefurniture.api.CreativeModeBreakTracker; import zone.moddev.mc.ironagefurniture.client.renderer.ClientHandler; @@ -43,10 +43,9 @@ public class Ironagefurniture public static final CommonProxy PROXY = DistExecutor.runForDist(() -> zone.moddev.mc.ironagefurniture.proxy.ClientProxy::new, () -> CommonProxy::new); private static final Logger LOGGER = LogUtils.getLogger(); - public Ironagefurniture(FMLJavaModLoadingContext context) { + public Ironagefurniture(IEventBus modEventBus) { LOGGER.info("Iron Age Furniture Mod is loading..."); - IEventBus modEventBus = context.getModEventBus(); ModVanillaChairs.REGISTER.register(modEventBus); ModVanillaShieldChairs.REGISTER.register(modEventBus); @@ -92,7 +91,8 @@ public Ironagefurniture(FMLJavaModLoadingContext context) { modEventBus.addListener(ClientHandler::onRegisterRenderers); }); - context.registerConfig(ModConfig.Type.COMMON, IronAgeFurnitureConfiguration.SPEC); + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, + IronAgeFurnitureConfiguration.SPEC); } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 9a775c2bb1..88b2194694 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -8,7 +8,7 @@ modId="${mod_id}" version="${version}" displayName="${mod_name}" displayURL="https://www.curseforge.com/minecraft/mc-mods/iron-age-furniture" -credits="Cyanobacterium, SkyBlade1978, FoxNekitsune, the MMD Team, Forge, FML, and the mod authors" +credits="Cyanobacterium, SkyBlade1978, FoxNekitsune, the MMD Team, NeoForge, Forge, FML, and the mod authors" authors="${mod_authors}" description=''' ${mod_description} @@ -17,7 +17,7 @@ ${mod_description} [[dependencies.ironagefurniture]] modId="forge" mandatory=true - versionRange="${forge_version_range}" + versionRange="${neo_version_range}" ordering="NONE" side="BOTH" diff --git a/src/optionalIntegrationTest/java/zone/moddev/mc/ironagefurniture/fixture/OptionalIntegrationRecipeProbe.java b/src/optionalIntegrationTest/java/zone/moddev/mc/ironagefurniture/fixture/OptionalIntegrationRecipeProbe.java index 20a6e5f8da..265925f740 100644 --- a/src/optionalIntegrationTest/java/zone/moddev/mc/ironagefurniture/fixture/OptionalIntegrationRecipeProbe.java +++ b/src/optionalIntegrationTest/java/zone/moddev/mc/ironagefurniture/fixture/OptionalIntegrationRecipeProbe.java @@ -31,7 +31,7 @@ public final class OptionalIntegrationRecipeProbe private static final Logger LOGGER = LogUtils.getLogger(); private static final List REQUIRED_MODS = List.of( "biomesoplenty", "biomeswevegone", "immersiveengineering", - "terrablender", "corgilib", "geckolib", "ohthetreesyoullgrow", "glitchcore"); + "terrablender", "corgilib", "geckolib", "ohthetreesyoullgrow"); public OptionalIntegrationRecipeProbe() { @@ -54,7 +54,7 @@ private void serverStarted(ServerStartedEvent event) "biomesoplenty:maple_planks", "biomesoplenty:pine_planks") .stream() - .map(ResourceLocation::parse) + .map(ResourceLocation::new) .filter(ForgeRegistries.ITEMS::containsKey) .count(); int expectedBopCount = 390 + (extendedBopWoods * 39); @@ -147,8 +147,8 @@ private static List readExpectedEntries(String resourceName) require(parts.length == 2, "Invalid probe entry: " + line); String[] selector = parts[0].split("\\|", 2); ResourceLocation requiredItem = selector.length == 2 - ? ResourceLocation.parse(selector[1]) : null; - result.add(new ExpectedEntry(selector[0], ResourceLocation.parse(parts[1]), + ? new ResourceLocation(selector[1]) : null; + result.add(new ExpectedEntry(selector[0], new ResourceLocation(parts[1]), requiredItem)); } } diff --git a/src/optionalIntegrationTest/resources/META-INF/mods.toml b/src/optionalIntegrationTest/resources/META-INF/mods.toml index 0a5c615373..97be0eaacf 100644 --- a/src/optionalIntegrationTest/resources/META-INF/mods.toml +++ b/src/optionalIntegrationTest/resources/META-INF/mods.toml @@ -10,7 +10,7 @@ displayName="Iron Age Furniture Optional Integration Probe" [[dependencies.ironagefurnitureintegrationprobe]] modId="forge" mandatory=true -versionRange="[47.4.10,48)" +versionRange="[47.1.99,48)" ordering="NONE" side="SERVER" @@ -24,7 +24,7 @@ side="SERVER" [[dependencies.ironagefurnitureintegrationprobe]] modId="ironagefurniture" mandatory=true -versionRange="[0.3.0.120011]" +versionRange="[0.3.0.120012]" ordering="AFTER" side="SERVER" @@ -38,13 +38,13 @@ side="SERVER" [[dependencies.ironagefurnitureintegrationprobe]] modId="biomeswevegone" mandatory=true -versionRange="[1.8.0]" +versionRange="[1.5.11]" ordering="AFTER" side="SERVER" [[dependencies.ironagefurnitureintegrationprobe]] modId="immersiveengineering" mandatory=true -versionRange="[1.20.1-10.2.0-183]" +versionRange="[1.20.1-10.1.0-171]" ordering="AFTER" side="SERVER" From b2bffbbb5183785cc66b9c4781e0d3d3b583c4eb Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Fri, 18 Sep 2026 10:55:16 +0100 Subject: [PATCH 2/2] Allow newer Temurin 17 toolchains in Eclipse --- build.gradle | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index f2d23795af..08a9e5668a 100644 --- a/build.gradle +++ b/build.gradle @@ -172,12 +172,14 @@ def normalizeArchiveLineEndings = { details -> tasks.register('verifyBuildEnvironment') { group = 'verification' - description = 'Verifies the supported Gradle runtime and exact Java 17 compiler toolchain.' + description = 'Verifies the supported Gradle runtime and Temurin Java 17 compiler toolchain.' doLast { def metadata = java17Compiler.get().metadata String actual = metadata.javaRuntimeVersion.toString() - if (actual != project.java_toolchain_version.toString()) { - throw new GradleException("Java compiler toolchain must be ${project.java_toolchain_version}; " + + if (metadata.languageVersion.asInt() != project.java_version.toString().toInteger() + || !metadata.vendor.toString().toLowerCase(Locale.ROOT).contains('temurin')) { + throw new GradleException("Java compiler toolchain must be Temurin ${project.java_version} " + + "(release baseline ${project.java_toolchain_version}); " + "found ${metadata.vendor} ${actual} at ${metadata.installationPath}") } }