Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
ce90c24
Bring Power Advantage to Minecraft 1.16.5
SkyBlade1978 Oct 27, 2026
098d462
Carry the client resource checks forward to Minecraft 1.16.5
SkyBlade1978 Oct 27, 2026
4298a18
Keep the worldless fluid checks isolated from other tag registries
SkyBlade1978 Oct 27, 2026
7c552c5
Run Advantage Works on the native 1.16 server APIs
SkyBlade1978 Oct 27, 2026
77e0706
Recognize marked Works worlds through Forge's normalized root path
SkyBlade1978 Oct 27, 2026
41683d0
Keep Works commands available after a data reload
SkyBlade1978 Oct 27, 2026
bc7b2e6
Give the native recipe-book checks a crafting menu
SkyBlade1978 Oct 27, 2026
07dd538
Check native capability transfers and restored tanks on disposable se…
SkyBlade1978 Oct 27, 2026
e72fc3c
Preserve upgraded world state and unloaded machine capabilities
SkyBlade1978 Oct 27, 2026
ace47bf
Add native 1.16 upgrade tests and isolate test-world evidence
SkyBlade1978 Oct 27, 2026
2116a35
Keep stored items intact when upgrading old worlds
SkyBlade1978 Oct 27, 2026
9e4dd74
Check legacy inventories and keep test runtime inputs pinned
SkyBlade1978 Oct 27, 2026
2f7a4a2
Pin the 1.16 test profiles to verified builds
SkyBlade1978 Oct 27, 2026
0b39eff
Save offline player fixtures through native player storage
SkyBlade1978 Oct 27, 2026
91c6a0b
Use native resource metadata and current harness instructions
SkyBlade1978 Oct 27, 2026
8cb0a8f
Reject unload fixtures held by nearby chunk tickets
SkyBlade1978 Oct 27, 2026
3f1100e
Preserve legacy Forge attributes when upgrading worlds
SkyBlade1978 Oct 27, 2026
3201f4b
Observe native entity worlds during migration tests
SkyBlade1978 Oct 27, 2026
2c1957c
Distinguish native entity changes from migration failures
SkyBlade1978 Oct 27, 2026
f3a1a7a
Pin the corrected 1.16 test profiles
SkyBlade1978 Oct 27, 2026
7e29863
Verify the complete staged mod inventory
SkyBlade1978 Oct 27, 2026
daa6fe1
Compare the native player Overworld spawn default exactly
SkyBlade1978 Oct 27, 2026
213407e
Bind actor audits to the sealed six-mod inventory
SkyBlade1978 Oct 27, 2026
bcb75bf
Preserve legacy Forge attributes across world upgrades
SkyBlade1978 Oct 27, 2026
c7a79fc
Check all native Forge attribute identities in the rig
SkyBlade1978 Oct 27, 2026
a941b54
Pin the complete Forge attribute repair in test profiles
SkyBlade1978 Oct 27, 2026
fd49a83
Record the 1.16.5 test results and manual checks
SkyBlade1978 Oct 27, 2026
3cecf50
Fix Minecraft 1.16.5 machine state and strengthen regression tests
SkyBlade1978 Oct 30, 2026
7296976
Clarify the source port and test status in the README
SkyBlade1978 Oct 30, 2026
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
  •  
  •  
  •  
26 changes: 13 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
name: Power Advantage 1.15 CI
name: Power Advantage 1.16 CI

on:
push:
branches: [master-1.15.2, 'feature/**']
branches: [master-1.16.5, 'feature/**']
pull_request:
branches: [master-1.15.2]
branches: [master-1.16.5]

permissions:
contents: read

