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

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

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

jobs:
Expand All @@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 90
steps:
- name: Check out PowerAdvantage
- name: Check out basePower
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Check out pinned OreSpawn
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
Expand Down Expand Up @@ -73,20 +73,21 @@ jobs:
- name: Upload audited release candidate
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: PowerAdvantage-1.14.4-${{ github.sha }}
name: basePower-1.14.4-${{ github.sha }}
if-no-files-found: error
retention-days: 30
path: |
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/libs/basePower-2.4.6.114041.jar
build/libs/basePower-2.4.6.114041-sources.jar
build/libs/basePower-2.4.6.114041-javadoc.jar
build/libs-dev/basePower-2.4.6.114041-deobf.jar
build/release/SHA256SUMS
CHANGELOG.txt
- name: Upload diagnostics on failure
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: PowerAdvantage-1.14.4-diagnostics-${{ github.sha }}
name: basePower-1.14.4-diagnostics-${{ github.sha }}
if-no-files-found: ignore
retention-days: 14
path: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release-on-tag.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 Down
8 changes: 7 additions & 1 deletion CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
Unreleased - Minecraft 1.14.4
2.4.6.114041 - basePower for Minecraft 1.14.4

- Continue Power Advantage under the basePower name on Forge 1.14.4.
- Open worlds from the original Advantage mods and earlier base* releases without replacing their machines.
- Put all three mods' items on one basePower creative tab.

Earlier 1.14.4 fixes

- Keep steel frames non-opaque on dedicated servers without changing their collision or drops.

Expand Down
31 changes: 12 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,10 @@
# PowerAdvantage
# basePower for Minecraft 1.14.4

**Minecraft 1.14.4**
basePower continues DrCyano's Power Advantage. It provides conveyors, fluids and the shared systems used by baseSteam and baseElectric. Look for the sprocket on the **basePower** creative tab for items from all three mods.

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.
Use Forge 28.2.26 and Java 8 with Base Metals 3.0.1.114041 and OreSpawn 4.1.1.114041. Back up the world and configuration and open a copy first. Keep the three base* mods together, and check that the other mods in your world support Minecraft 1.14.4.

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 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.
See the [1.14.4 upgrade and testing notes](docs/1.14/BASE-IDENTITY-MIGRATION.md) for the upgrade routes, what the tests check, and what still needs a player.

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.

