From 1ae01ed1fca7daf81d3ec2a4ac0f9c73ced3e13b Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Thu, 29 Oct 2026 15:10:45 +0000 Subject: [PATCH 1/2] Port Base Metals to Forge 26.2 --- .github/workflows/ci.yml | 42 +++++++++--------- .github/workflows/codeql-analysis.yml | 4 +- .github/workflows/validate-gradle-build.yml | 4 +- CHANGELOG.txt | 7 +++ README.md | 22 ++++----- build.gradle | 10 ++--- ci-fixtures/tools/README.md | 6 +-- ...craft-mavenizer-0.5.21-orespawn-compat.jar | Bin 2542295 -> 2566958 bytes ...aft-mavenizer-0.5.21-orespawn-compat.patch | 2 +- .../tools/minecraft-source-compatibility.json | 2 +- docs/COMPATIBILITY.md | 2 +- docs/MIGRATION.md | 7 ++- docs/VERSIONS.md | 22 ++++----- docs/WORLDGEN.md | 4 +- docs/schemas/orespawn-4.1.0/README.md | 4 +- gradle.properties | 26 +++++------ gradle/README.md | 2 +- gradle/dependencies.gradle | 4 +- gradle/ide/eclipse.gradle | 4 +- gradle/release/artifacts.gradle | 28 ++++++------ gradle/verification/packaged-runtime.gradle | 22 ++++----- .../mc/basemetals/data/GeneratedData.java | 2 +- .../content/BaseMetalsGameTests.java | 16 +++---- .../content/ForwardPortGameTests.java | 2 +- .../content/NativeComponentGameTests.java | 6 +-- .../data/basemetals/registry_manifest.json | 2 +- .../basemetals/smoke/ConfigScreenSmoke.java | 16 +++---- .../smoke/IntegratedWorldSmoke.java | 24 +++++----- .../mc/basemetals/BaseMetalsAdvancements.java | 3 +- .../client/BaseMetalsConfigScreen.java | 6 +-- .../content/BaseMetalBucketItem.java | 2 +- src/main/resources/META-INF/mods.toml | 2 +- src/main/resources/pack.mcmeta | 4 +- .../mc/basemetals/smoke/RemoteLoginSmoke.java | 10 ++--- .../packaged-resources/META-INF/mods.toml | 4 +- .../basemetals/smoke/PackagedServerSmoke.java | 4 +- .../packaged-resources/META-INF/mods.toml | 4 +- src/smoke/datapack/pack.mcmeta | 4 +- .../data/Minecraft1211ResourceTest.java | 8 ++-- .../migration/LegacyMigrationSafetyTest.java | 4 +- .../migration/LegacyWorldStorageTest.java | 15 +++++++ tools/validation/README.md | 11 +++-- tools/validation/runtime_log.js | 9 ++++ tools/validation/test_content_modes.js | 6 +-- tools/validation/test_legacy_worlds.js | 8 +++- tools/validation/test_runtime_log.js | 26 +++++++++++ 46 files changed, 248 insertions(+), 174 deletions(-) create mode 100644 tools/validation/runtime_log.js create mode 100644 tools/validation/test_runtime_log.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6ce6057e2..6fa868247 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,19 +1,19 @@ -name: Base Metals 26.1.2 CI +name: Base Metals 26.2 CI on: push: branches: - - master-26.1.2 + - master-26.2 - 'feature/**' pull_request: branches: - - master-26.1.2 + - master-26.2 permissions: contents: read concurrency: - group: basemetals-26.1.2-${{ github.workflow }}-${{ github.ref }} + group: basemetals-26.2-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: @@ -49,7 +49,7 @@ jobs: "$RUNNER_TEMP/nbt-tests/bin/python" -m unittest discover -s tools/validation -p 'test_*.py' - name: Test upgrade log boundaries - run: node --test tools/validation/test_painting_registry.js + run: node --test tools/validation/test_painting_registry.js tools/validation/test_runtime_log.js - name: Build, test, and audit first candidate run: | @@ -59,9 +59,9 @@ jobs: --no-daemon --stacktrace first="$RUNNER_TEMP/basemetals-first" mkdir -p "$first" - cp build/libs/BaseMetals-3.1.1.2601021.jar "$first/" - cp build/libs/BaseMetals-3.1.1.2601021-sources.jar "$first/" - cp build/libs/BaseMetals-3.1.1.2601021-javadoc.jar "$first/" + cp build/libs/BaseMetals-3.1.1.2602001.jar "$first/" + cp build/libs/BaseMetals-3.1.1.2602001-sources.jar "$first/" + cp build/libs/BaseMetals-3.1.1.2602001-javadoc.jar "$first/" cp build/release/SHA256SUMS "$first/" - name: Rebuild and prove byte-identical archives @@ -69,9 +69,9 @@ jobs: ./gradlew clean assemble verifyReleaseArtifacts writeReleaseChecksums \ -PorespawnVerificationRepository="${{ steps.orespawn.outputs.repository }}" \ --no-daemon --stacktrace - cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.2601021.jar" build/libs/BaseMetals-3.1.1.2601021.jar - cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.2601021-sources.jar" build/libs/BaseMetals-3.1.1.2601021-sources.jar - cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.2601021-javadoc.jar" build/libs/BaseMetals-3.1.1.2601021-javadoc.jar + cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.2602001.jar" build/libs/BaseMetals-3.1.1.2602001.jar + cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.2602001-sources.jar" build/libs/BaseMetals-3.1.1.2602001-sources.jar + cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.2602001-javadoc.jar" build/libs/BaseMetals-3.1.1.2602001-javadoc.jar cmp "$RUNNER_TEMP/basemetals-first/SHA256SUMS" build/release/SHA256SUMS - name: Run all required GameTests @@ -83,14 +83,14 @@ jobs: - name: Install official Forge packaged runtimes id: forge-runtimes run: | - server_runtime="$RUNNER_TEMP/forge-26.1.2-64.0.9-server" - client_runtime="$RUNNER_TEMP/forge-26.1.2-64.0.9-client" - installer="$RUNNER_TEMP/forge-26.1.2-64.0.9-installer.jar" + server_runtime="$RUNNER_TEMP/forge-26.2-65.1.0-server" + client_runtime="$RUNNER_TEMP/forge-26.2-65.1.0-client" + installer="$RUNNER_TEMP/forge-26.2-65.1.0-installer.jar" mkdir -p "$server_runtime" "$client_runtime" curl --fail --location --retry 3 \ --output "$installer" \ - https://maven.minecraftforge.net/net/minecraftforge/forge/26.1.2-64.0.9/forge-26.1.2-64.0.9-installer.jar - echo "608BC9F028A0EF8DCD1A49C6EB85DDFCFA3B3BCD8AE27FC1B2AE02888ED8CB0A $installer" | sha256sum --check --strict + https://maven.minecraftforge.net/net/minecraftforge/forge/26.2-65.1.0/forge-26.2-65.1.0-installer.jar + echo "813FBBFECC3086A492783B9F5023AE15007737B42E17AAB75F48BA77403314DF $installer" | sha256sum --check --strict ( cd "$server_runtime" java -jar "$installer" --installServer @@ -135,13 +135,13 @@ jobs: - name: Upload audited release candidate uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: BaseMetals-26.1.2-${{ github.sha }} + name: BaseMetals-26.2-${{ github.sha }} if-no-files-found: error retention-days: 30 path: | - build/libs/BaseMetals-3.1.1.2601021.jar - build/libs/BaseMetals-3.1.1.2601021-sources.jar - build/libs/BaseMetals-3.1.1.2601021-javadoc.jar + build/libs/BaseMetals-3.1.1.2602001.jar + build/libs/BaseMetals-3.1.1.2602001-sources.jar + build/libs/BaseMetals-3.1.1.2602001-javadoc.jar build/release/SHA256SUMS CHANGELOG.txt @@ -149,7 +149,7 @@ jobs: if: failure() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: BaseMetals-26.1.2-diagnostics-${{ github.sha }} + name: BaseMetals-26.2-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 51315cef4..7bb158a99 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -3,11 +3,11 @@ name: CodeQL on: push: branches: - - master-26.1.2 + - master-26.2 - 'feature/**' pull_request: branches: - - master-26.1.2 + - master-26.2 permissions: actions: read diff --git a/.github/workflows/validate-gradle-build.yml b/.github/workflows/validate-gradle-build.yml index 531f53fed..d8bacce9a 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-26.1.2 + - master-26.2 - 'feature/**' pull_request: branches: - - master-26.1.2 + - master-26.2 permissions: contents: read diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 3c097cafe..1058df316 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,10 @@ +Base Metals 3.1.1.2602001 + +- Port the released 26.1.2 version to Minecraft 26.2 and Forge 65, keeping Java 25. +- Keep raw metals, ore overlays, filled buckets, High/Low Fantasy and the existing gameplay fixes. +- Use published OreSpawn 4.1.0.2602001 with the same eleven rules and copper defaults. +- Keep existing world profiles, saved items and legacy-upgrade protections. + Base Metals 3.1.1.2601021 - Port the released 1.21.11 version to Minecraft 26.1.2, Forge 64 and Java 25. diff --git a/README.md b/README.md index d3c06cd46..18a85fcab 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![Discord](https://img.shields.io/badge/Discord-MMD-green.svg?style=flat&logo=Discord)](https://discord.moddev.zone) [![CurseForge downloads](https://cf.way2muchnoise.eu/full_base-metals_downloads.svg)](https://www.curseforge.com/minecraft/mc-mods/base-metals) [![Supported Minecraft versions](https://cf.way2muchnoise.eu/versions/Minecraft_base-metals_all.svg)](https://www.curseforge.com/minecraft/mc-mods/base-metals) -[![Build, test, and audit](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml/badge.svg?branch=master-26.1.2)](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml?query=branch%3Amaster-26.1.2) +[![Build, test, and audit](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml/badge.svg?branch=master-26.2)](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml?query=branch%3Amaster-26.2) # Base Metals @@ -12,23 +12,23 @@ shields, bows, crossbows, arrows, and bolts. The mod also includes Crack Hammers, scythes, metal anvils, the human detector, villager trades, advancements, and structure loot. -This is the Minecraft 26.1.2 Forge version, `3.1.1.2601021`. It keeps the -fixes and features from the released 1.21.11 version, including raw metals, ore +This is the Minecraft 26.2 Forge version, `3.1.1.2602001`. It keeps the +fixes and features from the released 26.1.2 version, including raw metals, ore texture overlays and High/Low Fantasy modes. Existing Base Metals items and blocks keep their registry IDs. OreSpawn handles ore generation; MMDLib and Additional Loot Tables are no longer needed. ## Requirements -- Minecraft `26.1.2` -- Forge `64.0.9` or newer in the Minecraft 26.1.2 Forge 64 line +- Minecraft `26.2` +- Forge `65.1.0` or newer in the Minecraft 26.2 Forge 65 line - A current Java 25 runtime -- OreSpawn `[4.1.0.2601021,5.0.0)` on both client and server +- OreSpawn `[4.1.0.2602001,5.0.0)` on both client and server -The build uses Forge `64.0.9` and is also tested on `64.1.5`. +The build uses Forge `65.1.0` and is also tested on `65.1.5`. -This version uses OreSpawn `4.1.0.2601021`. Put -`BaseMetals-3.1.1.2601021.jar` and a compatible OreSpawn JAR in the `mods` +This version uses OreSpawn `4.1.0.2602001`. Put +`BaseMetals-3.1.1.2602001.jar` and a compatible OreSpawn JAR in the `mods` directory. MMDLib and Additional Loot Tables must not be carried forward from an older installation. Mineralogy is optional. @@ -150,7 +150,7 @@ Forge item, block, and fluid tags are Base Metals' public compatibility API. Compatible tags and the existing recipe data for Mekanism, Thermal, Tinkers' Construct and Ender IO are retained, but their Java integrations are not enabled -in this Forge 26.1.2 port. Do not add jars made for older Minecraft versions or +in this Forge 26.2 port. Do not add jars made for older Minecraft versions or NeoForge to this instance. No optional integration API is required to compile or launch Base Metals. @@ -201,7 +201,7 @@ early splash window. Minecraft still opens its game window and runs the full world check. Ordinary client launches keep the normal splash screen. Release artifacts use Maven coordinate -`zone.moddev.mc.basemetals:BaseMetals:3.1.1.2601021`. +`zone.moddev.mc.basemetals:BaseMetals:3.1.1.2602001`. Report defects and compatibility problems through the [Base Metals issue tracker](https://github.com/MinecraftModDevelopmentMods/BaseMetals/issues). diff --git a/build.gradle b/build.gradle index 9e5e6f300..bf2e3ceb7 100644 --- a/build.gradle +++ b/build.gradle @@ -9,14 +9,14 @@ plugins { ext.mavenizerCompatibilityJar = layout.projectDirectory.file( 'ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar') ext.mavenizerCompatibilitySha256 = - 'BB0DACB3DEB2A711CA67DD402D5FDAB5A9847C37C7B9B596DEC7CF37378FA085' + '5ABAB52A3F1BE115381C3CE80D5FD38DBE6C9F4C0B9ECF70A957700EC90FB88B' ext.mavenizerFixtureChecksums = [ 'minecraft-mavenizer-0.5.21-orespawn-compat.jar': mavenizerCompatibilitySha256, - 'minecraft-source-compatibility.json': '21D1F5984E735BCEA1B1EFB9F965655796B39538FC91AAED1C3474004710423D', - 'minecraft-mavenizer-0.5.21-orespawn-compat.patch': '7C8EC895E79DF31AFD2CA3B505B43573C7052718A24050832189AAA2D3CC6137', + 'minecraft-source-compatibility.json': '9437E03FC5E1CB5D605D72F0538C4DF4417B64DB0A57D0AABDC5184781517AC1', + 'minecraft-mavenizer-0.5.21-orespawn-compat.patch': '2DA8DD0FD5F112F5B7591113AED06D9A58C584A25F8705E26445A6D2E9D5C78E', 'LICENSE-MAVENIZER.txt': '20C17D8B8C48A600800DFD14F95D5CB9FF47066A9641DDEAB48DC54AEC96E331', - 'README.md': '7686880D2B0F6BD6ACAFA4F0AB7585189767813174BC36DB675FEC0142440A77' + 'README.md': 'EAD1477F393897C491A10FB86178213A99C360571A8063D551DA0579DF65BA6F' ] // Mavenizer runs during configuration, so verify its inputs before configuring Forge. mavenizerFixtureChecksums.each { name, expected -> @@ -27,7 +27,7 @@ mavenizerFixtureChecksums.each { name, expected -> } } -// Forge 64 needs no source repairs. The sealed fixture records that result +// Forge 65 needs no source repairs. The sealed fixture records that result // and stays separate from the mod and its runtime dependencies. fgtools.configure('mavenizer') { classpath.from(mavenizerCompatibilityJar) diff --git a/ci-fixtures/tools/README.md b/ci-fixtures/tools/README.md index 4258c43c7..1365b4203 100644 --- a/ci-fixtures/tools/README.md +++ b/ci-fixtures/tools/README.md @@ -2,7 +2,7 @@ This directory contains a build-only derivative of MinecraftForge's MinecraftMavenizer `0.5.21`. It is used only while ForgeGradle prepares the -exact Forge `26.1.2-64.0.9` development dependency and is excluded from every +exact Forge `26.2-65.1.0` development dependency and is excluded from every OreSpawn publication artifact. ## Provenance and licence @@ -21,13 +21,13 @@ declaration and one accessor in that record. Missing, partial, duplicate or ambiguous states fail preparation. Targets without an explicit rule set are left unchanged. -Forge `26.1.2-64.0.9` compiles without source compatibility edits. Its explicit +Forge `26.2-65.1.0` compiles without source compatibility edits. Its explicit zero-rule entry proves that result is intentional and target-qualified rather than an accidental fall-through. A marker beside Mavenizer's output records the target and manifest SHA-256. Reprocessing the same source is idempotent. The derivative also propagates Gradle offline mode when the build sets -`ORESPAWN_MAVENIZER_OFFLINE=true`. Mavenizer, OreSpawn and Minecraft 26.1.2 all +`ORESPAWN_MAVENIZER_OFFLINE=true`. Mavenizer, OreSpawn and Minecraft 26.2 all run and compile with Java 25. ## Rebuild 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 37a70e0cc954621ee834782146c3bb7aa5d81209..b5f7fb50b4efd168da56917d7ef34be60b184315 100644 GIT binary patch delta 98702 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 delta 95383 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%0DR|5+r% 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 MO=WkgE6(!&5Av5+*8l(j 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 f8c2c8acb..b0c92c519 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 @@ -371,7 +371,7 @@ index 0000000..702d759 +{ + "schema": 1, + "targets": { -+ "net.minecraftforge:forge:26.1.2-64.0.9": { ++ "net.minecraftforge:forge:26.2-65.1.0": { + "expectedApplications": 0, + "rules": [] + } diff --git a/ci-fixtures/tools/minecraft-source-compatibility.json b/ci-fixtures/tools/minecraft-source-compatibility.json index 0901331f0..f6c049d6b 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:26.1.2-64.0.9": { + "net.minecraftforge:forge:26.2-65.1.0": { "expectedApplications": 0, "rules": [] } diff --git a/docs/COMPATIBILITY.md b/docs/COMPATIBILITY.md index 50fa1e123..cfcdf4f58 100644 --- a/docs/COMPATIBILITY.md +++ b/docs/COMPATIBILITY.md @@ -23,7 +23,7 @@ recycling recipes also accept the appropriate vanilla equivalent. The tags and existing integration data for Mekanism, Thermal, Tinkers' Construct and Ender IO remain available for future compatibility work. Their Java API hooks -and runtime jars are not included in this Forge 26.1.2 port. Do not substitute +and runtime jars are not included in this Forge 26.2 port. Do not substitute jars made for older Minecraft versions or NeoForge. Other processors can use the shared Forge tags without a direct Java integration. diff --git a/docs/MIGRATION.md b/docs/MIGRATION.md index 09d110c5a..9b3dcdfbf 100644 --- a/docs/MIGRATION.md +++ b/docs/MIGRATION.md @@ -2,7 +2,7 @@ Always upgrade a copy and retain the original legacy world. Install Base Metals 3.1.1 and OreSpawn 4.1.0, but do not carry MMDLib, Additional Loot Tables, the -OreSpawn 3 plugin, or the old native fallback generator into the 26.1.2 instance. +OreSpawn 3 plugin, or the old native fallback generator into the 26.2 instance. Minecraft's data fixer cannot identify third-party numeric block IDs from before the 1.13 flattening. Base Metals snapshots those positions, runs @@ -148,6 +148,11 @@ when the current world metadata confirms an upgrade from the previous storage format. The source files are kept for recovery. A modern world with leftover old files does not activate this step. +Minecraft 26.2 also moves world-generation settings, game rules and world clocks +out of `level.dat` into separate saved-data files. Minecraft handles that move +during the upgrade. Keep the whole world folder together rather than copying +an older `level.dat` over the upgraded save. + If an older single-player save has its player only in `level.dat`, Base Metals preserves a separate player file before Minecraft converts the folders. An existing player file always wins; a stale backup cannot restore an older player. diff --git a/docs/VERSIONS.md b/docs/VERSIONS.md index 15887a0e4..54b930f1b 100644 --- a/docs/VERSIONS.md +++ b/docs/VERSIONS.md @@ -1,22 +1,22 @@ # Supported versions -Base Metals `3.1.1.2601021` targets Minecraft 26.1.2, Forge 64.0.9 and Java 25. -Forge 64.1.5 is the additional compatibility target. -OreSpawn `4.1.0.2601021` is the exact build and test dependency. Clients and -servers need OreSpawn `[4.1.0.2601021,5.0.0)`. +Base Metals `3.1.1.2602001` targets Minecraft 26.2, Forge 65.1.0 and Java 25. +Forge 65.1.5 is the additional compatibility target. +OreSpawn `4.1.0.2602001` is the exact build and test dependency. Clients and +servers need OreSpawn `[4.1.0.2602001,5.0.0)`. -The pinned CurseForge artifact is project 245586, file 9299079: -`curse.maven:mmd-orespawn-245586:9299079`. +The pinned CurseForge artifact is project 245586, file 9332183: +`curse.maven:mmd-orespawn-245586:9332183`. Its SHA-256 is -`6D5CE2017C3314968083D140309E2F1A54BC239AC65C48944C995E9ECF937948`. +`F74785025898DF059E0F00F6ADA53364E07ECBBC306807ED7CD55350609E2547`. Release artifacts use Maven coordinate -`zone.moddev.mc.basemetals:BaseMetals:3.1.1.2601021`. +`zone.moddev.mc.basemetals:BaseMetals:3.1.1.2602001`. The provider remains schema 3, revision 1. OreSpawn 4.1 is needed for the configuration-screen API; the provider's eleven rule IDs and 1.18 distributions have not changed. -The data pack uses format `101.1`. Forge wraps client mod resources with the -native resource-pack format `84.0`. The resource metadata retains the minor -version rather than rounding the data format down to `101`. +The data pack uses format `107.1`. Forge wraps client mod resources with the +native resource-pack format `88.0`. The resource metadata retains the minor +version rather than rounding the data format down to `107`. diff --git a/docs/WORLDGEN.md b/docs/WORLDGEN.md index a6804c651..bd2909986 100644 --- a/docs/WORLDGEN.md +++ b/docs/WORLDGEN.md @@ -1,8 +1,8 @@ # OreSpawn world generation -Base Metals requires OreSpawn `[4.1.0.2601021,5.0.0)` and packages provider schema 3, +Base Metals requires OreSpawn `[4.1.0.2602001,5.0.0)` and packages provider schema 3, revision 1 at `data/basemetals/orespawn/provider.json`. Builds and tests use the -published OreSpawn `4.1.0.2601021` release. The provider is checked against the +published OreSpawn `4.1.0.2602001` release. The provider is checked against the included 4.1.0 schema. The provider declares ores only: it has no rocks, geomes, biome rules, terrain diff --git a/docs/schemas/orespawn-4.1.0/README.md b/docs/schemas/orespawn-4.1.0/README.md index a724e48f9..c7e20bdf1 100644 --- a/docs/schemas/orespawn-4.1.0/README.md +++ b/docs/schemas/orespawn-4.1.0/README.md @@ -1,9 +1,9 @@ # OreSpawn 4.1.0 schemas -These public schemas match OreSpawn 4.1.0.2601021. The Base Metals provider +These public schemas match OreSpawn 4.1.0.2602001. The Base Metals provider still uses schema 3 and revision 1; its ore rules have not changed. The build validates the provider against this snapshot. OreSpawn 4.1 is also needed for the Base Metals configuration button in its world-creation screen. -Source: [OreSpawn 4.1.0.2601021](https://github.com/MinecraftModDevelopmentMods/OreSpawn/releases/tag/4.1.0.2601021). +Source: [OreSpawn 4.1.0.2602001](https://github.com/MinecraftModDevelopmentMods/OreSpawn/releases/tag/4.1.0.2602001). diff --git a/gradle.properties b/gradle.properties index e905e3fba..06a4ea1b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,14 +11,14 @@ net.minecraftforge.gradle.merge-source-sets=true ## Environment Properties # The Minecraft version must agree with the Forge version to get a valid artifact -minecraft_version=26.1.2 +minecraft_version=26.2 # The Minecraft version range can use any release version of Minecraft as bounds. # Snapshots, pre-releases, and release candidates are not guaranteed to sort properly # as they do not follow standard versioning conventions. -minecraft_version_range=[26.1.2,26.2) +minecraft_version_range=[26.2,26.3) # The Forge version must agree with the Minecraft version to get a valid artifact -forge_version=64.0.9 -forge_installer_sha256=608BC9F028A0EF8DCD1A49C6EB85DDFCFA3B3BCD8AE27FC1B2AE02888ED8CB0A +forge_version=65.1.0 +forge_installer_sha256=813FBBFECC3086A492783B9F5023AE15007737B42E17AAB75F48BA77403314DF # Release metadata consumed by the generic dispatcher. loader_name=forge loader_code=1 @@ -29,14 +29,14 @@ curseforge_project_id=240967 # Exact released OreSpawn used for development and qualification. Runtime # metadata intentionally remains compatible with supported OreSpawn 4 builds. -orespawn_version=4.1.0.2601021 +orespawn_version=4.1.0.2602001 orespawn_curse_project_id=245586 -orespawn_curse_file_id=9299079 -orespawn_sha256=6D5CE2017C3314968083D140309E2F1A54BC239AC65C48944C995E9ECF937948 +orespawn_curse_file_id=9332183 +orespawn_sha256=F74785025898DF059E0F00F6ADA53364E07ECBBC306807ED7CD55350609E2547 # The Forge version range can use any version of Forge as bounds or match the loader version range -forge_version_range=[64.0.9,65) +forge_version_range=[65.1.0,66) # The loader version range can only use the major version of Forge/FML as bounds -loader_version_range=[64,65) +loader_version_range=[65,66) # The mapping channel to use for mappings. # The default set of supported mapping channels are ["official", "snapshot", "snapshot_nodoc", "stable", "stable_nodoc"]. # Additional mapping channels can be registered through the "channelProviders" extension in a Gradle plugin. @@ -54,7 +54,7 @@ loader_version_range=[64,65) mapping_channel=official # The mapping version to query from the mapping channel. # This must match the format required by the mapping channel. -mapping_version=26.1.2 +mapping_version=26.2 ## Mod Properties @@ -67,7 +67,7 @@ mod_name=Base Metals # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=LGPL-2.1 # The mod version. See https://semver.org/ -mod_version=3.1.1.2601021 +mod_version=3.1.1.2602001 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html @@ -77,7 +77,7 @@ mod_authors=Cyanobacterium, jriwanek, dshadowwolf, GetDizzy611, SkyBlade1978, th # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. mod_description=Adds historically common metals, fantasy metals, alloys, tools, armour, and OreSpawn-powered deposits. -# Forge 64 uses official runtime names. +# Forge 65 uses official runtime names. reobf=false -mcp_version=20260409.101008 +mcp_version=20260616.103818 java_setup_version=25.0.3+9.0.LTS diff --git a/gradle/README.md b/gradle/README.md index 5de5afe6a..c4ada76fd 100644 --- a/gradle/README.md +++ b/gradle/README.md @@ -32,7 +32,7 @@ flower, sapling and leaf tags include suitable new plants. Normal client and server launches load only Base Metals and OreSpawn. The optional-mod profile has its own run folder, but no optional integration mods -are pinned for Forge 26.1.2. The Mekanism, Tinkers, Thermal and Ender IO Java +are pinned for Forge 26.2. The Mekanism, Tinkers, Thermal and Ender IO Java integrations are not enabled here; their dormant data remains available for future integration work. diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 4da004036..1c8af9ad8 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -54,12 +54,12 @@ dependencies { implementation minecraft.dependency("net.minecraftforge:forge:${minecraft_version}-${forge_version}") // OreSpawn remains an ordinary hard mod dependency in metadata and is - // never shaded into Base Metals. Use the published 26.1.2 release in + // never shaded into Base Metals. Use the published 26.2 release in // development so clean checkouts exercise the same artifact as players. implementation "curse.maven:mmd-orespawn-${orespawn_curse_project_id}:${orespawn_curse_file_id}" orespawnRelease "curse.maven:mmd-orespawn-${orespawn_curse_project_id}:${orespawn_curse_file_id}" - // Optional Java integrations are not enabled in this Forge 26.1.2 port. + // Optional Java integrations are not enabled in this Forge 26.2 port. testImplementation platform('org.junit:junit-bom:5.10.2') testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.2' diff --git a/gradle/ide/eclipse.gradle b/gradle/ide/eclipse.gradle index fe1025132..bb25ef855 100644 --- a/gradle/ide/eclipse.gradle +++ b/gradle/ide/eclipse.gradle @@ -91,7 +91,7 @@ def verifyDevelopmentRunProfiles = tasks.register('verifyDevelopmentRunProfiles' || optionalDevelopmentArtifacts.any { expected -> !optionalClient.classpath.files.any { it.name.contains("${expected.module}-${expected.file}") } }) { - throw new GradleException('The optional client must load the pinned 26.1.2 dependencies') + throw new GradleException('The optional client must load the pinned 26.2 dependencies') } } } @@ -334,7 +334,7 @@ def verifyEclipseProductionClasspath = tasks.register('verifyEclipseProductionCl } } String metadata = new File(projectDir, 'bin/main/META-INF/mods.toml').getText('UTF-8') - if (metadata.contains('${') || !metadata.contains('version="3.1.1.2601021"')) { + if (metadata.contains('${') || !metadata.contains('version="3.1.1.2602001"')) { throw new GradleException('Eclipse output contains unresolved or invalid Base Metals version metadata') } } diff --git a/gradle/release/artifacts.gradle b/gradle/release/artifacts.gradle index 7911fecab..504d36778 100644 --- a/gradle/release/artifacts.gradle +++ b/gradle/release/artifacts.gradle @@ -184,7 +184,7 @@ tasks.register('verifyMavenCoordinates') { tasks.register('verifyMavenizerCompatibilityFixture') { group = 'verification' - description = 'Verifies the checksum-sealed Forge 26.1.2 Mavenizer compatibility fixture.' + description = 'Verifies the checksum-sealed Forge 26.2 Mavenizer compatibility fixture.' inputs.file project.ext.mavenizerCompatibilityJar doLast { File fixture = project.ext.mavenizerCompatibilityJar.asFile @@ -198,23 +198,23 @@ tasks.register('verifyMavenizerCompatibilityFixture') { tasks.register('verifyReleaseConfiguration') { group = 'verification' - description = 'Verifies the exact Base Metals 26.1.2 release identity.' + description = 'Verifies the exact Base Metals 26.2 release identity.' dependsOn tasks.named('verifyMavenizerCompatibilityFixture') dependsOn tasks.named('verifyJava25Toolchain') doLast { - if (configuredReleaseIdentity.modVersion != '3.1.1.2601021' + if (configuredReleaseIdentity.modVersion != '3.1.1.2602001' || configuredReleaseIdentity.modGroup != expectedMavenGroup - || configuredReleaseIdentity.minecraftVersion != '26.1.2' - || configuredReleaseIdentity.forgeVersion != '64.0.9' - || configuredReleaseIdentity.forgeInstallerSha256 != '608BC9F028A0EF8DCD1A49C6EB85DDFCFA3B3BCD8AE27FC1B2AE02888ED8CB0A' + || configuredReleaseIdentity.minecraftVersion != '26.2' + || configuredReleaseIdentity.forgeVersion != '65.1.0' + || configuredReleaseIdentity.forgeInstallerSha256 != '813FBBFECC3086A492783B9F5023AE15007737B42E17AAB75F48BA77403314DF' || configuredReleaseIdentity.mappingChannel != 'official' - || configuredReleaseIdentity.mappingVersion != '26.1.2' + || configuredReleaseIdentity.mappingVersion != '26.2' || configuredReleaseIdentity.loaderName != 'forge' || configuredReleaseIdentity.loaderCode != '1' || configuredReleaseIdentity.javaVersion != '25' || configuredReleaseIdentity.gradleJavaVersion != '25' || configuredReleaseIdentity.curseForgeProjectId != '240967') { - throw new GradleException('Unexpected Base Metals 26.1.2 release identity') + throw new GradleException('Unexpected Base Metals 26.2 release identity') } } } @@ -223,10 +223,10 @@ tasks.register('verifyReleaseDependencies') { group = 'verification' description = 'Resolves and verifies the exact released OreSpawn qualification dependency.' doLast { - if (configuredOreSpawnIdentity.version != '4.1.0.2601021' + if (configuredOreSpawnIdentity.version != '4.1.0.2602001' || configuredOreSpawnIdentity.curseProjectId != '245586' - || configuredOreSpawnIdentity.curseFileId != '9299079' - || configuredOreSpawnIdentity.sha256 != '6D5CE2017C3314968083D140309E2F1A54BC239AC65C48944C995E9ECF937948') { + || configuredOreSpawnIdentity.curseFileId != '9332183' + || configuredOreSpawnIdentity.sha256 != 'F74785025898DF059E0F00F6ADA53364E07ECBBC306807ED7CD55350609E2547') { throw new GradleException('Unexpected OreSpawn release coordinates') } File artifact = configurations.orespawnRelease.resolvedConfiguration.resolvedArtifacts @@ -320,14 +320,14 @@ tasks.register('verifyReleaseArtifacts') { if (manifest.mainAttributes.getValue('Maven-Artifact') != expectedMavenCoordinate) { throw new GradleException('Release manifest contains the wrong Maven coordinate') } - String expectedBuildTarget = 'minecraft-26.1.2-forge-64.0.9-java-25' + String expectedBuildTarget = 'minecraft-26.2-forge-65.1.0-java-25' if (manifest.mainAttributes.getValue('Build-Target') != expectedBuildTarget) { throw new GradleException('Release manifest contains the wrong stable build target') } String modsToml = zip.getInputStream(zip.getEntry('META-INF/mods.toml')).getText('UTF-8') if (modsToml.contains('${') - || !modsToml.contains('version="3.1.1.2601021"') - || !modsToml.contains('versionRange="[4.1.0.2601021,5.0.0)"')) { + || !modsToml.contains('version="3.1.1.2602001"') + || !modsToml.contains('versionRange="[4.1.0.2602001,5.0.0)"')) { throw new GradleException('Release mods.toml contains unresolved or incompatible metadata') } def provider = new JsonSlurper().parse(zip.getInputStream( diff --git a/gradle/verification/packaged-runtime.gradle b/gradle/verification/packaged-runtime.gradle index 5e353283f..bce75d64b 100644 --- a/gradle/verification/packaged-runtime.gradle +++ b/gradle/verification/packaged-runtime.gradle @@ -134,8 +134,8 @@ def packagedServerStartupSmoke = tasks.register('packagedServerStartupSmoke', Ex doFirst { File runtime = requireRuntimeDirectory(packagedForgeServerRuntime, 'packagedForgeServerRuntime') File libraries = new File(runtime, 'libraries') - File forgeDirectory = new File(libraries, 'net/minecraftforge/forge/26.1.2-64.0.9') - File launcher = new File(forgeDirectory, 'forge-26.1.2-64.0.9-server.jar') + File forgeDirectory = new File(libraries, 'net/minecraftforge/forge/26.2-65.1.0') + File launcher = new File(forgeDirectory, 'forge-26.2-65.1.0-server.jar') File sourceArguments = new File(forgeDirectory, System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows') ? 'win_args.txt' : 'unix_args.txt') @@ -174,9 +174,9 @@ def packagedServerStartupSmoke = tasks.register('packagedServerStartupSmoke', Ex if (!marker.isFile()) throw new GradleException('Packaged dedicated-server completion marker is missing') Properties values = new Properties() marker.withInputStream { values.load(it) } - if (values.getProperty('basemetals') != '3.1.1.2601021' - || values.getProperty('orespawn') != '4.1.0.2601021' - || values.getProperty('forge') != '64.0.9') { + if (values.getProperty('basemetals') != '3.1.1.2602001' + || values.getProperty('orespawn') != '4.1.0.2602001' + || values.getProperty('forge') != '65.1.0') { throw new GradleException("Packaged dedicated-server versions are wrong: ${values}") } verifyPackagedLog(runDirectory, 'BASEMETALS_PACKAGED_SERVER_SMOKE PASS', @@ -219,11 +219,11 @@ def preparePackagedClientSmoke = tasks.register('preparePackagedClientSmoke') { File hostPack = new File(runDirectory, 'resourcepacks/basemetals-host-test') File texture = new File(hostPack, 'assets/minecraft/textures/block/stone.png') texture.parentFile.mkdirs() - new java.util.zip.ZipFile(new File(runtime, 'versions/26.1.2/26.1.2.jar')).withCloseable { zip -> + new java.util.zip.ZipFile(new File(runtime, 'versions/26.2/26.2.jar')).withCloseable { zip -> texture.bytes = zip.getInputStream(zip.getEntry('assets/minecraft/textures/block/dirt.png')).bytes } new File(hostPack, 'pack.mcmeta').setText( - '{"pack":{"min_format":[75,0],"max_format":[75,0],"description":"Ore host replacement test"}}\n', 'UTF-8') + '{"pack":{"min_format":[88,0],"max_format":[88,0],"description":"Ore host replacement test"}}\n', 'UTF-8') new File(runDirectory, 'options.txt').append( 'resourcePacks:["vanilla","mod_resources","file/basemetals-host-test"]\n', 'UTF-8') } @@ -243,13 +243,13 @@ def packagedClientStartupSmoke = tasks.register('packagedClientStartupSmoke', Ex dependsOn preparePackagedClientSmoke doFirst { File runtime = requireRuntimeDirectory(packagedForgeClientRuntime, 'packagedForgeClientRuntime') - String forgeVersionId = ['26.1.2-forge-64.0.9', 'forge-64.0.9'].find { candidate -> + String forgeVersionId = ['26.2-forge-65.1.0', 'forge-65.1.0'].find { candidate -> new File(runtime, "versions/${candidate}/${candidate}.json").isFile() } - if (forgeVersionId == null) throw new GradleException('Official client runtime has no Forge 64.0.9 profile') + if (forgeVersionId == null) throw new GradleException('Official client runtime has no Forge 65.1.0 profile') File forgeJsonFile = new File(runtime, "versions/${forgeVersionId}/${forgeVersionId}.json") - File baseJsonFile = new File(runtime, 'versions/26.1.2/26.1.2.json') - File baseJar = new File(runtime, 'versions/26.1.2/26.1.2.jar') + File baseJsonFile = new File(runtime, 'versions/26.2/26.2.json') + File baseJar = new File(runtime, 'versions/26.2/26.2.jar') File nativesDirectory = new File(runtime, "natives/${forgeVersionId}") [forgeJsonFile, baseJsonFile, baseJar, new File(runtime, 'libraries'), new File(runtime, 'assets'), nativesDirectory].each { diff --git a/src/dataGenerator/java/zone/moddev/mc/basemetals/data/GeneratedData.java b/src/dataGenerator/java/zone/moddev/mc/basemetals/data/GeneratedData.java index 7d1169432..c2a34ed48 100644 --- a/src/dataGenerator/java/zone/moddev/mc/basemetals/data/GeneratedData.java +++ b/src/dataGenerator/java/zone/moddev/mc/basemetals/data/GeneratedData.java @@ -1621,7 +1621,7 @@ private void writeManifest(CachedOutput cache) throws IOException { JsonObject root = new JsonObject(); root.addProperty("format", 1); - root.addProperty("source", "Base Metals 26.1.2 catalogue"); + root.addProperty("source", "Base Metals 26.2 catalogue"); root.add("blocks", array(blocks)); root.add("items", array(items)); root.add("fluids", array(ModContent.fluids().keySet().stream().flatMap(id -> diff --git a/src/gametest/java/zone/moddev/mc/basemetals/content/BaseMetalsGameTests.java b/src/gametest/java/zone/moddev/mc/basemetals/content/BaseMetalsGameTests.java index b2be9fd83..85c6df11f 100644 --- a/src/gametest/java/zone/moddev/mc/basemetals/content/BaseMetalsGameTests.java +++ b/src/gametest/java/zone/moddev/mc/basemetals/content/BaseMetalsGameTests.java @@ -38,7 +38,7 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; @@ -137,7 +137,7 @@ Direction.WEST, new AABB(15.0D / 16.0D, 0, 0, 1, 1, 1), public static void humanDetectorIgnoresNonPlayers(GameTestHelper helper) { HumanDetectorBlock detector = (HumanDetectorBlock) ModContent.HUMAN_DETECTOR.get(); BlockPos position = helper.absolutePos(new BlockPos(1, 1, 1)); - helper.spawnWithNoFreeWill(EntityType.COW, 1.5F, 1.0F, 1.5F); + helper.spawnWithNoFreeWill(EntityTypes.COW, 1.5F, 1.0F, 1.5F); require(helper, detector.getSignalStrength(helper.getLevel(), position) == 0, "Human detector responded to a non-player entity"); @@ -593,7 +593,7 @@ public static void customAnvilsWearWithoutChangingTheirSavedIdentity(GameTestHel @GameTest(structure = EMPTY) public static void smithsRetainTheLegacyMercuryIngotSale(GameTestHelper helper) { - var trader = EntityType.VILLAGER.create(helper.getLevel(), net.minecraft.world.entity.EntitySpawnReason.COMMAND); + var trader = EntityTypes.VILLAGER.create(helper.getLevel(), net.minecraft.world.entity.EntitySpawnReason.COMMAND); var parameters = new net.minecraft.world.level.storage.loot.LootParams.Builder(helper.getLevel()) .withParameter(net.minecraft.world.level.storage.loot.parameters.LootContextParams.ORIGIN, trader.position()) .withParameter(net.minecraft.world.level.storage.loot.parameters.LootContextParams.THIS_ENTITY, trader) @@ -808,7 +808,7 @@ public static void armorToolEffectsAndStarsteelRegenerationAreServerAuthoritativ require(helper, armor.getDamageValue() == 5, "Starsteel armor regenerated despite the armor exclusion"); - LivingEntity target = helper.spawnWithNoFreeWill(EntityType.IRON_GOLEM, 2.0F, 1.0F, 2.0F); + LivingEntity target = helper.spawnWithNoFreeWill(EntityTypes.IRON_GOLEM, 2.0F, 1.0F, 2.0F); player.setItemInHand(InteractionHand.MAIN_HAND, ModContent.item("adamantine_sword").get().getDefaultInstance()); LivingHurtEvent hurt = new LivingHurtEvent(target, player.damageSources().playerAttack(player), 3.0F); @@ -863,7 +863,7 @@ public static void remainingLegacyMeleeEffectsUseTargetIdentity(GameTestHelper h BaseMetalsEvents events = new BaseMetalsEvents(); ServerPlayer player = survivalPlayer(helper); - LivingEntity aquatic = helper.spawnWithNoFreeWill(EntityType.COD, 2.0F, 1.0F, 2.0F); + LivingEntity aquatic = helper.spawnWithNoFreeWill(EntityTypes.COD, 2.0F, 1.0F, 2.0F); player.setItemInHand(InteractionHand.MAIN_HAND, ModContent.item("aquarium_sword").get().getDefaultInstance()); LivingHurtEvent aquariumHit = new LivingHurtEvent(aquatic, player.damageSources().playerAttack(player), 3.0F); @@ -871,7 +871,7 @@ public static void remainingLegacyMeleeEffectsUseTargetIdentity(GameTestHelper h require(helper, aquariumHit.getAmount() == 7.0F, "Aquarium melee bonus did not use the target's water-breathing identity"); - LivingEntity blaze = helper.spawnWithNoFreeWill(EntityType.BLAZE, 3.0F, 1.0F, 2.0F); + LivingEntity blaze = helper.spawnWithNoFreeWill(EntityTypes.BLAZE, 3.0F, 1.0F, 2.0F); player.setItemInHand(InteractionHand.MAIN_HAND, ModContent.item("coldiron_sword").get().getDefaultInstance()); LivingHurtEvent coldIronHit = new LivingHurtEvent(blaze, player.damageSources().playerAttack(player), 3.0F); @@ -879,7 +879,7 @@ public static void remainingLegacyMeleeEffectsUseTargetIdentity(GameTestHelper h require(helper, coldIronHit.getAmount() == 6.0F, "Cold Iron melee bonus did not use the target's fire immunity"); - LivingEntity undead = helper.spawnWithNoFreeWill(EntityType.ZOMBIE, 4.0F, 1.0F, 2.0F); + LivingEntity undead = helper.spawnWithNoFreeWill(EntityTypes.ZOMBIE, 4.0F, 1.0F, 2.0F); player.setItemInHand(InteractionHand.MAIN_HAND, ModContent.item("mithril_sword").get().getDefaultInstance()); LivingHurtEvent mithrilHit = new LivingHurtEvent(undead, player.damageSources().playerAttack(player), 3.0F); @@ -1122,7 +1122,7 @@ public static void fullyDrawnWeaponsApplyMaterialDamageBeforePower(GameTestHelpe MaterialProjectile projectile = projectiles.getFirst(); require(helper, projectile.isOnFire() == (power > 0), launcher + " did not apply Flame at launch"); - var target = EntityType.ZOMBIE.create(helper.getLevel(), net.minecraft.world.entity.EntitySpawnReason.COMMAND); + var target = EntityTypes.ZOMBIE.create(helper.getLevel(), net.minecraft.world.entity.EntitySpawnReason.COMMAND); double damage = EnchantmentHelper.modifyDamage(helper.getLevel(), projectile.getWeaponItem(), target, helper.getLevel().damageSources().arrow(projectile, player), (float) baseDamage); var vanilla = ((net.minecraft.world.item.ArrowItem) Items.ARROW) diff --git a/src/gametest/java/zone/moddev/mc/basemetals/content/ForwardPortGameTests.java b/src/gametest/java/zone/moddev/mc/basemetals/content/ForwardPortGameTests.java index c1f0ff169..46a95d018 100644 --- a/src/gametest/java/zone/moddev/mc/basemetals/content/ForwardPortGameTests.java +++ b/src/gametest/java/zone/moddev/mc/basemetals/content/ForwardPortGameTests.java @@ -136,7 +136,7 @@ public static void vanillaCopperKeepsExistingRecipeChainsUsable(GameTestHelper h "Copper plate crafting rejected a supported ingot"); } - for (var entry : java.util.Map.of(Items.COPPER_TRAPDOOR, 3, + for (var entry : java.util.Map.of(Items.COPPER_TRAPDOOR.weathering().unaffected(), 3, ModContent.item("copper_trapdoor").get(), 4).entrySet()) { var input = new SingleRecipeInput(entry.getKey().getDefaultInstance()); ItemStack recycled = level.getServer().getRecipeManager().getRecipeFor(RecipeType.SMELTING, diff --git a/src/gametest/java/zone/moddev/mc/basemetals/content/NativeComponentGameTests.java b/src/gametest/java/zone/moddev/mc/basemetals/content/NativeComponentGameTests.java index 520d72eee..3193a88bf 100644 --- a/src/gametest/java/zone/moddev/mc/basemetals/content/NativeComponentGameTests.java +++ b/src/gametest/java/zone/moddev/mc/basemetals/content/NativeComponentGameTests.java @@ -9,7 +9,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.CustomData; import net.minecraft.world.item.crafting.Recipe; @@ -197,8 +197,8 @@ public static void oldEmbeddedBoltsKeepTheirCustomItemData(GameTestHelper helper public static void projectilesKeepWeaponEnchantmentsAfterReload(GameTestHelper helper) { var level = helper.getLevel(); var enchantments = level.registryAccess().lookupOrThrow(Registries.ENCHANTMENT); - var shooter = EntityType.ZOMBIE.create(level, net.minecraft.world.entity.EntitySpawnReason.COMMAND); - var target = EntityType.ZOMBIE.create(level, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + var shooter = EntityTypes.ZOMBIE.create(level, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + var target = EntityTypes.ZOMBIE.create(level, net.minecraft.world.entity.EntitySpawnReason.COMMAND); for (boolean bolt : new boolean[] {false, true}) { ItemStack weapon = ModContent.item("steel_" + (bolt ? "crossbow" : "bow")).get().getDefaultInstance(); diff --git a/src/generated/resources/data/basemetals/registry_manifest.json b/src/generated/resources/data/basemetals/registry_manifest.json index 525ccb8da..618609d91 100644 --- a/src/generated/resources/data/basemetals/registry_manifest.json +++ b/src/generated/resources/data/basemetals/registry_manifest.json @@ -1735,5 +1735,5 @@ "basemetals:wood", "basemetals:stone" ], - "source": "Base Metals 26.1.2 catalogue" + "source": "Base Metals 26.2 catalogue" } \ No newline at end of file diff --git a/src/integratedSmoke/java/zone/moddev/mc/basemetals/smoke/ConfigScreenSmoke.java b/src/integratedSmoke/java/zone/moddev/mc/basemetals/smoke/ConfigScreenSmoke.java index d30e35aa0..9f2b0e20a 100644 --- a/src/integratedSmoke/java/zone/moddev/mc/basemetals/smoke/ConfigScreenSmoke.java +++ b/src/integratedSmoke/java/zone/moddev/mc/basemetals/smoke/ConfigScreenSmoke.java @@ -38,7 +38,7 @@ private static void verifyOnce(Minecraft minecraft, Screen parent) { String originalMode = BaseMetalsConfig.CONTENT_MODE.get(); boolean originalEffects = BaseMetalsConfig.SPECIAL_EFFECTS.get(); ContentMode activeMode = BaseMetalsConfig.activeMode(); - minecraft.setScreen(screen); + minecraft.gui.setScreen(screen); require(buttons(screen).size() == 9, "Expected the mode, four switches and four action buttons"); String initialLabel = buttons(screen).get(0).getMessage().getString(); buttons(screen).get(0).onPress(new net.minecraft.client.input.KeyEvent(257, 0, 0)); @@ -49,23 +49,23 @@ private static void verifyOnce(Minecraft minecraft, Screen parent) { require(buttons(screen).get(0).getMessage().getString().contains(I18n.get(ContentMode.HIGH_FANTASY.translationKey())), "Defaults must select High Fantasy"); screen.onClose(); - require(minecraft.screen == parent, "Cancel did not return to the parent screen"); + require(minecraft.gui.screen() == parent, "Cancel did not return to the parent screen"); require(originalMode.equals(BaseMetalsConfig.CONTENT_MODE.get()), "Cancel saved pending edits"); screen = extensions.get(0).createScreen(parent); - minecraft.setScreen(screen); + minecraft.gui.setScreen(screen); buttons(screen).get(1).onPress(new net.minecraft.client.input.KeyEvent(257, 0, 0)); button(screen, "gui.done").onPress(new net.minecraft.client.input.KeyEvent(257, 0, 0)); - require(minecraft.screen == parent, "Done did not return to the parent screen"); + require(minecraft.gui.screen() == parent, "Done did not return to the parent screen"); require(BaseMetalsConfig.SPECIAL_EFFECTS.get() != originalEffects, "Done did not save a boolean edit"); screen = extensions.get(0).createScreen(parent); - minecraft.setScreen(screen); + minecraft.gui.setScreen(screen); buttons(screen).get(0).onPress(new net.minecraft.client.input.KeyEvent(257, 0, 0)); button(screen, "gui.done").onPress(new net.minecraft.client.input.KeyEvent(257, 0, 0)); - require(minecraft.screen instanceof ConfirmScreen, "A mode change needs restart confirmation"); - button(minecraft.screen, "gui.yes").onPress(new net.minecraft.client.input.KeyEvent(257, 0, 0)); - require(minecraft.screen == parent, "Confirmation did not return to the parent screen"); + require(minecraft.gui.screen() instanceof ConfirmScreen, "A mode change needs restart confirmation"); + button(minecraft.gui.screen(), "gui.yes").onPress(new net.minecraft.client.input.KeyEvent(257, 0, 0)); + require(minecraft.gui.screen() == parent, "Confirmation did not return to the parent screen"); require(!originalMode.equals(BaseMetalsConfig.CONTENT_MODE.get()), "Done did not save the mode edit"); require(BaseMetalsConfig.activeMode() == activeMode, "A GUI edit changed the running content mode"); diff --git a/src/integratedSmoke/java/zone/moddev/mc/basemetals/smoke/IntegratedWorldSmoke.java b/src/integratedSmoke/java/zone/moddev/mc/basemetals/smoke/IntegratedWorldSmoke.java index a5f767f4f..71c1e82e6 100644 --- a/src/integratedSmoke/java/zone/moddev/mc/basemetals/smoke/IntegratedWorldSmoke.java +++ b/src/integratedSmoke/java/zone/moddev/mc/basemetals/smoke/IntegratedWorldSmoke.java @@ -77,8 +77,8 @@ public static void onClientTick(TickEvent.ClientTickEvent.Post event) { Minecraft minecraft = Minecraft.getInstance(); minecraft.options.pauseOnLostFocus = false; - if (minecraft.screen instanceof net.minecraft.client.gui.screens.AccessibilityOnboardingScreen) { - minecraft.screen.onClose(); + if (minecraft.gui.screen() instanceof net.minecraft.client.gui.screens.AccessibilityOnboardingScreen) { + minecraft.gui.screen().onClose(); return; } elapsedTicks++; @@ -95,17 +95,17 @@ public static void onClientTick(TickEvent.ClientTickEvent.Post event) { BaseMetals.LOGGER.info("BASEMETALS_CLIENT_PROFILE PASS mods={}", actual); } } - if (!renderLayersChecked && minecraft.screen instanceof TitleScreen) { + if (!renderLayersChecked && minecraft.gui.screen() instanceof TitleScreen) { verifyBlockRenderLayers(minecraft); renderLayersChecked = true; } if (!creationStarted && elapsedTicks % 200 == 0) { BaseMetals.LOGGER.info("BASEMETALS_INTEGRATED_SMOKE waiting for title screen current={} overlay={}", - minecraft.screen == null ? "none" : minecraft.screen.getClass().getName(), - minecraft.getOverlay() == null ? "none" : minecraft.getOverlay().getClass().getName()); + minecraft.gui.screen() == null ? "none" : minecraft.gui.screen().getClass().getName(), + minecraft.gui.overlay() == null ? "none" : minecraft.gui.overlay().getClass().getName()); } - if (!creationStarted && minecraft.screen instanceof TitleScreen && minecraft.getOverlay() == null) { - ConfigScreenSmoke.verify(minecraft, minecraft.screen); + if (!creationStarted && minecraft.gui.screen() instanceof TitleScreen && minecraft.gui.overlay() == null) { + ConfigScreenSmoke.verify(minecraft, minecraft.gui.screen()); verifyOreOverlayModels(minecraft); verifyBarsModels(minecraft); creationStarted = true; @@ -126,23 +126,23 @@ public static void onClientTick(TickEvent.ClientTickEvent.Post event) { BaseMetals.LOGGER.info("BASEMETALS_INTEGRATED_SMOKE creating world={}", worldName); minecraft.createWorldOpenFlows().createFreshLevel(worldName, levelSettings, new net.minecraft.world.level.levelgen.WorldOptions(0L, true, false), - net.minecraft.world.level.levelgen.presets.WorldPresets::createNormalWorldDimensions, minecraft.screen); + net.minecraft.world.level.levelgen.presets.WorldPresets::createNormalWorldDimensions, minecraft.gui.screen()); } - if (creationStarted && minecraft.screen instanceof net.minecraft.client.gui.screens.ConfirmScreen) { - String title = minecraft.screen.getTitle().getString(); + if (creationStarted && minecraft.gui.screen() instanceof net.minecraft.client.gui.screens.ConfirmScreen) { + String title = minecraft.gui.screen().getTitle().getString(); boolean finishedUpgrade = Boolean.getBoolean("basemetals.integratedExistingWorldSmoke") && title.equals(net.minecraft.client.resources.language.I18n.get("upgradeWorld.done")); if (!finishedUpgrade && !title.toLowerCase(java.util.Locale.ROOT).contains("experimental")) { throw new IllegalStateException("Unexpected confirmation in the disposable world: " + title); } // Forge marks modded registries experimental. This applies only to the new smoke-test world. - minecraft.screen.children().stream().filter(net.minecraft.client.gui.components.Button.class::isInstance) + minecraft.gui.screen().children().stream().filter(net.minecraft.client.gui.components.Button.class::isInstance) .map(net.minecraft.client.gui.components.Button.class::cast).findFirst().orElseThrow().onPress(new net.minecraft.client.input.KeyEvent(257, 0, 0)); } if (creationStarted && Boolean.getBoolean("basemetals.integratedExistingWorldSmoke") - && minecraft.screen instanceof net.minecraft.client.gui.screens.BackupConfirmScreen backup) { + && minecraft.gui.screen() instanceof net.minecraft.client.gui.screens.BackupConfirmScreen backup) { backup.children().stream().filter(net.minecraft.client.gui.components.Button.class::isInstance) .map(net.minecraft.client.gui.components.Button.class::cast) .filter(button -> button.getMessage().getString().equals( diff --git a/src/main/java/zone/moddev/mc/basemetals/BaseMetalsAdvancements.java b/src/main/java/zone/moddev/mc/basemetals/BaseMetalsAdvancements.java index 9f739e64f..ce4fd588e 100644 --- a/src/main/java/zone/moddev/mc/basemetals/BaseMetalsAdvancements.java +++ b/src/main/java/zone/moddev/mc/basemetals/BaseMetalsAdvancements.java @@ -70,7 +70,8 @@ static void onSmelted(ServerPlayer player, ItemStack result) { static void onPlaced(ServerPlayer player, BlockState state) { Identifier id = ForgeRegistries.BLOCKS.getKey(state.getBlock()); if (id != null && (id.getNamespace().equals(BaseMetals.MOD_ID) - || state.is(net.minecraft.world.level.block.Blocks.COPPER_BLOCK)) && state.is(STORAGE_BLOCKS)) { + || state.is(net.minecraft.world.level.block.Blocks.COPPER_BLOCK.weathering().unaffected())) + && state.is(STORAGE_BLOCKS)) { award(player, "blocktastic"); } } diff --git a/src/main/java/zone/moddev/mc/basemetals/client/BaseMetalsConfigScreen.java b/src/main/java/zone/moddev/mc/basemetals/client/BaseMetalsConfigScreen.java index b831d5826..1bcf1adc4 100644 --- a/src/main/java/zone/moddev/mc/basemetals/client/BaseMetalsConfigScreen.java +++ b/src/main/java/zone/moddev/mc/basemetals/client/BaseMetalsConfigScreen.java @@ -91,7 +91,7 @@ private void initLabels() { private void done() { if (edits.modeChanged()) { - minecraft.setScreen(new ConfirmScreen(this::confirmResult, + minecraft.gui.setScreen(new ConfirmScreen(this::confirmResult, Component.translatable(PREFIX + "confirm.title"), Component.translatable(PREFIX + "confirm.message"))); } else { @@ -103,7 +103,7 @@ private void confirmResult(boolean accepted) { if (accepted) { saveAndClose(); } else { - minecraft.setScreen(this); + minecraft.gui.setScreen(this); } } @@ -117,7 +117,7 @@ private void saveAndClose() { @Override public void onClose() { - minecraft.setScreen(parent); + minecraft.gui.setScreen(parent); } @Override diff --git a/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalBucketItem.java b/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalBucketItem.java index de1586253..427693940 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalBucketItem.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalBucketItem.java @@ -5,7 +5,7 @@ import javax.annotation.Nullable; -import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.advancements.triggers.CriteriaTriggers; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 9f63f5a3f..1b932ddd2 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -14,7 +14,7 @@ description='''${mod_description}''' [[dependencies.${mod_id}]] modId="orespawn" mandatory=true -versionRange="[4.1.0.2601021,5.0.0)" +versionRange="[4.1.0.2602001,5.0.0)" ordering="AFTER" side="BOTH" diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index ac441d481..9ea2b4f5f 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,7 +1,7 @@ { "pack": { "description": "${mod_id} resources", - "min_format": [101, 1], - "max_format": [101, 1] + "min_format": [107, 1], + "max_format": [107, 1] } } diff --git a/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/RemoteLoginSmoke.java b/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/RemoteLoginSmoke.java index f7d52008b..ca4c4cd5d 100644 --- a/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/RemoteLoginSmoke.java +++ b/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/RemoteLoginSmoke.java @@ -28,15 +28,15 @@ public static void tick(TickEvent.ClientTickEvent.Post event) { if (completed || !Boolean.getBoolean("basemetals.remoteLoginSmoke")) return; Minecraft minecraft = Minecraft.getInstance(); if (++ticks > 3600) throw new IllegalStateException("MODE_LOGIN_SMOKE FAIL: timed out at " - + (minecraft.screen == null ? "gameplay" : minecraft.screen.getClass().getName())); + + (minecraft.gui.screen() == null ? "gameplay" : minecraft.gui.screen().getClass().getName())); boolean reject = Boolean.getBoolean("basemetals.expectModeReject"); - if (!connecting && minecraft.screen instanceof TitleScreen) { + if (!connecting && minecraft.gui.screen() instanceof TitleScreen) { // Wait until the loading overlay is gone, as a player would have to. - if (minecraft.getOverlay() != null || ++titleTicks < 20) return; + if (minecraft.gui.overlay() != null || ++titleTicks < 20) return; connecting = true; String address = System.getProperty("basemetals.remoteAddress"); - ConnectScreen.startConnecting(minecraft.screen, minecraft, ServerAddress.parseString(address), + ConnectScreen.startConnecting(minecraft.gui.screen(), minecraft, ServerAddress.parseString(address), new net.minecraft.client.multiplayer.ServerData("Base Metals smoke", address, net.minecraft.client.multiplayer.ServerData.Type.OTHER), false, null); } @@ -57,7 +57,7 @@ public static void tick(TickEvent.ClientTickEvent.Post event) { } else { finish(minecraft, "connected"); } - } else if (minecraft.screen instanceof DisconnectedScreen disconnected) { + } else if (minecraft.gui.screen() instanceof DisconnectedScreen disconnected) { String reason = disconnected.getNarrationMessage().getString(); if (!reject || !reason.contains("Base Metals") diff --git a/src/packagedClientSmoke/packaged-resources/META-INF/mods.toml b/src/packagedClientSmoke/packaged-resources/META-INF/mods.toml index 53cfb688c..6ad3ab50d 100644 --- a/src/packagedClientSmoke/packaged-resources/META-INF/mods.toml +++ b/src/packagedClientSmoke/packaged-resources/META-INF/mods.toml @@ -10,13 +10,13 @@ displayName="Base Metals packaged client smoke" [[dependencies.basemetals_client_smoke]] modId="basemetals" mandatory=true -versionRange="[3.1.1.2601021]" +versionRange="[3.1.1.2602001]" ordering="AFTER" side="CLIENT" [[dependencies.basemetals_client_smoke]] modId="orespawn" mandatory=true -versionRange="[4.1.0.2601021]" +versionRange="[4.1.0.2602001]" ordering="AFTER" side="CLIENT" diff --git a/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedServerSmoke.java b/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedServerSmoke.java index 4da0534b4..cb5cdfff3 100644 --- a/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedServerSmoke.java +++ b/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedServerSmoke.java @@ -40,7 +40,7 @@ public PackagedServerSmoke() { public void onServerStarted(ServerStartedEvent event) { String baseMetals = version("basemetals"); String oreSpawn = version("orespawn"); - if (!"3.1.1.2601021".equals(baseMetals) || !"4.1.0.2601021".equals(oreSpawn)) { + if (!"3.1.1.2602001".equals(baseMetals) || !"4.1.0.2602001".equals(oreSpawn)) { throw new IllegalStateException("PACKAGED_SERVER_SMOKE FAIL versions basemetals=" + baseMetals + " orespawn=" + oreSpawn); } @@ -176,7 +176,7 @@ private static void verifyOreSample(net.minecraft.server.MinecraftServer server) } private static void verifyTinkers() { - throw new IllegalStateException("Tinkers integration is not enabled in this Forge 26.1.2 build"); + throw new IllegalStateException("Tinkers integration is not enabled in this Forge 26.2 build"); } private static void verifyModernFlatTerrain(net.minecraft.server.MinecraftServer server) { diff --git a/src/packagedServerSmoke/packaged-resources/META-INF/mods.toml b/src/packagedServerSmoke/packaged-resources/META-INF/mods.toml index 15f050e2b..898db2c93 100644 --- a/src/packagedServerSmoke/packaged-resources/META-INF/mods.toml +++ b/src/packagedServerSmoke/packaged-resources/META-INF/mods.toml @@ -10,13 +10,13 @@ displayName="Base Metals packaged server smoke" [[dependencies.basemetals_server_smoke]] modId="basemetals" mandatory=true -versionRange="[3.1.1.2601021]" +versionRange="[3.1.1.2602001]" ordering="AFTER" side="SERVER" [[dependencies.basemetals_server_smoke]] modId="orespawn" mandatory=true -versionRange="[4.1.0.2601021]" +versionRange="[4.1.0.2602001]" ordering="AFTER" side="SERVER" diff --git a/src/smoke/datapack/pack.mcmeta b/src/smoke/datapack/pack.mcmeta index ddd71fd27..0b61bc891 100644 --- a/src/smoke/datapack/pack.mcmeta +++ b/src/smoke/datapack/pack.mcmeta @@ -1,7 +1,7 @@ { "pack": { - "min_format": [101, 1], - "max_format": [101, 1], + "min_format": [107, 1], + "max_format": [107, 1], "description": "Base Metals custom ordinary dimension smoke fixture" } } diff --git a/src/test/java/zone/moddev/mc/basemetals/data/Minecraft1211ResourceTest.java b/src/test/java/zone/moddev/mc/basemetals/data/Minecraft1211ResourceTest.java index 52c3bc462..95c17fc82 100644 --- a/src/test/java/zone/moddev/mc/basemetals/data/Minecraft1211ResourceTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/data/Minecraft1211ResourceTest.java @@ -14,14 +14,14 @@ class Minecraft1211ResourceTest { @Test - void resourceAndDataPacksUseThe2612Formats() throws Exception { + void resourceAndDataPacksUseThe262Formats() throws Exception { var pack = read("src/main/resources/pack.mcmeta").getAsJsonObject("pack"); - assertEquals("[101,1]", pack.get("min_format").toString()); - assertEquals("[101,1]", pack.get("max_format").toString()); + assertEquals("[107,1]", pack.get("min_format").toString()); + assertEquals("[107,1]", pack.get("max_format").toString()); net.minecraft.SharedConstants.tryDetectVersion(); var resources = net.minecraft.SharedConstants.getCurrentVersion() .packVersion(net.minecraft.server.packs.PackType.CLIENT_RESOURCES); - assertEquals(84, resources.major()); + assertEquals(88, resources.major()); assertEquals(0, resources.minor()); } diff --git a/src/test/java/zone/moddev/mc/basemetals/migration/LegacyMigrationSafetyTest.java b/src/test/java/zone/moddev/mc/basemetals/migration/LegacyMigrationSafetyTest.java index b9cf34baf..402af8953 100644 --- a/src/test/java/zone/moddev/mc/basemetals/migration/LegacyMigrationSafetyTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/migration/LegacyMigrationSafetyTest.java @@ -100,7 +100,7 @@ void modernExternalChunk() throws Exception { @Test void modernLz4Chunk() throws Exception { - assumeTrue(VERSION.equals("1.20.6") || VERSION.equals("1.21.11") || VERSION.equals("26.1.2"), "Native LZ4 is not available on older targets"); + assumeTrue(VERSION.equals("1.20.6") || VERSION.equals("1.21.11") || VERSION.equals("26.2"), "Native LZ4 is not available on older targets"); Path world = world("lz4", false); Path file = region(world, false, true); assertTrue(nativeAccepts(file, false)); @@ -177,7 +177,7 @@ void savedRegistryCanBeScannedWithAnEmptyRegion() throws Exception { @Test void savedRegistryCanBeScannedWithLz4Chunks() throws Exception { - assumeTrue(VERSION.equals("1.20.6") || VERSION.equals("1.21.11") || VERSION.equals("26.1.2")); + assumeTrue(VERSION.equals("1.20.6") || VERSION.equals("1.21.11") || VERSION.equals("26.2")); Path world = world("saved-registry-lz4", false); writeRegistry(world.resolve("basemetals-legacy-registry.dat")); Path file = region(world, false, true); diff --git a/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldStorageTest.java b/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldStorageTest.java index da6540b23..dbda7d46d 100644 --- a/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldStorageTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldStorageTest.java @@ -53,6 +53,21 @@ void modernWorldNeverImportsALeftoverLegacyCapabilityFile() throws Exception { assertFalse(Files.exists(world.resolve("basemetals-legacy-registry.dat"))); } + @Test + void firstNativeStorageVersionDoesNotImportStaleFiles() throws Exception { + embeddedPlayer(42); + CompoundTag root = LegacyNbt.readCompressed(world.resolve("level.dat").toFile()); + root.getCompoundOrEmpty("Data").putInt("DataVersion", 4772); + LegacyNbt.writeCompressed(root, world.resolve("level.dat").toFile()); + capability("data/capabilities.dat", 1); + + prepare(); + + assertFalse(Files.exists(world.resolve("playerdata"))); + assertFalse(Files.exists(world.resolve("dimensions/minecraft/overworld/data/forge/capabilities.dat"))); + assertFalse(Files.exists(world.resolve("basemetals-legacy-registry.dat"))); + } + @Test void metadataWithoutAPositiveVersionDoesNotActivateStorageMigration() throws Exception { try (var output = Files.newOutputStream(world.resolve("level.dat"))) { diff --git a/tools/validation/README.md b/tools/validation/README.md index 08ac0de0b..749f15b7e 100644 --- a/tools/validation/README.md +++ b/tools/validation/README.md @@ -1,11 +1,11 @@ # World upgrade checks -`test_legacy_worlds.js` starts the packaged Forge 26.1.2 server against a fresh +`test_legacy_worlds.js` starts the packaged Forge 26.2 server against a fresh copy of each supplied world, then starts it again to check the saved result. It refuses to overwrite an existing test directory and fingerprints every source world before and after the test. -An optional `forgeVersion` selects another installed Forge 26.1.2 build for -compatibility checks; the default is the compilation target, `64.0.9`. +An optional `forgeVersion` selects another installed Forge 26.2 build for +compatibility checks; the default is the compilation target, `65.1.0`. Pass a local JSON specification containing `java` (the Java 25 executable), `serverRuntime`, `output`, `modJar`, `probeJar`, `oreSpawn` (a `path` and `sha256`), and a `profiles` list. @@ -25,6 +25,11 @@ The log check accepts known vanilla registry changes, including paintings moved to data files. Unknown or modded entries still fail the test. Check that boundary with `node --test tools/validation/test_painting_registry.js`. +On Windows, the exact missing-Perflib-counter diagnostic from Minecraft's system +probe is reported separately. It is not accepted on Linux, from another logger +or as a fatal error. Run `node --test tools/validation/test_runtime_log.js` to +check those limits; other runtime errors still fail the suite. + `compare_world_terrain.py` checks fixed vanilla terrain before and after conversion. It accepts Minecraft's new underground floor and accounts for normal falling sand and gravel, but rejects ore replacing existing rock. diff --git a/tools/validation/runtime_log.js b/tools/validation/runtime_log.js new file mode 100644 index 000000000..ef905e64f --- /dev/null +++ b/tools/validation/runtime_log.js @@ -0,0 +1,9 @@ +'use strict'; + +// Minecraft's system probe may report missing Windows performance-counter names. +function isWindowsCounterDiagnostic(line, platform = process.platform) { + return platform === 'win32' + && /\/ERROR\] \[(?:oshi\.driver\.windows\.registry\.HkeyPerformanceDataUtil|os\.dr\.wi\.re\.HkeyPerformanceDataUtil)\/\]: Unable to locate English counter names in registry Perflib 009\. Counters may need to be rebuilt: $/.test(line); +} + +module.exports = { isWindowsCounterDiagnostic }; diff --git a/tools/validation/test_content_modes.js b/tools/validation/test_content_modes.js index de7a83816..b9b4de559 100644 --- a/tools/validation/test_content_modes.js +++ b/tools/validation/test_content_modes.js @@ -94,7 +94,7 @@ function verifyConfig(directory, initial) { (async () => { const results = []; - const client = clientLaunch(spec.clientRuntime, '26.1.2', '64.0.9'); + const client = clientLaunch(spec.clientRuntime, '26.2', '65.1.0'); const selected = spec.cases ? cases.filter(([name]) => spec.cases.includes(name)) : cases; if (!selected.length || (spec.cases && selected.length !== spec.cases.length)) { throw new Error('The requested mode-test case is unknown or duplicated.'); @@ -114,14 +114,14 @@ function verifyConfig(directory, initial) { + 'generator-settings={"layers":[{"block":"minecraft:bedrock","height":1},{"block":"minecraft:dirt","height":2},{"block":"minecraft:grass_block","height":1}],"biome":"minecraft:plains"}\n' + 'generate-structures=false\nmax-tick-time=-1\n'); const server = launch(serverDir, ['-Xms256m', '-Xmx2g', '-Dbasemetals.awaitLoginSmoke=true', - ...serverArguments(spec.serverRuntime, serverDir, '26.1.2', '64.0.9')], 'server.log'); + ...serverArguments(spec.serverRuntime, serverDir, '26.2', '65.1.0')], 'server.log'); let player; try { await waitFor(server, 'BASEMETALS_PACKAGED_SERVER_SMOKE PASS', 240000); player = launch(clientDir, ['-Xms512m', '-Xmx2g', '-Dbasemetals.remoteLoginSmoke=true', `-Dbasemetals.remoteAddress=127.0.0.1:${port}`, `-Dbasemetals.loginSmokeConnections=${reject ? 1 : 3}`, `-Dbasemetals.expectModeReject=${!!reject}`, ...client.args, ...client.metadata.arguments.game, - '--username', 'BMValidation', '--version', '26.1.2', '--gameDir', clientDir, + '--username', 'BMValidation', '--version', '26.2', '--gameDir', clientDir, '--assetsDir', path.join(spec.clientRuntime, 'assets'), '--assetIndex', client.vanilla.assetIndex.id, '--uuid', '00000000000000000000000000000118', '--accessToken', '0', '--userType', 'legacy'], 'client.log'); await waitFor(player, 'BASEMETALS_MODE_LOGIN_CLIENT PASS result=' + (reject ? 'rejected' : 'connected'), 240000); diff --git a/tools/validation/test_legacy_worlds.js b/tools/validation/test_legacy_worlds.js index 865dbb581..fea11afc0 100644 --- a/tools/validation/test_legacy_worlds.js +++ b/tools/validation/test_legacy_worlds.js @@ -5,6 +5,7 @@ const crypto = require('crypto'); const { spawn } = require('child_process'); const { serverArguments } = require('./forge_launcher'); const { isVanillaPaintingSnapshot } = require('./painting_registry'); +const { isWindowsCounterDiagnostic } = require('./runtime_log'); const spec = JSON.parse(fs.readFileSync(process.argv[2], 'utf8')); const phase = process.argv[3] || 'upgrade'; @@ -109,6 +110,11 @@ function checkUpgradeLog(log) { const line = lines[index]; if (!/\/(?:ERROR|FATAL)\]/.test(line)) continue; + if (isWindowsCounterDiagnostic(line)) { + console.warn('Known Windows host diagnostic: ' + line); + continue; + } + if (phase === 'upgrade' && line.includes('Unidentified mapping from registry minecraft:')) { const entries = []; for (let next = index + 1; next < lines.length && lines[next].trim(); next++) { @@ -148,7 +154,7 @@ async function run(directory, launcher, label, marker, properties = []) { const output = fs.createWriteStream(path.join(directory, label + '.log')); const executable = phase === 'capture' ? spec.java8 : (spec.java || spec.java17); const launchArguments = phase === 'capture' ? ['-jar', launcher, 'nogui'] - : serverArguments(spec.serverRuntime, directory, '26.1.2', spec.forgeVersion || '64.0.9'); + : serverArguments(spec.serverRuntime, directory, '26.2', spec.forgeVersion || '65.1.0'); const child = spawn(executable, ['-Xms256m', '-Xmx2g', ...properties, ...launchArguments], { cwd: directory, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] }); child.stdout.pipe(output, { end: false }); diff --git a/tools/validation/test_runtime_log.js b/tools/validation/test_runtime_log.js new file mode 100644 index 000000000..b3240409e --- /dev/null +++ b/tools/validation/test_runtime_log.js @@ -0,0 +1,26 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); +const { isWindowsCounterDiagnostic } = require('./runtime_log'); + +const detail = 'Unable to locate English counter names in registry Perflib 009. Counters may need to be rebuilt: '; +const line = '[15:03:33] [main/ERROR] [oshi.driver.windows.registry.HkeyPerformanceDataUtil/]: ' + detail; + +test('recognises the exact Windows counter diagnostic in both logger formats', () => { + assert.equal(isWindowsCounterDiagnostic(line, 'win32'), true); + assert.equal(isWindowsCounterDiagnostic(line.replace('oshi.driver.windows.registry', 'os.dr.wi.re'), 'win32'), true); +}); + +test('does not allow it on another operating system', () => { + assert.equal(isWindowsCounterDiagnostic(line, 'linux'), false); +}); + +test('does not hide a fatal message or another logger', () => { + assert.equal(isWindowsCounterDiagnostic(line.replace('/ERROR]', '/FATAL]'), 'win32'), false); + assert.equal(isWindowsCounterDiagnostic(line.replace('HkeyPerformanceDataUtil', 'BaseMetals'), 'win32'), false); +}); + +test('does not hide a different counter failure', () => { + assert.equal(isWindowsCounterDiagnostic(line.replace(detail, 'Could not read system counters'), 'win32'), false); +}); From 03366e33dcf7fd74520104fa831d79f15514b809 Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Thu, 29 Oct 2026 15:38:51 +0000 Subject: [PATCH 2/2] Keep Javadoc line endings the same on Windows and Linux --- CHANGELOG.txt | 1 + gradle/release/artifacts.gradle | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 1058df316..d7289ae53 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,7 @@ Base Metals 3.1.1.2602001 - Keep raw metals, ore overlays, filled buckets, High/Low Fantasy and the existing gameplay fixes. - Use published OreSpawn 4.1.0.2602001 with the same eleven rules and copper defaults. - Keep existing world profiles, saved items and legacy-upgrade protections. +- Keep generated Javadoc icons consistent between Windows and Linux builds. Base Metals 3.1.1.2601021 diff --git a/gradle/release/artifacts.gradle b/gradle/release/artifacts.gradle index 504d36778..11de2a215 100644 --- a/gradle/release/artifacts.gradle +++ b/gradle/release/artifacts.gradle @@ -9,7 +9,7 @@ tasks.withType(Jar).configureEach { filteringCharset = 'UTF-8' filesMatching(['**/*.java', '**/*.json', '**/*.lang', '**/*.mcmeta', '**/*.md', '**/*.txt', '**/*.cfg', '**/*.properties', '**/*.xml', '**/*.html', - '**/*.css', '**/*.js', '**/element-list', '**/package-list']) { + '**/*.css', '**/*.js', '**/*.svg', '**/element-list', '**/package-list']) { filter(FixCrLfFilter, eol: FixCrLfFilter.CrLf.newInstance('lf'), eof: FixCrLfFilter.AddAsisRemove.newInstance('asis')) } @@ -285,6 +285,12 @@ tasks.register('verifyReleaseArtifacts') { if (leaked != null) { throw new GradleException("${artifactName} contains validation, fixture, legacy, or agent-only path ${leaked.name}") } + + zip.entries().toList().findAll { it.name.endsWith('.svg') }.each { entry -> + if (zip.getInputStream(entry).getText('UTF-8').contains('\r')) { + throw new GradleException("${artifactName} contains non-LF SVG text: ${entry.name}") + } + } } }