Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
72 changes: 48 additions & 24 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,31 +1,51 @@
name: Base Metals 26.2 CI
name: Base Metals 26.3 CI

on:
push:
branches:
- master-26.2
- master-26.3
- 'feature/**'
pull_request:
branches:
- master-26.2
- master-26.3

permissions:
contents: read

concurrency:
group: basemetals-26.2-${{ github.workflow }}-${{ github.ref }}
group: basemetals-26.3-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
name: Build, test, and audit
runs-on: ubuntu-latest
runs-on: ubuntu-26.04
timeout-minutes: 90
env:
LIBGL_ALWAYS_SOFTWARE: '1'
GALLIUM_DRIVER: llvmpipe
SDL_VIDEO_DRIVER: x11
SDL_VIDEO_FORCE_EGL: '1'

steps:
- name: Check out source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7

- name: Prepare Mesa software rendering
run: |
sudo apt-get update
sudo apt-get install --yes --no-install-recommends libgl1-mesa-dri libglx-mesa0 mesa-utils
xvfb-run -a -s '-screen 0 1280x1024x24 +extension GLX +render -noreset' glxinfo -B

- name: Check the virtual display supports Minecraft's OpenGL context
run: |
native="$RUNNER_TEMP/basemetals-sdl-linux.jar"
curl --fail --location --retry 3 --output "$native" \
https://libraries.minecraft.net/org/lwjgl/lwjgl-sdl/3.4.3/lwjgl-sdl-3.4.3-natives-linux.jar
echo "E1880683A4AF33299E9A1B8D7EC1799BED8FB709064EA08DCC2A15CD1101C0B3 $native" | sha256sum --check --strict
timeout 30s xvfb-run -a -s '-screen 0 1280x1024x24 +extension GLX +render -noreset' \
python3 tools/validation/check_sdl_graphics.py "$native"

- name: Install pinned Java 25 runtime and toolchain
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
Expand All @@ -49,7 +69,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 tools/validation/test_runtime_log.js
run: node --test tools/validation/test_painting_registry.js tools/validation/test_runtime_log.js tools/validation/test_vanilla_registry.js

- name: Build, test, and audit first candidate
run: |
Expand All @@ -59,19 +79,19 @@ jobs:
--no-daemon --stacktrace
first="$RUNNER_TEMP/basemetals-first"
mkdir -p "$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/libs/BaseMetals-3.1.1.2603001.jar "$first/"
cp build/libs/BaseMetals-3.1.1.2603001-sources.jar "$first/"
cp build/libs/BaseMetals-3.1.1.2603001-javadoc.jar "$first/"
cp build/release/SHA256SUMS "$first/"

- name: Rebuild and prove byte-identical archives
run: |
./gradlew clean assemble verifyReleaseArtifacts writeReleaseChecksums \
-PorespawnVerificationRepository="${{ steps.orespawn.outputs.repository }}" \
--no-daemon --stacktrace
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/BaseMetals-3.1.1.2603001.jar" build/libs/BaseMetals-3.1.1.2603001.jar
cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.2603001-sources.jar" build/libs/BaseMetals-3.1.1.2603001-sources.jar
cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.2603001-javadoc.jar" build/libs/BaseMetals-3.1.1.2603001-javadoc.jar
cmp "$RUNNER_TEMP/basemetals-first/SHA256SUMS" build/release/SHA256SUMS

