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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions .github/verify-published-pins.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ done
require_merged() {
local repo="$1" ref="$2" status
[[ "$ref" =~ ^[a-f0-9]{40}$ ]]
status="$(gh api "repos/MinecraftModDevelopmentMods/$repo/compare/$ref...master-26.1.2" --jq '.status')"
status="$(gh api "repos/MinecraftModDevelopmentMods/$repo/compare/$ref...master-26.2" --jq '.status')"
case "$status" in
identical|ahead) ;;
*) echo "::error::$repo $ref is not on upstream master-26.1.2 ($status)."; exit 1 ;;
*) echo "::error::$repo $ref is not on upstream master-26.2 ($status)."; exit 1 ;;
esac
}

Expand All @@ -43,12 +43,14 @@ public_jar() {
}

power_ref="$(value poweradvantage_source_ref)"
unit_support_ref="$(value unit_support_source_ref)"
orespawn_ref="$(value orespawn_source_commit)"
require_merged basePower "$power_ref"
require_merged basePower "$unit_support_ref"
require_merged BaseMetals "$(value basemetals_source_commit)"
require_merged OreSpawn "$orespawn_ref"

inputs="${RUNNER_TEMP:?}/forge64-release-dependencies"
inputs="${RUNNER_TEMP:?}/forge65-release-dependencies"
mkdir -p "$inputs"
power="$inputs/basePower-$(value poweradvantage_version).jar"
metals="$inputs/BaseMetals-$(value basemetals_version).jar"
Expand All @@ -57,11 +59,12 @@ public_jar basePower 1780140 "$(value poweradvantage_public_file_id)" "$(value p
public_jar BaseMetals 240967 "$(value basemetals_public_file_id)" "$(value basemetals_deobf_sha256)" "$metals"
public_jar OreSpawn 245586 "$(value orespawn_public_file_id)" "$(value orespawn_deobf_sha256)" "$orespawn"

