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
  •  
  •  
  •  
11 changes: 6 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ permissions:
contents: read

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

jobs:
Expand Down Expand Up @@ -85,13 +85,14 @@ jobs:
- name: Upload audited release candidate
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: PowerAdvantage-1.15.2-${{ github.sha }}
name: basePower-1.15.2-${{ 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/basePower-2.4.7.115021.jar
build/libs/basePower-2.4.7.115021-sources.jar
build/libs/basePower-2.4.7.115021-javadoc.jar
build/libs-dev/basePower-2.4.7.115021-deobf.jar
build/release/SHA256SUMS
CHANGELOG.txt
- name: Upload diagnostics on failure
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 1.15.2 test-coverage backport
2.4.7.115021 - basePower for Minecraft 1.15.2

- Continue Power Advantage under the basePower name on Forge 1.15.2.
- Read old Power Advantage saves and keep existing basePower world IDs.
- Keep the baseSteam and baseElectric equipment on the shared basePower tab.

Earlier 1.15.2 fixes

- Keep energy that a consumer cannot accept available to the rest of its network.
- Check every accessible conveyor slot, respect stack limits and keep different item NBT separate.
Expand Down
34 changes: 14 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,15 @@
# PowerAdvantage
# basePower for Minecraft 1.15.2

**Minecraft 1.15.2**
basePower continues DrCyano's Power Advantage. It adds conveyors, fluid pipes,
tanks and oil processing, and provides the shared network for baseSteam and
baseElectric. All three mods use the **basePower** creative tab.

Power Advantage 2.4.6.115021 targets Minecraft 1.15.2. See the
[current test record](docs/1.15/TEST-COVERAGE-BACKPORT.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.
Back up your world and config before upgrading, and try the upgrade on a copy
first. Keep all three mods on the same Minecraft version and check that the
rest of your modpack supports it too.

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

**Back up the entire world before upgrading. Test only disposable copies.**
The port retains existing registry names and legacy migration code. Upgrade tests
use disposable original and maintained saves, including connected machines.
Check every other mod's target-version support too.
The accepted [1.14 results](docs/1.14/BROADER-QUALIFICATION.md) are historical
evidence, not qualification of this port or a whole modpack.
The [earlier 1.15 test record](docs/1.15/TEST-COVERAGE-BACKPORT.md) covers
Power Advantage before the rename. It does not qualify the basePower jars.

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 @@ -66,7 +60,7 @@ 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 baseSteam and baseElectric `2.2.8.115021` 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
Expand All @@ -79,10 +73,10 @@ visual and interaction acceptance remains separate; see the current test record.

## Compatibility

The implementation namespace remains `zone.moddev.mc.poweradvantage`, with the
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 implementation is in `zone.moddev.mc.basepower`; the historical
`cyano.poweradvantage.api` package remains available. The save upgrader maps
Power Advantage IDs to basePower while retaining block states and machine NBT.
Worlds already using basePower keep their existing IDs.

The 1.15 changes use native activation results, non-solid block properties,
texture-atlas access and client render-layer registration. The shared migration
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', forge31RunTargets[name]
environment 'MCP_MAPPINGS', "${mapping_channel}_${mapping_version}"
environment 'MCP_VERSION', mcp_version
Expand Down Expand Up @@ -317,7 +317,7 @@ tasks.register('verifyReleaseConfiguration') {
if (new JsonSlurper().parse(file('src/main/resources/pack.mcmeta')).pack.pack_format != 5) {
throw new GradleException('Minecraft 1.15.2 resources must use pack format 5')
}
if (project.mod_version != '2.4.6.115021') {
if (project.mod_version != '2.4.7.115021') {
throw new GradleException("Unexpected PowerAdvantage release version: ${project.mod_version}")
}
if (project.minecraft_version != '1.15.2'
Expand All @@ -333,10 +333,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 @@ -351,17 +351,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.6.115021"')
'src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java').getText('UTF-8')
if (!mainSource.contains('MODID = "basepower"')
|| !mainSource.contains('VERSION = "2.4.7.115021"')
|| !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 @@ -375,7 +375,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 @@ -405,9 +405,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 @@ -509,12 +509,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 @@ -530,7 +530,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 @@ -558,7 +558,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 @@ -658,17 +658,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 @@ -1091,9 +1091,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 @@ -1134,10 +1134,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.7.115021-deobf.jar')),
electricadvantage: file(providers.gradleProperty('electricAdvantageDeobfJar').getOrElse(
'../ElectricAdvantage/ElectricAdvantage/build/libs-dev/ElectricAdvantage-2.2.7.115021-deobf.jar'))
basesteam: file(providers.gradleProperty('steamAdvantageDeobfJar').getOrElse(
'../SteamAdvantage/SteamAdvantage/build/libs-dev/baseSteam-2.2.8.115021-deobf.jar')),
baseelectric: file(providers.gradleProperty('electricAdvantageDeobfJar').getOrElse(
'../ElectricAdvantage/ElectricAdvantage/build/libs-dev/baseElectric-2.2.8.115021-deobf.jar'))
]

tasks.register('prepareCombinedEclipseLaunch') {
Expand Down
10 changes: 5 additions & 5 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ java_version=8
java_toolchain_version=8.0.502+7
java_setup_version=8.0.502+7
gradle_java_version=17
curseforge_project_id=240982
curseforge_project_id=1780140

mod_id=poweradvantage
mod_name=Power Advantage
mod_id=basepower
mod_name=basePower
mod_license=LGPL-3.0-only
mod_version=2.4.6.115021
mod_group=zone.moddev.mc.poweradvantage
mod_version=2.4.7.115021
mod_group=zone.moddev.mc.basepower
mod_authors=DrCyano (aka Cyanobacterium)
mod_description=API and shared machines for pressure, electricity, quantum power, fluids, and item transport.

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/cyano/poweradvantage/api/ConduitBlock.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cyano.poweradvantage.api;

import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry;
import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry;
import net.minecraft.block.material.Material;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/cyano/poweradvantage/api/ConduitType.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cyano.poweradvantage.api;

import zone.moddev.mc.poweradvantage.util.HashCodeHelper;
import zone.moddev.mc.basepower.util.HashCodeHelper;

import java.util.Locale;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public final class FluidCategoryRegistry {

static {
registerAlias(CRUDE_OIL, "crude_oil");
registerAlias(CRUDE_OIL, "poweradvantage:crude_oil");
registerAlias(CRUDE_OIL, "basepower:crude_oil");
registerAlias(CRUDE_OIL, "mineralogy_crude_oil");
registerAlias(CRUDE_OIL, "mineralogy:crude_oil");
registerAlias(CRUDE_OIL, "oil");
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/cyano/poweradvantage/api/GUIBlock.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.IBlockReader;
import zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry;
import zone.moddev.mc.basepower.registry.MachineGUIRegistry;
import cyano.poweradvantage.api.fluid.IAdvantageFluidHandler;
import zone.moddev.mc.poweradvantage.util.FluidContainerHelper;
import zone.moddev.mc.basepower.util.FluidContainerHelper;

/**
* <p>
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/cyano/poweradvantage/api/PoweredEntity.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cyano.poweradvantage.api;

import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry;
import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.nbt.CompoundNBT;
Expand Down Expand Up @@ -29,8 +29,8 @@ public abstract class PoweredEntity extends TileEntity implements ITickableTileE

private final int powerUpdateInterval = 8;
private int conduitRefreshDelay = 2;
private final zone.moddev.mc.poweradvantage.util.MachineCapabilities machineCapabilities =
new zone.moddev.mc.poweradvantage.util.MachineCapabilities(this);
private final zone.moddev.mc.basepower.util.MachineCapabilities machineCapabilities =
new zone.moddev.mc.basepower.util.MachineCapabilities(this);

@Override
public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import cyano.poweradvantage.api.ConduitBlock;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PowerConnectorContext;
import zone.moddev.mc.poweradvantage.init.Fluids;
import zone.moddev.mc.basepower.init.Fluids;
import net.minecraft.block.material.Material;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import net.minecraft.block.Block;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry;
import zone.moddev.mc.poweradvantage.init.Fluids;
import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry;
import zone.moddev.mc.basepower.init.Fluids;

/**
* Stable entry point for offering fluid from another mod to a PowerAdvantage
Expand Down
Loading
Loading