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
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: Power Advantage 1.13 CI
name: Power Advantage 1.14 CI

on:
push:
branches: [master-1.13.2, 'feature/**']
branches: [master-1.14.4, 'feature/**']
pull_request:
branches: [master-1.13.2]
branches: [master-1.14.4]

permissions:
contents: read

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

jobs:
Expand All @@ -25,16 +25,16 @@ jobs:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/OreSpawn
ref: 6a7c2bb07b9a7771128812fcc07d185f7d9df58b
ref: 9c2488cba02d317e3f31e24441dcc58273d8d0e6
path: .ci-dependencies/OreSpawn
- name: Use canonical LF dependency inputs
# Base Metals predates archive text normalization; its LF artifact is separately pinned.
# Use the same source bytes on hosted and local dependency builds.
run: git config --global core.autocrlf false
- name: Check out pinned Base Metals
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/BaseMetals
ref: 1376a20d7d5ba22d3abc77dc34b49a2c88943697
ref: 713802f93f2d1f650e1593fa35c487ea43add4a5
path: .ci-dependencies/BaseMetals
- name: Install Java 8 toolchain
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
Expand All @@ -58,8 +58,8 @@ jobs:
chmod +x "$orespawn/gradlew" "$basemetals/gradlew"
(cd "$orespawn" && ./gradlew jar --no-daemon --stacktrace)
(cd "$basemetals" && ./gradlew jar --no-daemon --stacktrace)
osjar="$orespawn/build/libs-dev/OreSpawn-4.1.0.113021-deobf.jar"
bmjar="$basemetals/build/libs-dev/BaseMetals-3.0.1.113021-deobf.jar"
osjar="$orespawn/build/libs-dev/OreSpawn-4.1.1.114041-deobf.jar"
bmjar="$basemetals/build/libs-dev/BaseMetals-3.0.1.114041-deobf.jar"
test -f "$osjar" && test -f "$bmjar"
echo "orespawn=$osjar" >> "$GITHUB_OUTPUT"
echo "basemetals=$bmjar" >> "$GITHUB_OUTPUT"
Expand All @@ -73,20 +73,20 @@ jobs:
- name: Upload audited release candidate
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: PowerAdvantage-1.13.2-${{ github.sha }}
name: PowerAdvantage-1.14.4-${{ github.sha }}
if-no-files-found: error
retention-days: 30
path: |
build/libs/PowerAdvantage-2.4.4.113021.jar
build/libs/PowerAdvantage-2.4.4.113021-sources.jar
build/libs/PowerAdvantage-2.4.4.113021-javadoc.jar
build/libs/PowerAdvantage-2.4.5.114041.jar
build/libs/PowerAdvantage-2.4.5.114041-sources.jar
build/libs/PowerAdvantage-2.4.5.114041-javadoc.jar
build/release/SHA256SUMS
CHANGELOG.txt
- name: Upload diagnostics on failure
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: PowerAdvantage-1.13.2-diagnostics-${{ github.sha }}
name: PowerAdvantage-1.14.4-diagnostics-${{ github.sha }}
if-no-files-found: ignore
retention-days: 14
path: |
Expand Down
14 changes: 7 additions & 7 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.13.2, 'feature/**']
branches: [master-1.14.4, 'feature/**']
pull_request:
branches: [master-1.13.2]
branches: [master-1.14.4]
schedule:
- cron: '47 7 * * 4'

Expand All @@ -25,16 +25,16 @@ jobs:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/OreSpawn
ref: 6a7c2bb07b9a7771128812fcc07d185f7d9df58b
ref: 9c2488cba02d317e3f31e24441dcc58273d8d0e6
path: .ci-dependencies/OreSpawn
- name: Use canonical LF dependency inputs
# Base Metals predates archive text normalization; its LF artifact is separately pinned.
# Use the same source bytes on hosted and local dependency builds.
run: git config --global core.autocrlf false
- name: Check out pinned Base Metals
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/BaseMetals
ref: 1376a20d7d5ba22d3abc77dc34b49a2c88943697
ref: 713802f93f2d1f650e1593fa35c487ea43add4a5
path: .ci-dependencies/BaseMetals
- name: Install Java 8 toolchain
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
Expand All @@ -58,8 +58,8 @@ jobs:
chmod +x "$orespawn/gradlew" "$basemetals/gradlew"
(cd "$orespawn" && ./gradlew jar --no-daemon --stacktrace)
(cd "$basemetals" && ./gradlew jar --no-daemon --stacktrace)
echo "orespawn=$orespawn/build/libs-dev/OreSpawn-4.1.0.113021-deobf.jar" >> "$GITHUB_OUTPUT"
echo "basemetals=$basemetals/build/libs-dev/BaseMetals-3.0.1.113021-deobf.jar" >> "$GITHUB_OUTPUT"
echo "orespawn=$orespawn/build/libs-dev/OreSpawn-4.1.1.114041-deobf.jar" >> "$GITHUB_OUTPUT"
echo "basemetals=$basemetals/build/libs-dev/BaseMetals-3.0.1.114041-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.13.2
- master-1.14.4
- 'feature/**'
pull_request:
branches:
- master-1.13.2
- master-1.14.4

