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
  •  
  •  
  •  
32 changes: 25 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Power Advantage 1.10 CI
name: basePower 1.10 CI

on:
push:
Expand All @@ -13,7 +13,7 @@ permissions:
contents: read

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

jobs:
Expand Down Expand Up @@ -81,28 +81,46 @@ jobs:
-PoreSpawnDeobfJar=${{ steps.orespawn.outputs.jar }}
--no-daemon --stacktrace

- name: Check the isolated test harness
run: >-
./gradlew -p test-rig clean check assemble
-PpowerAdvantageDeobfJar=${{ github.workspace }}/build/libs-dev/basePower-2.4.4.110021-deobf.jar
--no-daemon --stacktrace

- name: Install Python for migration contract tests
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
with:
python-version: '3.12.14'

- name: Check migration and progression contracts
run: |
python -m pip install -r test-rig/migration/requirements.txt
python -m unittest discover -s test-rig/migration -p 'test_*.py'

- name: Upload audited release candidate
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: PowerAdvantage-1.10.2-${{ github.sha }}
name: basePower-1.10.2-${{ github.sha }}
if-no-files-found: error
retention-days: 30
path: |
build/libs/PowerAdvantage-2.4.3.110021.jar
build/libs/PowerAdvantage-2.4.3.110021-sources.jar
build/libs/PowerAdvantage-2.4.3.110021-javadoc.jar
build/libs/basePower-2.4.4.110021.jar
build/libs/basePower-2.4.4.110021-sources.jar
build/libs/basePower-2.4.4.110021-javadoc.jar
build/release/SHA256SUMS
CHANGELOG.txt