installer="$inputs/forge-26.1.2-64.1.5-installer.jar"
download 'https://maven.minecraftforge.net/net/minecraftforge/forge/26.1.2-64.1.5/forge-26.1.2-64.1.5-installer.jar' \
installer="$inputs/forge-26.2-65.1.0-installer.jar"
download 'https://maven.minecraftforge.net/net/minecraftforge/forge/26.2-65.1.0/forge-26.2-65.1.0-installer.jar' \
"$(value forge_installer_sha256)" "$installer"
{
printf 'power_ref=%s\n' "$power_ref"
printf 'unit_support_ref=%s\n' "$unit_support_ref"
printf 'orespawn_ref=%s\n' "$orespawn_ref"
} >> "${GITHUB_OUTPUT:?}"
{
Expand Down
28 changes: 14 additions & 14 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
name: baseElectric 26.1.2 CI
name: baseElectric 26.2 CI

on:
push:
branches: [master-26.1.2, 'feature/**']
branches: [master-26.2, 'feature/**']
pull_request:
branches: [master-26.1.2]
branches: [master-26.2]

permissions:
contents: read

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

jobs:
Expand All @@ -34,11 +34,11 @@ jobs:
repository: MinecraftModDevelopmentMods/OreSpawn
ref: ${{ steps.public-pins.outputs.orespawn_ref }}
path: .ci-dependencies/OreSpawn
- name: Check out released basePower source
- name: Check out qualified basePower unit-support source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/basePower
ref: ${{ steps.public-pins.outputs.power_ref }}
ref: ${{ steps.public-pins.outputs.unit_support_ref }}
path: .ci-dependencies/basePower
- name: Install Java 25 for all build and runtime roles
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
Expand All @@ -52,19 +52,19 @@ jobs:
-Porg.gradle.java.installations.auto-download=false" >> "$GITHUB_ENV"
- name: Set up Gradle
uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6
- name: Verify the Forge 64 build inputs
- name: Verify the Forge 65 build inputs
shell: bash
env:
ORESPAWN_REF: ${{ steps.public-pins.outputs.orespawn_ref }}
POWER_REF: ${{ steps.public-pins.outputs.power_ref }}
POWER_REF: ${{ steps.public-pins.outputs.unit_support_ref }}
run: |
set -euo pipefail
orespawn="$GITHUB_WORKSPACE/.ci-dependencies/OreSpawn"
power="$GITHUB_WORKSPACE/.ci-dependencies/basePower"
test "$(git -C "$orespawn" rev-parse HEAD)" = "$ORESPAWN_REF"
test "$(git -C "$power" rev-parse HEAD)" = "$POWER_REF"
mavenizer="$orespawn/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar"
printf '%s %s\n' 'BB0DACB3DEB2A711CA67DD402D5FDAB5A9847C37C7B9B596DEC7CF37378FA085' "$mavenizer" | sha256sum -c -
printf '%s %s\n' '5ABAB52A3F1BE115381C3CE80D5FD38DBE6C9F4C0B9ECF70A957700EC90FB88B' "$mavenizer" | sha256sum -c -
echo "MAVENIZER=$mavenizer" >> "$GITHUB_ENV"
- name: Build and audit release artifacts
shell: bash
Expand All @@ -78,20 +78,20 @@ jobs:
- name: Upload audited release candidate
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: baseElectric-26.1.2-${{ github.sha }}
name: baseElectric-26.2-${{ github.sha }}
if-no-files-found: error
retention-days: 30
path: |
build/libs/baseElectric-2.2.17.2601021.jar
build/libs/baseElectric-2.2.17.2601021-sources.jar
build/libs/baseElectric-2.2.17.2601021-javadoc.jar
build/libs/baseElectric-2.2.18.2602001.jar
build/libs/baseElectric-2.2.18.2602001-sources.jar
build/libs/baseElectric-2.2.18.2602001-javadoc.jar
build/release/SHA256SUMS
CHANGELOG.txt
- name: Upload diagnostics on failure
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: baseElectric-26.1.2-diagnostics-${{ github.sha }}
name: baseElectric-26.2-diagnostics-${{ github.sha }}
if-no-files-found: ignore
retention-days: 14
path: |
Expand Down
16 changes: 8 additions & 8 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ name: CodeQL

on:
push:
branches: [master-26.1.2, 'feature/**']
branches: [master-26.2, 'feature/**']
pull_request:
branches: [master-26.1.2]
branches: [master-26.2]

permissions:
contents: read
actions: read
security-events: write

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

jobs:
Expand All @@ -36,11 +36,11 @@ jobs:
repository: MinecraftModDevelopmentMods/OreSpawn
ref: ${{ steps.public-pins.outputs.orespawn_ref }}
path: .ci-dependencies/OreSpawn
- name: Check out released basePower source
- name: Check out qualified basePower unit-support source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/basePower
ref: ${{ steps.public-pins.outputs.power_ref }}
ref: ${{ steps.public-pins.outputs.unit_support_ref }}
path: .ci-dependencies/basePower
- name: Install Java 25 for all build and runtime roles
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
Expand All @@ -54,19 +54,19 @@ jobs:
-Porg.gradle.java.installations.auto-download=false" >> "$GITHUB_ENV"
- name: Set up Gradle
uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6
- name: Verify the Forge 64 build inputs
- name: Verify the Forge 65 build inputs
shell: bash
env:
ORESPAWN_REF: ${{ steps.public-pins.outputs.orespawn_ref }}
POWER_REF: ${{ steps.public-pins.outputs.power_ref }}
POWER_REF: ${{ steps.public-pins.outputs.unit_support_ref }}
run: |
set -euo pipefail
orespawn="$GITHUB_WORKSPACE/.ci-dependencies/OreSpawn"
power="$GITHUB_WORKSPACE/.ci-dependencies/basePower"
test "$(git -C "$orespawn" rev-parse HEAD)" = "$ORESPAWN_REF"
test "$(git -C "$power" rev-parse HEAD)" = "$POWER_REF"
mavenizer="$orespawn/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar"
printf '%s %s\n' 'BB0DACB3DEB2A711CA67DD402D5FDAB5A9847C37C7B9B596DEC7CF37378FA085' "$mavenizer" | sha256sum -c -
printf '%s %s\n' '5ABAB52A3F1BE115381C3CE80D5FD38DBE6C9F4C0B9ECF70A957700EC90FB88B' "$mavenizer" | sha256sum -c -
echo "MAVENIZER=$mavenizer" >> "$GITHUB_ENV"
- name: Initialize CodeQL
uses: github/codeql-action/init@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
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.1.2
- master-26.2
- 'feature/**'
pull_request:
branches:
- master-26.1.2
- master-26.2

permissions:
contents: read
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
baseElectric 2.2.18.2602001 (Minecraft 26.2 / Forge)

- Target Minecraft 26.2 and Forge 65 with Java 25.
- Keep the shared Base Metals migration hook and existing machine, item and saved-data identities.
- Retain exact dependency, native pack, artifact and classpath guards.
- Pass the combined profile03 machine, migration, actor/order, client and two-world endurance checks, including independent 66-checkpoint replay.
- Complete the full release, cold-cache and manual checks. Publish after basePower so the expansion uses the released dependency.
- Pin the verified public basePower, Base Metals and OreSpawn releases.

baseElectric 2.2.17.2601021 (Minecraft 26.1.2 / Forge)

- Bring baseElectric to Minecraft 26.1.2 with Forge 64.1.5 and Java 25.
Expand Down
135 changes: 60 additions & 75 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,91 +1,76 @@
# baseElectric

**Minecraft 26.1.2 (Forge), version 2.2.17.2601021.**

baseElectric continues DrCyano's Electric Advantage. It adds electric machines,
generation, storage, automation and defence to basePower. Its equipment appears
in the shared basePower creative tab.

This checkout targets Minecraft **26.1.2** and
Forge **64.1.5**, using official runtime names, MCP **20260409.101008**,
ForgeGradle **7.0.34**, Gradle **9.6.1**, and Temurin **25.0.3+9**.
The frozen profile12 family has completed automated qualification and manual
testing. See the
[family qualification record](../../PowerAdvantage/docs/26.1.2/QUALIFICATION.md)
for the exact tested jars, completed checks and scope limits. Manual acceptance
is complete. [This release is available on CurseForge](https://www.curseforge.com/minecraft/mc-mods/baseelectric/files/9577930),
MMD Maven and GitHub Releases. All three player-jar downloads match the final
restart and endurance-tested checksum.

basePower **2.4.16.2601021** and Base Metals **3.1.2.2601021** are required on
both client and server. Their public source and ordinary-jar checkpoints are
recorded in `gradle.properties`.
The build rejects old 1.21.11 inputs. OreSpawn
**4.1.1.2601021** is pinned to its public release (CurseForge 9572926).
See the [26.1.2 notes](docs/NATIVE2612.md).

The public pins use Power source `a684e71e` / jar `23ABCC1F` (CurseForge 9576332)
and Base Metals source `5e708468` / jar `67862388` (9576007). Their public
downloads match the accepted dependency jars. Power is published first, then
Steam, then Electric. Electric's promoted jar changes only its manifest to
record the merged Power source; every other archive entry is byte-identical
to the accepted candidate. Restart and endurance qualification for those final
jar bytes is recorded separately from the earlier candidate's results.
The new clean release suite passes 117 unit tests and 28 native checks, and its
warm and fresh empty-cache path-with-spaces reproductions match all three
archives. Fresh ECJ passes all 117 tests with the complete compiled inventory,
and the standalone source audit passes all nine checks after its exact OreSpawn
constants were updated. The original stale-pin failures remain preserved.

The completed [1.21.11 release](https://www.curseforge.com/minecraft/mc-mods/baseelectric/files/9567881)
and its [qualification notes](docs/NATIVE12111.md) are historical evidence,
not proof of this port. New gameplay, migration and graphical checks must use
the actual 26.1.2 jars.

Back up your world and try the upgrade on a copy. Replace Electric Advantage
and Power Advantage with baseElectric and basePower; do not install both sets.

## Building locally

Use Temurin 25.0.3+9 for Gradle, Minecraft, compilation, tests, Mavenizer and
Slime Launcher. No Java 8 helper is required. Set
`-Porg.gradle.java.installations.paths=<java25-home>` if needed.
Use the isolated `D:/GradleCaches/baseelectric-2612-port` cache for local work.

The independent Forge/resource checks do not require sibling jars:
**Minecraft 26.2 Forge, version 2.2.18.2602001. Automated and manual testing complete.**

baseElectric continues DrCyano's Electric Advantage and uses basePower's shared
API, machines and creative tab. Existing `baseelectric` registry and saved-data
identities are retained.

This port targets Forge **65.1.0**, official Minecraft **26.2** names,
MCP **20260616.103818**, Java **25.0.3+9**, ForgeGradle **7.0.34** and the
checksum-pinned Gradle **9.6.1** wrapper. Native pack formats are data
**107.1** and client **88.0**.

The earlier [26.1.2 release](https://www.curseforge.com/minecraft/mc-mods/baseelectric/files/9577930)
remains available on CurseForge, MMD Maven and GitHub Releases. The 26.2
release is being prepared separately; the version and dependency pins below
apply to this branch.

## Build

The coordinated dependencies are
[basePower **2.4.17.2602001**](https://www.curseforge.com/minecraft/mc-mods/basepower/files/9583433),
[Base Metals **3.1.2.2602001**](https://www.curseforge.com/minecraft/mc-mods/base-metals/files/9583122)
and [OreSpawn **4.1.1.2602001**](https://www.curseforge.com/minecraft/mc-mods/mmd-orespawn/files/9582731).
Base Metals is required on both client and server. These two published
dependency patches match the jars used for the combined tests; older downloads
do not include the same migration and retained-settings repairs.

All three dependency downloads have been checked against their release builds.
Exact source, download and SHA-256 pins are kept together in `gradle.properties`.

The Mavenizer fixture and its source-rule, patch, licence and provenance files
are checksum-sealed from the existing OS262 checkout. The established
`-Pforge64MavenizerJar` property remains a path alias; it selects the Forge65
fixture here. Dependencies stay separate mods and must match the source and
artifact pins in `gradle.properties`.

Use Temurin 25 and clear `JAVA_TOOL_OPTIONS`, `JDK_JAVA_OPTIONS` and
`_JAVA_OPTIONS` before qualification. The prepared sibling layout is the
default; explicit `*DeobfJar` and `*RuntimeJar`/`*PlayerJar` flags change
paths, not the required bytes. With these exact coordinated inputs:

Unit support keeps its separately qualified Power source revision in
`unit_support_source_ref`. Pass that source directory with `-PpowerUnitSource`
when the sibling Power checkout is newer; the four source hashes remain fixed.
Hosted builds check out this test-only revision separately from the public
Power player pin.

```text
./gradlew nativeResourceChecks compileNativeApiDiagnostics verifyRecipeTagGuards processResources --max-workers=2 --no-daemon
./gradlew clean check build javadoc verifyReleaseDependencies verifyReleaseArtifacts writeReleaseChecksums --no-build-cache --no-daemon
./gradlew verifyEclipseProductionClasspath --no-daemon
node tools/verify-native-port.js
node tools/generate-recipe-unlocks.js --check
```

For a full local build, use the exact local dependency pins in
`gradle.properties`. Path overrides never replace source or hash checks:
## Qualification

```text
-PpowerAdvantageRuntimeJar=/path/to/basePower-2.4.16.2601021.jar
-PbaseMetalsRuntimeJar=/path/to/BaseMetals-3.1.2.2601021.jar
-PforgeInstallerJar=/path/to/forge-26.1.2-64.1.5-installer.jar
```
Combined profile03 passed the machine, migration, actor/dimension, actual
transformer-order and real-client checks, plus two 30-minute worlds, restart
and independent 66-checkpoint replay. See [26.2 port status](docs/NATIVE262.md)
for the counts and exact inputs. The [family qualification record](https://github.com/MinecraftModDevelopmentMods/basePower/blob/master-26.2/docs/26.2/QUALIFICATION.md)
keeps the completed checks and their scope limits together.

Forge 64 uses the ordinary native jar for both play and development. The former
`*DeobfJar` path flags remain aliases for the same bytes. OreSpawn and the
Mavenizer fixture default to the sibling `MinecraftMineralogy/OS2612/OreSpawn`
checkout. Use `-PoreSpawnRuntimeJar` and `-Pforge64MavenizerJar` to override paths.
For the prepared cache, use `--offline` with `ORESPAWN_MAVENIZER_OFFLINE=true`.

```text
./gradlew check build javadoc verifyLocalRuntimeInputs writeReleaseChecksums verifyEclipseProductionClasspath --no-build-cache
```

Use `gradlew.bat` on Windows. Output jars go to `build/libs`. Dependencies
remain separate mods. The 26.1.2 CI and CodeQL jobs require merged source pins
and checksum-matching public dependencies before checkout or compilation.
Local jars do not satisfy that gate.
The final root build and cold-cache checks passed, and manual testing was
accepted on 12 November 2026. Publication follows the dependency order:
OreSpawn and Base Metals, then basePower and baseSteam, then this expansion.
The accepted 26.1.2 records remain historical proof of their original bytes,
not a substitute for the 26.2 results.

## Candidate09 Verification History

This section records the earlier 26.1.2 work, not qualification of this 26.2 candidate.

The previous candidate09 passed 117 unit tests, 28 independent native resource
tests and 117 tests from fresh ECJ output, with no failures or skips. The ECJ
gate compares every compiled test method with the Gradle XML inventory.
Expand Down
Loading
Loading