Expand Down Expand Up @@ -49,20 +40,20 @@ Eclipse copies production resources from `build/resources/main`, not directly fr

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) 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 combined [client resource probe](test-rig/client-resources/README.md) checks 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`. The recipe-book probe uses exported native recipes, but does not replace checking unlock notifications in play.

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.
The [earlier 1.14 qualification report](docs/1.14/BROADER-QUALIFICATION.md) covers the pre-rename builds. It is not evidence for the new base* jars.

## 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.
The implementation namespace is `zone.moddev.mc.basepower`. The historical `cyano.poweradvantage.api` surface, including `FluidNetworkApi`, remains available to dependent mods. The saved-world migration maps original Advantage identities to their base* equivalents. Existing base* worlds keep their registry names, fluids, tile IDs, and machine data.

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.
basePower owns the shared pre-flattening migration hook used by all three mods. 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 @@ -87,7 +78,9 @@ The historical 1.10 handbook remains on the [1.10.2 branch](https://github.com/M
The local [test-coverage backport](docs/1.14/TEST-COVERAGE-BACKPORT.md) records the
repaired candidate, measured machine jobs, restart checks and GUI captures.

## Generator Follow-Up
## Archived Advantage Builds

These checkpoints apply only to the earlier builds, before the base* rename.

The [generator follow-up](docs/1.14/TEST-COVERAGE-BACKPORT.md#generator-follow-up) records the older `pa114-candidate-c` inputs.
Its 126 operating jobs and 126 cold checks, 39 GUI windows, 351 caption cases,
Expand All @@ -97,7 +90,7 @@ is retained. This is a pre-final Steam-control checkpoint, not qualification of
the newer SteamAdvantage jars or harness. Those still need the final sweep.
Manual play-testing and release review remain separate.

## Final T Candidate
**Final pre-rename candidate**

The [final-t checkpoint](docs/1.14/TEST-COVERAGE-BACKPORT.md#final-t-candidate)
records profile `pa114-candidate-e` and its exact jar hashes. All 132 operating
Expand Down
60 changes: 30 additions & 30 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ plugins {

group = project.mod_group
version = project.mod_version
base.archivesName = 'PowerAdvantage'
base.archivesName = 'basePower'

def versionParts = project.mod_version.toString().tokenize('.')
if (versionParts.size() != 4 || !versionParts.every { it ==~ /\d+/ }) {
Expand Down Expand Up @@ -101,7 +101,7 @@ minecraft {
workingDir.convention layout.projectDirectory.dir(configuredRunDirectory)
systemProperty 'forge.logging.markers', 'REGISTRIES'
systemProperty 'forge.logging.console.level', 'info'
mods { poweradvantage { source sourceSets.main } }
mods { basepower { source sourceSets.main } }
environment 'target', forge28RunTargets[name]
environment 'MCP_MAPPINGS', "${mapping_channel}_${mapping_version}"
environment 'MCP_VERSION', mcp_version
Expand Down Expand Up @@ -314,7 +314,7 @@ tasks.register('verifyReleaseConfiguration') {
group = 'verification'
description = 'Validates release identity, target metadata, and optional integration policy.'
doLast {
if (project.mod_version != '2.4.5.114041') {
if (project.mod_version != '2.4.6.114041') {
throw new GradleException("Unexpected PowerAdvantage release version: ${project.mod_version}")
}
if (project.minecraft_version != '1.14.4'
Expand All @@ -330,10 +330,10 @@ tasks.register('verifyReleaseConfiguration') {
|| project.gradle_java_version != '17') {
throw new GradleException('Unexpected release dispatcher target metadata')
}
if (project.mod_id != 'poweradvantage'
|| project.group.toString() != 'zone.moddev.mc.poweradvantage'
|| base.archivesName.get() != 'PowerAdvantage'
|| project.curseforge_project_id != '240982') {
if (project.mod_id != 'basepower'
|| project.group.toString() != 'zone.moddev.mc.basepower'
|| base.archivesName.get() != 'basePower'
|| project.curseforge_project_id != '1780140') {
throw new GradleException('Unexpected Forge, Maven, archive, or CurseForge identity')
}
if (project.cf_requirements != 'base-metals,mmd-orespawn'
Expand All @@ -348,17 +348,17 @@ tasks.register('verifyReleaseConfiguration') {
throw new GradleException('Unexpected Base Metals or OreSpawn dependency identity')
}
String mainSource = file(
'src/main/java/zone/moddev/mc/poweradvantage/PowerAdvantage.java').getText('UTF-8')
if (!mainSource.contains('MODID = "poweradvantage"')
|| !mainSource.contains('VERSION = "2.4.5.114041"')
'src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java').getText('UTF-8')
if (!mainSource.contains('MODID = "basepower"')
|| !mainSource.contains('VERSION = "2.4.6.114041"')
|| !mainSource.contains('@Mod(PowerAdvantage.MODID)')) {
throw new GradleException('PowerAdvantage source identity changed')
}
if (!file('src/main/java/cyano/poweradvantage/api/PoweredEntity.java').isFile()) {
throw new GradleException('Legacy cyano.poweradvantage.api compatibility surface is missing')
}
String entitySource = file(
'src/main/java/zone/moddev/mc/poweradvantage/init/Entities.java').getText('UTF-8')
'src/main/java/zone/moddev/mc/basepower/init/Entities.java').getText('UTF-8')
[
'tileentity.pipe_terminal', 'tileentity.fluid_drain',
'tileentity.fluid_discharge', 'tileentity.fluid_storage_tank',
Expand All @@ -372,7 +372,7 @@ tasks.register('verifyReleaseConfiguration') {
}
}
String modsToml = file('src/main/resources/META-INF/mods.toml').getText('UTF-8').replace('\r\n', '\n')
['modId="poweradvantage"', 'modId="basemetals"', 'modId="orespawn"',
['modId="basepower"', 'modId="basemetals"', 'modId="orespawn"',
'mandatory=true'].each { required ->
if (!modsToml.contains(required)) {
throw new GradleException("Source mods.toml is missing ${required}")
Expand Down Expand Up @@ -402,9 +402,9 @@ tasks.register('verifyReleaseConfiguration') {
}
}
Map provider = new JsonSlurper().parse(file(
'src/main/resources/data/poweradvantage/orespawn/provider.json')) as Map
'src/main/resources/data/basepower/orespawn/provider.json')) as Map
Map desertOil = provider.fluid_deposits[
'poweradvantage:fluid_deposit/desert_crude_oil'].dimensions['minecraft:overworld'] as Map
'basepower:fluid_deposit/desert_crude_oil'].dimensions['minecraft:overworld'] as Map
if (desertOil.biome_dictionary != ['SANDY']
|| (desertOil.excluded_biome_dictionary as Set) != (['BEACH', 'MESA'] as Set)) {
throw new GradleException(
Expand Down Expand Up @@ -506,12 +506,12 @@ tasks.register('verifyReleaseArtifacts') {
new ZipFile(mainJar).withCloseable { zip ->
List<String> names = zip.entries().collect { it.name }
['META-INF/mods.toml', 'pack.mcmeta',
'zone/moddev/mc/poweradvantage/PowerAdvantage.class',
'zone/moddev/mc/basepower/PowerAdvantage.class',
'cyano/poweradvantage/api/PoweredEntity.class',
'cyano/poweradvantage/api/fluid/FluidNetworkApi.class',
'assets/poweradvantage/lang/en_us.json',
'data/poweradvantage/recipes/fluid_drain.json',
'data/poweradvantage/advancements/recipes/sprocket_rod_normal.json'].each { required ->
'assets/basepower/lang/en_us.json',
'data/basepower/recipes/fluid_drain.json',
'data/basepower/advancements/recipes/sprocket_rod_normal.json'].each { required ->
if (!names.contains(required)) {
throw new GradleException("Release jar is missing ${required}")
}
Expand All @@ -527,7 +527,7 @@ tasks.register('verifyReleaseArtifacts') {
}
String modsToml = zip.getInputStream(zip.getEntry('META-INF/mods.toml'))
.getText(StandardCharsets.UTF_8.name())
if (!modsToml.contains('modId="poweradvantage"')
if (!modsToml.contains('modId="basepower"')
|| !modsToml.contains("version=\"${project.mod_version}\"")
|| !modsToml.contains('modId="basemetals"')
|| !modsToml.contains('modId="orespawn"')) {
Expand Down Expand Up @@ -555,7 +555,7 @@ tasks.register('verifyReleaseArtifacts') {
}

new ZipFile(new File(libs, expectedReleaseFiles.get()[1])).withCloseable { sourceZip ->
if (sourceZip.getEntry('zone/moddev/mc/poweradvantage/PowerAdvantage.java') == null
if (sourceZip.getEntry('zone/moddev/mc/basepower/PowerAdvantage.java') == null
|| sourceZip.getEntry('cyano/poweradvantage/api/PoweredEntity.java') == null) {
throw new GradleException('Sources jar is missing implementation or legacy API sources')
}
Expand Down Expand Up @@ -655,17 +655,17 @@ publishing {
pom {
name = 'Power Advantage'
description = project.mod_description
url = 'https://github.com/MinecraftModDevelopmentMods/PowerAdvantage'
url = 'https://github.com/MinecraftModDevelopmentMods/basePower'
licenses {
license {
name = 'GNU Lesser General Public License, Version 3'
url = 'https://www.gnu.org/licenses/lgpl-3.0.txt'
}
}
scm {
connection = 'scm:git:https://github.com/MinecraftModDevelopmentMods/PowerAdvantage.git'
developerConnection = 'scm:git:ssh://git@github.com/MinecraftModDevelopmentMods/PowerAdvantage.git'
url = 'https://github.com/MinecraftModDevelopmentMods/PowerAdvantage'
connection = 'scm:git:https://github.com/MinecraftModDevelopmentMods/basePower.git'
developerConnection = 'scm:git:ssh://git@github.com/MinecraftModDevelopmentMods/basePower.git'
url = 'https://github.com/MinecraftModDevelopmentMods/basePower'
}
}
}
Expand Down Expand Up @@ -1088,9 +1088,9 @@ tasks.register('verifyRecipeTagGuards') {
throw new GradleException("${recipeFile.path} contains a non-object recipe condition")
}
Set<String> guards = conditions
.findAll { it instanceof Map && it.type == 'poweradvantage:tag_not_empty' }
.findAll { it instanceof Map && it.type == 'basepower:tag_not_empty' }
.collect { it.tag as String } as Set<String>
Set<String> emptyGuards = conditions.findAll { it.type == 'poweradvantage:tag_empty' }
Set<String> emptyGuards = conditions.findAll { it.type == 'basepower:tag_empty' }
.collect { it.tag as String } as Set<String>
if (!(emptyGuards.intersect(guards)).isEmpty()) {
throw new GradleException("${recipeFile.path} requires the same tag to be empty and nonempty")
Expand Down Expand Up @@ -1131,10 +1131,10 @@ tasks.register('clientResourceProbeJar', Jar) {
// Optional coordinated play-test launch. The ordinary launch stays Power-only;
// these deobf jars are runtime inputs, never release contents or compile dependencies.
def advantageExtensionJars = [
steamadvantage: file(providers.gradleProperty('steamAdvantageDeobfJar').getOrElse(
'../SteamAdvantage/SteamAdvantage/build/libs-dev/SteamAdvantage-2.2.6.114041-deobf.jar')),
electricadvantage: file(providers.gradleProperty('electricAdvantageDeobfJar').getOrElse(
'../ElectricAdvantage/ElectricAdvantage/build/libs-dev/ElectricAdvantage-2.2.6.114041-deobf.jar'))
basesteam: file(providers.gradleProperty('steamAdvantageDeobfJar').getOrElse(
'../SteamAdvantage/SteamAdvantage/build/libs-dev/baseSteam-2.2.8.114041-deobf.jar')),
baseelectric: file(providers.gradleProperty('electricAdvantageDeobfJar').getOrElse(
'../ElectricAdvantage/ElectricAdvantage/build/libs-dev/baseElectric-2.2.8.114041-deobf.jar'))
]

tasks.register('prepareCombinedEclipseLaunch') {
Expand Down
Loading
Loading