permissions:
contents: read
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
/test-rig/migration/.venv/
/test-rig/migration/__pycache__/

# Local dependency artifacts; 1.13 converters use Forge Energy instead.
# Local dependency artifacts; converters use Forge Energy instead.
/libs/*
*.jar
*.zip
Expand Down
12 changes: 12 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
Power Advantage 2.4.5.114041 (Minecraft 1.14.4)

- Move to Minecraft 1.14.4 and Forge 28.2.26, retaining existing registry names, saved-state keys and public API packages.
- Use native Forge fluid rendering and sided capabilities, registered machine menus, tag updates and parts-loot events.
- Keep the pre-flattening world migration hook and handle the retired vanilla villager profession index without discarding custom entries.
- Add native block loot, including portable tank contents, and invalidate machine capabilities when their tiles are removed.
- Keep water in tanks when reading saves that use its old unqualified fluid name.
- Keep incoming Forge Energy when converting it to steam, electricity or quantum power; the RF- and Tech Reborn-labelled converters no longer discard it.
- Register the world-save hook after parallel mod loading to avoid intermittent autosave failures when Base Metals also registers a hook.
- Carry forward the restart and moving-drill fixes. The 1.14 validation status is tracked separately from the earlier 1.13 results.
- Manual visuals and recipe unlocks are accepted. Machine functionality is covered by automated tests, not personal play-testing; the 1.14 qualification notes retain the exact tested jars and remaining coverage limits.

Power Advantage 2.4.4.113021

- Exclude empty directories so development jars match between existing workspaces and fresh CI checkouts.
Expand Down
42 changes: 26 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,34 +1,39 @@
# PowerAdvantage

Power Advantage provides shared power, fluid, item transport, and compatibility APIs for its Minecraft 1.13.2 expansion mods.
**Minecraft 1.14.4**

This port keeps existing registry names and includes migration from 1.10 and 1.12.
This port has passed the automated machine/migration tests and a manual check of
visuals and recipe unlocks. See the [qualification report](docs/1.14/BROADER-QUALIFICATION.md)
for coverage and limits. Use disposable copies for upgrades.

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

This port keeps existing registry names and carries forward migration from 1.10 and 1.12.
Always back up a world before upgrading, and check that its other mods also support the target version.
The [qualification notes](docs/1.13/CURRENT-QUALIFICATION.md) separate tested scenarios from remaining gaps;
The archived [1.13 qualification notes](docs/1.13/CURRENT-QUALIFICATION.md) separate its tested scenarios from remaining gaps;
they are not a guarantee that an entire modpack can be upgraded without losses.
The [1.14 qualification report](docs/1.14/BROADER-QUALIFICATION.md) records the
repeated checks, exact tested jars and remaining limits for this candidate.

Recipe-book discovery now follows relevant ingredients. See the [all-Advantage material checklist and automated discovery tests](docs/1.13/RECIPE-DISCOVERY.md). To regenerate the checked-in unlock JSON after changing recipes, run `node tools/generate-recipe-unlocks.js`; `check` rejects missing or stale ingredient criteria.

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.13.2
## Building Minecraft 1.14.4

The `master-1.13.2` build uses ForgeGradle 7.0.34 and Gradle 9.6.1. Run Gradle with Java 17; Gradle resolves the Java 8 production toolchain.
The `master-1.14.4` build uses Forge 28.2.26, ForgeGradle 7.0.34 and Gradle 9.6.1. Run Gradle with Java 17; Gradle resolves the Java 8 production toolchain.

Build the pinned Base Metals `3.0.1.113021` and OreSpawn `4.1.0.113021` deobf jars in their sibling checkouts, then run:
Build the pinned Base Metals `3.0.1.114041` and OreSpawn `4.1.1.114041` deobf jars in their sibling checkouts, then run:

```text
gradlew.bat clean check build javadoc verifyReleaseDependencies verifyReleaseArtifacts writeReleaseChecksums verifyEclipseProductionClasspath
```

The default dependency paths follow the local MMD checkout layout. Other layouts can pass `-PbaseMetalsDeobfJar=<path>` and `-PoreSpawnDeobfJar=<path>`. Dependencies are present on development classpaths but are never embedded in PowerAdvantage artifacts.

The pinned Base Metals development jar predates archive line-ending normalization.
Both the original Windows-input jar and a clean LF-checkout build have exact
checksums in `gradle.properties`. Their class bytes and archive entries match;
only text line endings differ. CI uses the LF build. Unknown hashes still fail.
Advantage's own archives normalize text to LF.
All Advantage archives also exclude empty directories left behind by older source layouts.
Dependency checksums and source commits are recorded in `gradle.properties`.
Unknown artifacts fail the dependency audit. Archives use reproducible ordering,
LF text and no empty directories, so fresh checkouts produce the same bytes.

Release jars are written to `build/libs`; `deobfJar` writes the sibling-development jar to `build/libs-dev`.

Expand All @@ -42,16 +47,21 @@ 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 test all three Advantage mods together, run `gradlew.bat prepareCombinedEclipseLaunch`, refresh Eclipse, and launch `runClientAllAdvantage.launch`. This additional profile loads the pinned Steam/Electric deobf jars, Base Metals and OreSpawn alongside Power's Eclipse output. It uses the same `run` directory and test saves; it does not copy, open or modify a save automatically. The ordinary `runClient.launch` remains Power-only. Alternative checkout layouts can pass `-PsteamAdvantageDeobfJar=<path>` and `-PelectricAdvantageDeobfJar=<path>`; supplied jars must match the `test-rig/profiles/dev-core.json` pins. Regenerate the combined launch after refreshing its dependencies or the base launch.
To test all three Advantage mods together, run `gradlew.bat prepareCombinedEclipseLaunch`, refresh Eclipse, and launch `runClientAllAdvantage.launch`. This additional profile loads the pinned Steam/Electric deobf jars, Base Metals and OreSpawn alongside Power's Eclipse output. It uses the same `run` directory and test saves; it does not copy, open or modify a save automatically. The ordinary `runClient.launch` remains Power-only. Alternative checkout layouts can pass `-PsteamAdvantageDeobfJar=<path>` and `-PelectricAdvantageDeobfJar=<path>`; supplied jars must match the `test-rig/profiles/native114/dev-core.json` pins. Regenerate the combined launch after refreshing its dependencies or the base launch.

The combined [client resource probe](test-rig/client-resources/README.md), with `-RequireExtensions`, checks item names, baked models, textures and every valid block state across all three Advantage mods. The legacy Steam/Electric model-path and selector failures are repaired; [the qualification notes](docs/1.13/OIL-TRANSFER.md#combined-resource-repair-21-october-2026) retain the failing evidence and subsequent full-scope result. Native resource checks remain separate from manual graphical/gameplay acceptance.
The combined [client resource probe](test-rig/client-resources/README.md) checks native baked models, textures, creative entries, translated item names, fluid rendering and tank gauges without opening a save. Static resource and locale regressions also run under `check`. Automated recipe-book fixtures and the accepted manual visual/recipe-unlock checks have separate scopes; see the [current port status](docs/1.14/PORT-STATUS.md).

The [client resource probe](test-rig/client-resources/README.md) checks native baked models, textures, creative entries, and translated item names without opening a world. Static resource and locale regressions also run under `check`.
The [broader 1.14 test results and play-test checklist](docs/1.14/BROADER-QUALIFICATION.md) separate migration, connected machinery, endurance and manual checks. Test worlds and reports stay local; use disposable copies when trying an old save.

## Compatibility

The implementation namespace is `zone.moddev.mc.poweradvantage`. The historical `cyano.poweradvantage.api` surface, including `FluidNetworkApi`, remains available to dependent mods. Registry names, fluids, tile IDs, NBT keys, OreSpawn provider IDs, and configuration meaning remain stable.

Forge 1.14 handles oil rendering, fluid containers, registered menus, tag updates
and parts-loot events directly. Advantage's public fluid contract is bridged to
native sided fluid capabilities; its millibucket units and saved tank keys remain
unchanged. The remaining coremod runs before vanilla's legacy-world data fixes.

PowerAdvantage owns the shared pre-flattening migration hook used by all three Advantage mods. See [the 1.13 migration guide](docs/1.13/MIGRATION.md) before opening an irreplaceable 1.10 or 1.12 world. The [Advantage Works rig](test-rig/README.md) provides repeatable machine, restart, world-generation, and migration checks.

The [endurance protocol](docs/1.13/ENDURANCE.md) exercises repeat-batch operation in fresh and migrated disposable worlds, followed by a complete server-process restart. Its coverage limits are separate from frozen-state migration and manual client acceptance.
Expand All @@ -60,7 +70,7 @@ The [chunk and moving-drill protocol](docs/1.13/CHUNK-AND-DRILLS.md) adds genuin

The [partial-network and extended-drill protocol](docs/1.13/PARTIAL-NETWORKS-AND-EXTENDED-DRILLS.md) separates endpoint unloading/recovery from whole-network reloads, and covers repeated moves, vertical track travel, junctions, blocked output and redstone interruption.

The [player and entity migration report](docs/1.13/PLAYER-AND-ENTITY-MIGRATION.md) covers player files, inventories, nested items, ownership, saved entities and full restarts. The eight tested routes pass with the repaired 1.12 bridge. Use Electric Advantage `2.2.3.112021` for the current turbine and drill fixes; the original `2.2.1.112021` jar remains a failing historical control.
The archived [player and entity migration report](docs/1.13/PLAYER-AND-ENTITY-MIGRATION.md) covers player files, inventories, nested items, ownership, saved entities and full restarts on 1.13. Its eight routes passed with the repaired 1.12 bridge. Use Electric Advantage `2.2.3.112021` for that bridge's turbine and drill fixes; the original `2.2.1.112021` jar remains a failing historical control.

The [additional-dimension protocol](docs/1.13/DIMENSIONS-AND-ENTITY-LIFECYCLE.md)
covers Nether/End player and entity fixtures, native passenger/leash relationships
Expand Down
Loading
Loading