- name: Upload diagnostics on failure
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: PowerAdvantage-1.10.2-diagnostics-${{ github.sha }}
name: basePower-1.10.2-diagnostics-${{ github.sha }}
if-no-files-found: ignore
retention-days: 14
path: |
build/test-results/**
build/reports/**
build/*-run/logs/**
build/problems/**
test-rig/build/gradle/test-results/**
test-rig/build/gradle/reports/**
11 changes: 8 additions & 3 deletions .github/workflows/release-on-tag.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Validate Power Advantage release tag
name: Validate basePower release tag

on:
push:
Expand All @@ -10,13 +10,13 @@ permissions:
contents: read

concurrency:
group: poweradvantage-release-tag-${{ github.ref_name }}
group: basepower-release-tag-${{ github.ref_name }}
cancel-in-progress: false

jobs:
validate-release-tag:
name: Validate tag for manual release confirmation
if: github.repository == 'MinecraftModDevelopmentMods/PowerAdvantage'
if: github.repository == 'MinecraftModDevelopmentMods/basePower'
runs-on: ubuntu-latest
timeout-minutes: 10

Expand All @@ -37,6 +37,11 @@ jobs:
minecraft_version="$(value minecraft_version)"
loader_name="$(value loader_name)"
loader_code="$(value loader_code)"
project_id="$(value curseforge_project_id)"
if [[ ! "$project_id" =~ ^[1-9][0-9]*$ || "$project_id" == '240982' ]]; then
echo "basePower publication requires a new assigned CurseForge project; refusing $project_id" >&2
exit 1
fi

IFS=. read -r mc_major mc_minor mc_patch extra <<<"$minecraft_version"
if [[ -n "${extra:-}" || -z "${mc_major:-}" || -z "${mc_minor:-}" ]]; then
Expand Down
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
/classes/
/logs/
/mcmodsrepo/
/.ci-dependencies/
/test-rig/.cache/
/test-rig/.gradle/
/test-rig/build/
Expand Down Expand Up @@ -77,6 +78,13 @@
!/libs/RF-API.zip

/secret.json

# Packaged output; only the wrapper and the pinned RF API belong in source control.
*.jar
*.zip
!/gradle/wrapper/gradle-wrapper.jar
!/libs/RF-API.jar
!/libs/RF-API.zip
# Nested local tooling and generated output
AGENTS.md
AGENT.md
Expand Down
18 changes: 17 additions & 1 deletion CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
Unreleased
basePower 2.4.4.110021

- Continue Power Advantage as basePower, with the new basepower mod ID and namespace.
- Read released Cyano 1.10 block, item and tile identities without rebuilding machines.
- Import existing configuration and loot settings without overwriting base customisations.
- Translate saved Forge mod and oil-owner records before world loading, with byte-for-byte header backups.
- Keep OreSpawn choices during the identity change and stop on conflicting old and new settings.
- Keep fluid identities, processing rules and the legacy add-on API available.
- Restore translated portable-tank descriptions and retain the empty tank's description on its item.
- Check upgrades on copies of released Cyano worlds, including Sylvester, and retain machine contents across full restarts.
- Add finite-material recipe progression checks, including returned buckets, obtainable ingredient alternatives, villager trades and connected starter machines across full restarts.
- Route Forge fluid capability calls through each machine's fluid handler, so stills fill their input tank and tank restrictions are respected.
- Keep current OreSpawn global and saved-world profiles readable after a full restart, without resetting generation choices or accepting unknown future schemas.
- Add the basePower project logo and updated installation, migration and CurseForge descriptions.
- Run the migration-contract checks in clean checkouts and CI without depending on local folder names.

Earlier unreleased Advantage fixes, retained in basePower

- Restore missing carbon-dust and steel-block recipe names when equivalent registered materials are available. Keep existing Ore Dictionary entries and recipe amounts unchanged.
- Enable Forge's universal bucket during mod construction so oil buckets work without another mod enabling them first.
Expand Down
48 changes: 39 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,40 @@
# PowerAdvantage
# basePower

Power Advantage provides shared power, fluid, and item transport systems for its Minecraft 1.10.2 expansion mods.
basePower continues DrCyano's Power Advantage as a Base Metals expansion for Minecraft 1.10.2. It provides conveyors, filters, fluid pipes, tanks, oil processing and the shared power systems used by baseSteam and baseElectric. The original Advantage repositories remain available as historical references.

The [test coverage backport notes](TEST-COVERAGE-BACKPORT.md#final-recorded-candidate) record the final machine, restart, control, partial-network, GUI, endurance, connected-world and reproducibility results alongside exact candidate hashes. The bounded legacy checks pass; the recipe progression graph is still partial. Earlier failures, modern follow-up findings and manual-testing limits are kept in the notes. This is not an all-machines or all-worlds guarantee.
The new mod ID is `basepower`, with implementation packages under `zone.moddev.mc.basepower`. This is a coordinated replacement, not an add-on to the old Power Advantage jar. Read the [world migration instructions](docs/1.10/base-migration.md) before replacing mods in an existing world.

The maintained implementation namespace is `zone.moddev.mc.poweradvantage`. The legacy
## Playing And Upgrading

Use Java 8, Forge `12.18.3.2511` or a compatible later 1.10.2 build, Base Metals and MMD OreSpawn. The maintained dependency pack was tested with Base Metals `2.5.1.110021` and OreSpawn `4.1.2.110021`.

Back up the complete world and configuration, then try the upgrade on a copy. Replace Power Advantage with basePower. Replace Steam and Electric Advantage with matching baseSteam and baseElectric builds if they are installed; do not mix the old and new families. Existing machines and their saved contents migrate without rebuilding. Check the copy again after closing Minecraft completely and restarting it.

The supported historical source is the released Cyano 1.10.2 line. Old third-party integrations which check the original mod IDs may need an update. In particular, IAF's plumbing provider detection needs its separate basePower update; the preserved API alone cannot change that check.

## Validation And Guides

The [current candidate checks](docs/1.10/base-qualification.md) list the exact tested jars, results and remaining release gates.

The [recipe progression checks](docs/1.10/recipe-progression-checks.md) explain how the test rig verifies finite crafting chains, returned buckets, trading and a connected starter plant across full restarts.

The [historical test coverage notes](TEST-COVERAGE-BACKPORT.md#final-recorded-candidate) record the earlier Advantage candidates, including their exact hashes and remaining limits. They do not qualify the renamed jars. The base migration uses fresh disposable-world, operating, restart, GUI and endurance checks. The bounded recipe audit is separate from its still-partial crafting progression graph; neither is an all-machines or all-worlds guarantee.

The maintained implementation namespace is `zone.moddev.mc.basepower`. The legacy
`cyano.poweradvantage.api` package remains the supported add-on API.

External fluid producers can offer fluid to an adjacent Power Advantage pipe through
External fluid producers can offer fluid to an adjacent basePower pipe through
`cyano.poweradvantage.api.fluid.FluidNetworkApi.offerFluid(...)`. The method reports the exact
accepted amount without draining the caller's tank, allowing optional integrations to remain in
control of their own fluid state.

The [Advantage Works 1.10.2 Handbook](docs/1.10/README.md) documents every machine and component across Power, Steam, and Electric Advantage, including commissioning layouts and known investigation points. The [MMD material and fluid compatibility specification](docs/1.10/mmd-material-fluid-compatibility.md) defines OreSpawn ownership, legacy migration, crude-oil aliases, and Ore Dictionary names.

The source-controlled [Advantage Works test rig](test-rig/README.md) turns those commissioning cards into a disposable, walkable Forge server world with repeatable save/restart checkpoints. It is a separate test mod and is never packaged with PowerAdvantage.
The source-controlled [Advantage Works test rig](test-rig/README.md) turns those commissioning cards into a disposable, walkable Forge server world with repeatable save/restart checkpoints. It is a separate test mod and is never packaged with basePower.

## Building Minecraft 1.10.2

The rig profiles use Steam and Electric Advantage `2.2.5.110021`, which retain unfinished
drill work after a restart. The machine repairs and their verification scope are
described in the test coverage notes above; this work does not bump the version.
The candidate versions are basePower `2.4.4.110021` and baseSteam/baseElectric `2.2.6.110021`. Local qualification includes 188 operating cases and 188 cold-state comparisons in each dependency pack, original Cyano fixtures, a disposable Sylvester upgrade, and two finite-supply Steam endurance runs. These are not a promise that every machine has run for 30 minutes or that every third-party integration has been tested.

The `master-1.10.2` build uses ForgeGradle 7.0.34 and Gradle 9.6.1. Run Gradle with Java 17; Gradle resolves the Java 8 toolchain used for compilation.

Expand All @@ -30,6 +44,16 @@ Build the pinned OreSpawn commit `5a50df1158e948c8db55814e819090b34c12d765` firs
gradlew.bat clean check build verifyReleaseDependencies verifyReleaseArtifacts writeReleaseChecksums
```

The separate harness and migration-contract checks are also run in CI. With Python 3.12 installed:

```text
gradlew.bat -p test-rig clean check assemble
python -m pip install -r test-rig/migration/requirements.txt
python -m unittest discover -s test-rig/migration -p "test_*.py"
```

These contract tests do not start the full native server matrix. Its copied-world, operating and endurance results are recorded in the qualification notes.

Release jars are written to `build/libs`. The deobfuscated development jar for sibling mod compilation is written to `build/libs-dev` by `deobfJar` or `build`.

For Eclipse, import the repository as an existing Gradle project and run:
Expand All @@ -39,3 +63,9 @@ gradlew.bat cleanEclipse verifyEclipseProductionClasspath
```

Base Metals remains a required distribution dependency and is absent from the compile classpath. OreSpawn is a required runtime dependency whose pinned public API is used at compile time; it is never bundled. Optional RF and RebornCore integrations compile against pinned API inputs and are not bundled.

## Publishing

Source delivery and CurseForge publication are separate. The new CurseForge project ID is still `0`, which deliberately blocks uploads; the original Power Advantage project must not be reused. No tag or release is created by the ordinary CI build.

The [project-page copy](docs/curseforge-description.md) and [logo](docs/branding/README.md) are kept with the source. The logo is not part of the mod jar, so it does not change the tested artifacts.
Loading
Loading