concurrency:
group: poweradvantage-1.15-${{ github.workflow }}-${{ github.ref }}
group: poweradvantage-1.16-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
Expand All @@ -25,7 +25,7 @@ jobs:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/OreSpawn
ref: 5613baf876747ed071cb7ad7e2aff4e0ce4f0a03
ref: a113e5d767169189f0e35ade1e173a12d550b00e
path: .ci-dependencies/OreSpawn
- name: Use canonical LF dependency inputs
# Use the same source bytes on hosted and local dependency builds.
Expand All @@ -34,7 +34,7 @@ jobs:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/BaseMetals
ref: ac1781e7cade15045ffe0135077087b4d1722603
ref: 995f6cc4dd2d5eecc628a42e5c43fa5390c24bca
path: .ci-dependencies/BaseMetals
- name: Install pinned Java 25 Mavenizer runtime
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
Expand Down Expand Up @@ -70,8 +70,8 @@ jobs:
chmod +x "$orespawn/gradlew" "$basemetals/gradlew"
(cd "$orespawn" && ./gradlew $MMD_GRADLE_TOOLCHAINS jar --no-daemon --stacktrace)
(cd "$basemetals" && ./gradlew $MMD_GRADLE_TOOLCHAINS jar --no-daemon --stacktrace)
osjar="$orespawn/build/libs-dev/OreSpawn-4.1.1.115021-deobf.jar"
bmjar="$basemetals/build/libs-dev/BaseMetals-3.0.2.115021-deobf.jar"
osjar="$orespawn/build/libs-dev/OreSpawn-4.1.0.116051-deobf.jar"
bmjar="$basemetals/build/libs-dev/BaseMetals-3.1.1.116051-deobf.jar"
test -f "$osjar" && test -f "$bmjar"
echo "orespawn=$osjar" >> "$GITHUB_OUTPUT"
echo "basemetals=$bmjar" >> "$GITHUB_OUTPUT"
Expand All @@ -85,20 +85,20 @@ jobs:
- name: Upload audited release candidate
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: PowerAdvantage-1.15.2-${{ github.sha }}
name: PowerAdvantage-1.16.5-${{ github.sha }}
if-no-files-found: error
retention-days: 30
path: |
build/libs/PowerAdvantage-2.4.6.115021.jar
build/libs/PowerAdvantage-2.4.6.115021-sources.jar
build/libs/PowerAdvantage-2.4.6.115021-javadoc.jar
build/libs/PowerAdvantage-2.4.7.116051.jar
build/libs/PowerAdvantage-2.4.7.116051-sources.jar
build/libs/PowerAdvantage-2.4.7.116051-javadoc.jar
build/release/SHA256SUMS
CHANGELOG.txt
- name: Upload diagnostics on failure
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: PowerAdvantage-1.15.2-diagnostics-${{ github.sha }}
name: PowerAdvantage-1.16.5-diagnostics-${{ github.sha }}
if-no-files-found: ignore
retention-days: 14
path: |
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: CodeQL

on:
push:
branches: [master-1.15.2, 'feature/**']
branches: [master-1.16.5, 'feature/**']
pull_request:
branches: [master-1.15.2]
branches: [master-1.16.5]
schedule:
- cron: '47 7 * * 4'

Expand All @@ -25,7 +25,7 @@ jobs:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/OreSpawn
ref: 5613baf876747ed071cb7ad7e2aff4e0ce4f0a03
ref: a113e5d767169189f0e35ade1e173a12d550b00e
path: .ci-dependencies/OreSpawn
- name: Use canonical LF dependency inputs
# Use the same source bytes on hosted and local dependency builds.
Expand All @@ -34,7 +34,7 @@ jobs:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/BaseMetals
ref: ac1781e7cade15045ffe0135077087b4d1722603
ref: 995f6cc4dd2d5eecc628a42e5c43fa5390c24bca
path: .ci-dependencies/BaseMetals
- name: Install pinned Java 25 Mavenizer runtime
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
Expand Down Expand Up @@ -70,8 +70,8 @@ jobs:
chmod +x "$orespawn/gradlew" "$basemetals/gradlew"
(cd "$orespawn" && ./gradlew $MMD_GRADLE_TOOLCHAINS jar --no-daemon --stacktrace)
(cd "$basemetals" && ./gradlew $MMD_GRADLE_TOOLCHAINS jar --no-daemon --stacktrace)
echo "orespawn=$orespawn/build/libs-dev/OreSpawn-4.1.1.115021-deobf.jar" >> "$GITHUB_OUTPUT"
echo "basemetals=$basemetals/build/libs-dev/BaseMetals-3.0.2.115021-deobf.jar" >> "$GITHUB_OUTPUT"
echo "orespawn=$orespawn/build/libs-dev/OreSpawn-4.1.0.116051-deobf.jar" >> "$GITHUB_OUTPUT"
echo "basemetals=$basemetals/build/libs-dev/BaseMetals-3.1.1.116051-deobf.jar" >> "$GITHUB_OUTPUT"
- name: Initialize CodeQL
uses: github/codeql-action/init@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
with:
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-1.15.2
- master-1.16.5
- 'feature/**'
pull_request:
branches:
- master-1.15.2
- master-1.16.5