- name: Run all required GameTests
Expand All @@ -83,14 +103,14 @@ jobs:
- name: Install official Forge packaged runtimes
id: forge-runtimes
run: |
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"
server_runtime="$RUNNER_TEMP/forge-26.3-66.0.0-server"
client_runtime="$RUNNER_TEMP/forge-26.3-66.0.0-client"
installer="$RUNNER_TEMP/forge-26.3-66.0.0-installer.jar"
mkdir -p "$server_runtime" "$client_runtime"
curl --fail --location --retry 3 \
--output "$installer" \
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
https://maven.minecraftforge.net/net/minecraftforge/forge/26.3-66.0.0/forge-26.3-66.0.0-installer.jar
echo "C6173EEA56AED0B947722F314542196E28A35285844961D517C7FB571492BBE3 $installer" | sha256sum --check --strict
(
cd "$server_runtime"
java -jar "$installer" --installServer
Expand All @@ -111,15 +131,19 @@ jobs:

- name: Run exact packaged integrated-world client smoke
run: >-
timeout --kill-after=30s 15m xvfb-run -a ./gradlew packagedClientStartupSmoke
timeout --kill-after=30s 15m xvfb-run -a
-s '-screen 0 1280x1024x24 +extension GLX +render -noreset'
./gradlew packagedClientStartupSmoke
-PvirtualDisplaySmoke=true
-PpackagedForgeClientRuntime=${{ steps.forge-runtimes.outputs.client_runtime }}
-PorespawnVerificationRepository=${{ steps.orespawn.outputs.repository }}
--no-daemon --stacktrace

- name: Run bounded development integrated-world client smoke
run: >-
timeout --kill-after=30s 15m xvfb-run -a ./gradlew runClient
timeout --kill-after=30s 15m xvfb-run -a
-s '-screen 0 1280x1024x24 +extension GLX +render -noreset'
./gradlew runClient
-PvirtualDisplaySmoke=true
-PintegratedWorldSmoke=true
-PintegratedWorldSmokeName=basemetals-ci-${{ github.run_id }}
Expand All @@ -135,21 +159,21 @@ jobs:
- name: Upload audited release candidate
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: BaseMetals-26.2-${{ github.sha }}
name: BaseMetals-26.3-${{ github.sha }}
if-no-files-found: error
retention-days: 30
path: |
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/libs/BaseMetals-3.1.1.2603001.jar
build/libs/BaseMetals-3.1.1.2603001-sources.jar
build/libs/BaseMetals-3.1.1.2603001-javadoc.jar
build/release/SHA256SUMS
CHANGELOG.txt

- name: Upload bounded diagnostics on failure
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: BaseMetals-26.2-diagnostics-${{ github.sha }}
name: BaseMetals-26.3-diagnostics-${{ github.sha }}
if-no-files-found: ignore
retention-days: 14
path: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ name: CodeQL
on:
push:
branches:
- master-26.2
- master-26.3
- 'feature/**'
pull_request:
branches:
- master-26.2
- master-26.3

permissions:
actions: read
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/validate-gradle-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ name: Validate Gradle Wrapper
on:
push:
branches:
- master-26.2
- master-26.3
- 'feature/**'
pull_request:
branches:
- master-26.2
- master-26.3

permissions:
contents: read
Expand Down
10 changes: 10 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
Base Metals 3.1.1.2603001

- Port the released 26.2 version to Minecraft 26.3 and Forge 66, keeping Java 25.
- Keep raw metals, ore overlays, filled buckets, High/Low Fantasy and the existing gameplay fixes.
- Update recipes, loot, screens and save handling for the newer Minecraft formats.
- Keep coal and charcoal fuels, tool interactions and enchanted smith trades working with the new item components.
- Use published OreSpawn 4.1.0.2603001 with the same eleven rules and copper defaults.
- Read the new block-state save format while keeping older worlds, current player data and upgrade backups intact.
- Skip dungeon placement in protected imported terrain, while leaving new chunks and new underground areas available for generation.

Base Metals 3.1.1.2602001

- Port the released 26.1.2 version to Minecraft 26.2 and Forge 65, keeping Java 25.
Expand Down
29 changes: 17 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -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.2)](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml?query=branch%3Amaster-26.2)
[![Build, test, and audit](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml/badge.svg?branch=master-26.3)](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml?query=branch%3Amaster-26.3)

# Base Metals

Expand All @@ -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.2 Forge version, `3.1.1.2602001`. It keeps the
fixes and features from the released 26.1.2 version, including raw metals, ore
This is the Minecraft 26.3 Forge version, `3.1.1.2603001`. It keeps the
fixes and features from the released 26.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.2`
- Forge `65.1.0` or newer in the Minecraft 26.2 Forge 65 line
- Minecraft `26.3`
- Forge `66.0.0` or newer in the Minecraft 26.3 Forge 66 line
- A current Java 25 runtime
- OreSpawn `[4.1.0.2602001,5.0.0)` on both client and server
- OreSpawn `[4.1.0.2603001,5.0.0)` on both client and server

The build uses Forge `65.1.0` and is also tested on `65.1.5`.
The build uses Forge `66.0.0` and is also tested on `66.1.0`.

This version uses OreSpawn `4.1.0.2602001`. Put
`BaseMetals-3.1.1.2602001.jar` and a compatible OreSpawn JAR in the `mods`
This version uses OreSpawn `4.1.0.2603001`. Put
`BaseMetals-3.1.1.2603001.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.

Expand Down Expand Up @@ -144,13 +144,16 @@ Adding Base Metals to a modern world does not trigger the old numeric-ID
conversion just because an older backup is present. Existing player data stays
in place; genuine legacy upgrades still make backups before changing saved data.

The 26.3 update also protects imported terrain from dungeon placement during
conversion. New chunks and the new underground areas can still generate normally.

## Mod and data-pack compatibility

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.2 port. Do not add jars made for older Minecraft versions or
in this Forge 26.3 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.

Expand Down Expand Up @@ -198,10 +201,12 @@ are isolated from the published JAR.

Virtual-display client checks use `-PvirtualDisplaySmoke=true` to skip Forge's
early splash window. Minecraft still opens its game window and runs the full
world check. Ordinary client launches keep the normal splash screen.
world check. Linux CI uses Ubuntu 26.04 with Mesa/EGL software rendering and checks
the SDL/OpenGL context before starting Minecraft. Ordinary client launches keep
the normal splash screen and graphics settings.

Release artifacts use Maven coordinate
`zone.moddev.mc.basemetals:BaseMetals:3.1.1.2602001`.
`zone.moddev.mc.basemetals:BaseMetals:3.1.1.2603001`.

Report defects and compatibility problems through the
[Base Metals issue tracker](https://github.com/MinecraftModDevelopmentMods/BaseMetals/issues).
Expand Down
10 changes: 5 additions & 5 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ plugins {
ext.mavenizerCompatibilityJar = layout.projectDirectory.file(
'ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar')
ext.mavenizerCompatibilitySha256 =
'5ABAB52A3F1BE115381C3CE80D5FD38DBE6C9F4C0B9ECF70A957700EC90FB88B'
'4150926F33A696B2088AB2675C1C3B45745CE4F9F2DEB31CCD88C9ADC834062F'

ext.mavenizerFixtureChecksums = [
'minecraft-mavenizer-0.5.21-orespawn-compat.jar': mavenizerCompatibilitySha256,
'minecraft-source-compatibility.json': '9437E03FC5E1CB5D605D72F0538C4DF4417B64DB0A57D0AABDC5184781517AC1',
'minecraft-mavenizer-0.5.21-orespawn-compat.patch': '2DA8DD0FD5F112F5B7591113AED06D9A58C584A25F8705E26445A6D2E9D5C78E',
'minecraft-source-compatibility.json': '829400D74ECB1BF0CC6107D9980B8328365E3F56D9A5342002D8DF340571BDB7',
'minecraft-mavenizer-0.5.21-orespawn-compat.patch': 'F1402D730A356589AE46C2483AC10E41062E28A748FEBB72F6CB663A28027A41',
'LICENSE-MAVENIZER.txt': '20C17D8B8C48A600800DFD14F95D5CB9FF47066A9641DDEAB48DC54AEC96E331',
'README.md': 'EAD1477F393897C491A10FB86178213A99C360571A8063D551DA0579DF65BA6F'
'README.md': '45AA8B3238D2E8A873FF49862A8EA1ADDBC186E39655436723C0C85773447D36'
]
// Mavenizer runs during configuration, so verify its inputs before configuring Forge.
mavenizerFixtureChecksums.each { name, expected ->
Expand All @@ -27,7 +27,7 @@ mavenizerFixtureChecksums.each { name, expected ->
}
}

// Forge 65 needs no source repairs. The sealed fixture records that result
// Forge 66 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)
Expand Down
6 changes: 3 additions & 3 deletions ci-fixtures/tools/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.2-65.1.0` development dependency and is excluded from every
exact Forge `26.3-66.0.0` development dependency and is excluded from every
OreSpawn publication artifact.

## Provenance and licence
Expand All @@ -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.2-65.1.0` compiles without source compatibility edits. Its explicit
Forge `26.3-66.0.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.2 all
`ORESPAWN_MAVENIZER_OFFLINE=true`. Mavenizer, OreSpawn and Minecraft 26.3 all
run and compile with Java 25.

## Rebuild
Expand Down
Binary file modified ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ index 0000000..702d759
+{
+ "schema": 1,
+ "targets": {
+ "net.minecraftforge:forge:26.2-65.1.0": {
+ "net.minecraftforge:forge:26.3-66.0.0": {
+ "expectedApplications": 0,
+ "rules": []
+ }
Expand Down
2 changes: 1 addition & 1 deletion ci-fixtures/tools/minecraft-source-compatibility.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"schema": 1,
"targets": {
"net.minecraftforge:forge:26.2-65.1.0": {
"net.minecraftforge:forge:26.3-66.0.0": {
"expectedApplications": 0,
"rules": []
}
Expand Down
2 changes: 1 addition & 1 deletion docs/COMPATIBILITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.2 port. Do not substitute
and runtime jars are not included in this Forge 26.3 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.
Expand Down
7 changes: 5 additions & 2 deletions docs/MIGRATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.2 instance.
OreSpawn 3 plugin, or the old native fallback generator into the 26.3 instance.

Minecraft's data fixer cannot identify third-party numeric block IDs from
before the 1.13 flattening. Base Metals snapshots those positions, runs
Expand Down Expand Up @@ -126,6 +126,9 @@ Modern worlds do not need the old numeric-ID conversion. Base Metals only runs
it after confirming an older source save. A leftover `level.dat_old` does not
replace the current player or turn on legacy terrain protection.

Dungeon generation is skipped when its centre lies in protected imported
terrain. It still runs normally in new chunks and new underground areas.

For a genuine upgrade, legacy inventories are normalized before Minecraft moves
the player files and converts their item data. The world-local migration sidecar keeps the source version
and saved registry map for reloads and chunks opened later; it does not store
Expand All @@ -148,7 +151,7 @@ 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
Minecraft 26.2 moved 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.
Expand Down
Loading
Loading