permissions:
contents: read
Expand Down
29 changes: 29 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,32 @@
Power Advantage 2.4.7.116051 (Minecraft 1.16.5)

- Charge energy sources only for what consumers accept, retaining rejected energy for the next machine.
- Keep custom item data intact on conveyors, recognize empty overflow destinations and save both inventories after a transfer.
- Prevent fluid discharges from replacing solid blocks.
- Use native fluid pickup so drains leave waterlogged blocks in place.
- Tighten the test harness against missing results, stale restart reports and invalid measurements; record which machine behaviours still need operating tests.
- Give machine names and Inventory their own label rows without covering the artwork; keep item tooltips and the dimmed backdrop.
- Use translated conveyor names rather than internal class names, while retaining player-assigned machine names.
- Require the expected text in rendered GUI tests and reject deliberately missing or misplaced labels; the earlier no-label acceptance was incorrect.
- Keep fluid gauges within their frames and add a rendered-layout check for every registered Advantage machine screen.
- Fix Eclipse access errors in migration test fixtures without weakening compiler checks or changing the mod jar.
- Check cached development jars for damaged entries during build and Eclipse audits, and exercise vanilla networking in the client startup probe.
- Move to Forge 36.2.34 and official 1.16.5 mappings, keeping Java 8 production bytecode.
- Keep the existing block, item, fluid, tile, provider and saved-state names.
- Use dimension registry keys for conduit caches, including custom dimensions.
- Use the native tile save/load and matrix-based menu APIs without changing stored machine data.
- Resolve configured rubber and solder aliases during the server's native tag reload.
- Retarget the shared legacy-world hook and keep both Base Metals transformer orders covered.
- Carry forward vanilla registry renames when upgrading 1.13, 1.14 and 1.15 saves, without discarding unknown mod entries.
- Preserve entity UUIDs, pet ownership and passenger state when vanilla and mod entities share an old chunk.
- Keep old material variants, tool wear and enchantments in machine inventories during world upgrades.
- Keep named enchantments in player inventories and stored books when upgrading older worlds.
- Preserve old Forge swimming speed, name-tag distance, gravity and player reach, including custom values and modifiers, when upgrading entities and player data.
- Prepare both mods' stored items before entity flattening, keeping Base Metals tool durability in dropped items and minecarts.
- Detach chunk data before migration so pending asynchronous saves are not modified in place.
- Keep unloaded machine capabilities unavailable until the tile is revived, with fresh wrappers and retained contents.
- Record the current-jar machine, upgrade, mining, recipe, unloading and endurance checks in docs/1.16/CURRENT-QUALIFICATION.md, keeping native differences and manual acceptance separate.

Power Advantage 2.4.6.115021 (Minecraft 1.15.2)

- Move to Forge 31.2.57, snapshot mappings 20200514-1.15.1 and MCP 20200515.085601; retain ForgeGradle 7, Gradle 9.6.1 and Java 8 production bytecode.
Expand Down
83 changes: 59 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
# PowerAdvantage

**Minecraft 1.15.2**
**Minecraft 1.16.5, version 2.4.7.116051. Source port candidate.**

Power Advantage 2.4.6.115021 targets Minecraft 1.15.2. See the
[current test record](docs/1.15/CURRENT-QUALIFICATION.md) for the exact jars,
automated results and remaining limits. Visuals and recipe unlocks were
accepted on 27 October 2026; machine behavior is covered by the recorded
automated tests.
See the [1.16 port record](docs/1.16/PORT-STATUS.md) for current checks and remaining
work. The accepted [1.15 test record](docs/1.15/CURRENT-QUALIFICATION.md) is retained
as historical evidence, not a pass for this version. Manual 1.16 acceptance is
still required.

The [test-suite review](docs/1.16/TEST-SUITE-AUDIT.md) separates operating checks
from saved-state and presence checks. It records the remaining machine coverage
gaps; a green build does not qualify every machine setup.

The follow-up [machine operating checks](docs/1.16/OPERATING-TESTS.md) use finite
inputs, real server ticks, blocked and starved controls, and full-process
restarts. They check useful output and retained resources, not just animation
or a rising progress counter.

Power Advantage provides shared power, fluids, item transport and compatibility APIs for Steam Advantage and Electric Advantage.

Expand All @@ -21,20 +29,21 @@ Recipe-book discovery now follows relevant ingredients. See the [all-Advantage m

The [manufacturing progression audit](docs/1.13/MANUFACTURING-PROGRESSION.md) traces survival parts from raw resources, including configured material aliases, processing, loot-only parts and automated restart checks.

## Building Minecraft 1.15.2
## Building Minecraft 1.16.5

The `master-1.15.2` build uses Forge 31.2.57, snapshot mappings
`20200514-1.15.1`, MCP `20200515.085601`, ForgeGradle 7.0.34 and Gradle 9.6.1.
The `master-1.16.5` build uses Forge 36.2.34, official `1.16.5` mappings,
MCP `20210115.111550`, ForgeGradle 7.0.34 and Gradle 9.6.1.
Run Gradle with Java 17 and compile production code with Java 8. Mavenizer also
needs Java 25. CI pins all three JDKs; the [test commands](docs/1.15/TEST-HARNESS.md)
show how to select local installations explicitly.
needs Java 25. CI pins all three JDKs. Pass the installed homes using
`-Porg.gradle.java.installations.paths=<java8>,<java17>,<java25>` and disable
automatic discovery and downloads for a reproducibility check.

Build the pinned Base Metals `3.0.2.115021` and OreSpawn `4.1.1.115021` deobf jars first.
Build the pinned Base Metals `3.1.1.116051` and OreSpawn `4.1.0.116051` deobf jars first.
The exact Base Metals source is
`ac1781e7cade15045ffe0135077087b4d1722603`. CI builds that dependency first;
`995f6cc4dd2d5eecc628a42e5c43fa5390c24bca`. CI builds that dependency first;
the checksums and complete source pins are in `gradle.properties`.

Then run from `D:\PowerAdvantage\PA115\PowerAdvantage`:
Then run from `D:\PowerAdvantage\PA116\PowerAdvantage`:

```text
gradlew.bat clean check build javadoc verifyReleaseDependencies verifyReleaseArtifacts writeReleaseChecksums verifyEclipseProductionClasspath
Expand All @@ -43,8 +52,8 @@ gradlew.bat clean check build javadoc verifyReleaseDependencies verifyReleaseArt
The default dependency jars are:

```text
D:\BaseMetals\BaseMetals 115\BaseMetals\build\libs-dev\BaseMetals-3.0.2.115021-deobf.jar
D:\MinecraftMineralogy\OS115\OreSpawn\build\libs-dev\OreSpawn-4.1.1.115021-deobf.jar
D:\BaseMetals\BaseMetals 116\BaseMetals\build\libs-dev\BaseMetals-3.1.1.116051-deobf.jar
D:\MinecraftMineralogy\OS116\OreSpawn\build\libs-dev\OreSpawn-4.1.0.116051-deobf.jar
```

Other layouts can pass `-PbaseMetalsDeobfJar=<path>` and `-PoreSpawnDeobfJar=<path>`.
Expand All @@ -66,16 +75,33 @@ Refresh the project in Eclipse, allow its Java build to finish, and launch the g

Eclipse copies production resources from `build/resources/main`, not directly from `src/main/resources`. This prevents its builder from overwriting the expanded `mods.toml` with raw `${version}` placeholders. After updating this setup, use **Gradle > Refresh Gradle Project**, then **Project > Clean** before relaunching. After editing resources or version properties, run `processResources` or refresh the Gradle project before the Eclipse build. See the [metadata regression notes](docs/1.13/ECLIPSE-METADATA.md).

To prepare a combined client, build the Steam/Electric `2.2.7.115021` deobf jars,
To prepare a combined client, build the Steam/Electric `2.2.8.116051` deobf jars,
run `gradlew.bat prepareCombinedEclipseLaunch`, refresh Eclipse, then launch
`runClientAllAdvantage.launch`. Inputs must match
`test-rig/profiles/native115/dev-core.json`; alternative layouts can pass
`test-rig/profiles/native116/dev-core.json`; alternative layouts can pass
`-PsteamAdvantageDeobfJar=<path>` and `-PelectricAdvantageDeobfJar=<path>`.
The ordinary `runClient.launch` remains Power-only. Both use the `run` directory;
preparing a launch does not copy, open or qualify a save.

Client-resource and recipe-book checks run against the 1.15 candidate. Manual
visual and interaction acceptance remains separate; see the current test record.
The local GUI corrections have separate input hashes, keeping the earlier machine
test profiles unchanged. To prepare that combined preview, run
`gradlew.bat prepareCombinedEclipseLaunch -PadvantageDevelopmentProfile=docs/1.16/gui-development-inputs.json`.
See the [GUI checks](docs/1.16/GUI-CHECKS.md) for coverage and the repeatable command.

`check` and Eclipse preparation also run `verifyDevelopmentRuntimeArchives`,
which reads every development runtime jar entry and checks its size and CRC.
This catches damaged cached dependencies before the next test launch.

Client-resource and recipe-book checks must use the exact 1.16 candidate. Manual
visual and interaction acceptance remains separate.

The migration test fixtures do not import restricted JDK internals. A plain ECJ
batch compile does not apply Eclipse's JRE access rules automatically. After
`eclipseClasspath` and `test`, run `tools/verification/Verify-EclipseCompilation.ps1`
with `-Compiler <ecj.jar>`, `-Java17Home <jdk17>`, `-Java8Home <jdk8>` and
`-Evidence <new-directory>` to compile fresh main/test classes with restricted
references treated as errors, then run the tests on Java 8. Keep Eclipse's
access-restriction checks enabled.

## Compatibility

Expand All @@ -84,12 +110,21 @@ historical `cyano.poweradvantage.api` package retained. The port keeps registry,
fluid, tile, NBT and provider identities. The current test record distinguishes
machine preservation, actual operation and vanilla migration differences.

The 1.15 changes use native activation results, non-solid block properties,
texture-atlas access and client render-layer registration. The shared migration
hook is retargeted to 1.15; its presence is not proof that an upgrade is safe.
The upgrade path prepares stored items before vanilla flattening and converts
entities individually, so a mod entity cannot prevent a nearby pet's UUID and
ownership from being migrated. Old vanilla registry names are remapped explicitly;
unknown mod mappings still require their own compatible mod rather than being
silently discarded.
Legacy Forge swimming speed, name-tag distance, gravity and player reach use
their native registry names without discarding saved values or modifiers.

The 1.16 port uses native dimension registry keys, tile save/load methods and
matrix-based menus. Config-dependent material aliases are resolved during the
server's native tag load and synchronized to clients. The shared pre-flattening
migration hook remains necessary; its presence is not proof that an upgrade is safe.

The [legacy migration guide](docs/1.13/MIGRATION.md) and
[Advantage Works rig](test-rig/README.md) describe the earlier protocols.
The [1.15 status](docs/1.15/PORT-STATUS.md) links the current qualification.
The [1.16 status](docs/1.16/PORT-STATUS.md) tracks this port's qualification.

The historical 1.10 handbook remains on the [1.10.2 branch](https://github.com/MinecraftModDevelopmentMods/PowerAdvantage/blob/master-1.10.2/docs/1.10/README.md).
Loading
Loading