diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 57bc1a7..16a7b78 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,4 +1,4 @@
-name: Power Advantage 1.10 CI
+name: basePower 1.10 CI
on:
push:
@@ -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:
@@ -81,16 +81,32 @@ 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
@@ -98,7 +114,7 @@ jobs:
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: |
@@ -106,3 +122,5 @@ jobs:
build/reports/**
build/*-run/logs/**
build/problems/**
+ test-rig/build/gradle/test-results/**
+ test-rig/build/gradle/reports/**
diff --git a/.github/workflows/release-on-tag.yml b/.github/workflows/release-on-tag.yml
index af9cd1a..1063725 100644
--- a/.github/workflows/release-on-tag.yml
+++ b/.github/workflows/release-on-tag.yml
@@ -1,4 +1,4 @@
-name: Validate Power Advantage release tag
+name: Validate basePower release tag
on:
push:
@@ -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
@@ -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
diff --git a/.gitignore b/.gitignore
index 22b1d0e..1c4c442 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,7 @@
/classes/
/logs/
/mcmodsrepo/
+/.ci-dependencies/
/test-rig/.cache/
/test-rig/.gradle/
/test-rig/build/
@@ -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
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 4e4bce2..4e55e89 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -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.
diff --git a/README.md b/README.md
index c608618..46bbb98 100644
--- a/README.md
+++ b/README.md
@@ -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.
@@ -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:
@@ -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.
diff --git a/build.gradle b/build.gradle
index ce740eb..d53a87f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,7 +34,7 @@ tasks.register('clientResourceProbeJar', Jar) {
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+/ }) {
@@ -310,7 +310,7 @@ tasks.register('verifyReleaseConfiguration') {
group = 'verification'
description = 'Validates release identity, target metadata, and optional integration policy.'
doLast {
- if (project.mod_version != '2.4.3.110021') {
+ if (project.mod_version != '2.4.4.110021') {
throw new GradleException("Unexpected PowerAdvantage release version: ${project.mod_version}")
}
if (project.minecraft_version != '1.10.2'
@@ -325,10 +325,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 != '0') {
throw new GradleException('Unexpected Forge, Maven, archive, or CurseForge identity')
}
if (project.cf_requirements != 'base-metals,mmd-orespawn'
@@ -356,10 +356,10 @@ tasks.register('verifyReleaseConfiguration') {
}
}
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.3.110021"')
- || !mainSource.contains('required-after:orespawn@[4.0.6,5.0.0);after:basemetals')) {
+ 'src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java').getText('UTF-8')
+ if (!mainSource.contains('MODID = "basepower"')
+ || !mainSource.contains('VERSION = "2.4.4.110021"')
+ || !mainSource.contains('required-before:orespawn@[4.0.6,5.0.0)')) {
throw new GradleException('PowerAdvantage source identity or dependency policy changed')
}
if (!file('src/main/java/cyano/poweradvantage/api/PoweredEntity.java').isFile()) {
@@ -367,12 +367,26 @@ tasks.register('verifyReleaseConfiguration') {
}
def metadata = new JsonSlurper().parse(file('src/main/resources/mcmod.info'))
def mod = metadata instanceof List ? metadata.first() : metadata
- if (mod.modid != 'poweradvantage') {
+ if (mod.modid != 'basepower') {
throw new GradleException('Source mcmod.info does not use the stable poweradvantage mod id')
}
}
}
+def publicationTargetAllowed = { String projectId ->
+ (projectId ==~ /[1-9][0-9]*/) && projectId != '240982'
+}
+
+tasks.register('verifyPublicationTarget') {
+ group = 'verification'
+ description = 'Refuses publication until the new basePower CurseForge project is assigned.'
+ doLast {
+ if (!publicationTargetAllowed(project.curseforge_project_id.toString())) {
+ throw new GradleException('Assign the new basePower CurseForge project ID before publishing; never reuse Power Advantage 240982.')
+ }
+ }
+}
+
tasks.register('verifyReleaseDependencies') {
group = 'verification'
description = 'Resolves and audits Forge plus the exact optional compile APIs.'
@@ -493,14 +507,14 @@ tasks.register('verifyReleaseArtifacts') {
new ZipFile(mainJar).withCloseable { zip ->
List
For example, you can add Power Advantage compatibility to an existing mod like this:
- if(Loader.isModLoaded("poweradvantage")){
+ if(Loader.isModLoaded("basepower")){
LightWeightPowerRegistry.registerLightWeightPowerAcceptor(Blocks.myMachine,
new ILightWeightPowerAcceptor(){
diff --git a/src/main/java/cyano/poweradvantage/api/modsupport/package-info.java b/src/main/java/cyano/poweradvantage/api/modsupport/package-info.java
index b86dd02..16d362d 100644
--- a/src/main/java/cyano/poweradvantage/api/modsupport/package-info.java
+++ b/src/main/java/cyano/poweradvantage/api/modsupport/package-info.java
@@ -1,7 +1,7 @@
/**
This package contains the light-weight API for people interested in adding Power Advantage support
to existing mods (instead of making a Power Advantage add-on mod). Typically, you achieve this be
-first checking whether Power Advantage exists with if(Loader.isModLoaded("poweradvantage")){ ... }.
+first checking whether basePower exists with if(Loader.isModLoaded("basepower")){ ... }.
Then if you detect that Power Advantage is installed, you can add an ad-hoc power handler for each
of your machines like this:
LightWeightPowerRegistry.registerLightWeightPowerAcceptor(Blocks.myMachine,
@@ -28,4 +28,4 @@ public float addEnergy(TileEntity yourMachine,
The above example is for registerring a machine that should accept steam and electricity power from
Power Advantage add-on mods.
*/
-package cyano.poweradvantage.api.modsupport;
\ No newline at end of file
+package cyano.poweradvantage.api.modsupport;
diff --git a/src/main/java/cyano/poweradvantage/api/modsupport/rf/TileEntityRFConverter.java b/src/main/java/cyano/poweradvantage/api/modsupport/rf/TileEntityRFConverter.java
index 9cd3980..a7a62c2 100644
--- a/src/main/java/cyano/poweradvantage/api/modsupport/rf/TileEntityRFConverter.java
+++ b/src/main/java/cyano/poweradvantage/api/modsupport/rf/TileEntityRFConverter.java
@@ -1,6 +1,6 @@
package cyano.poweradvantage.api.modsupport.rf;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.modsupport.TileEntityConverter;
import net.minecraft.entity.player.EntityPlayer;
diff --git a/src/main/java/cyano/poweradvantage/api/modsupport/techreborn/TileEntityTRConverter.java b/src/main/java/cyano/poweradvantage/api/modsupport/techreborn/TileEntityTRConverter.java
index de840dd..a9c55b8 100644
--- a/src/main/java/cyano/poweradvantage/api/modsupport/techreborn/TileEntityTRConverter.java
+++ b/src/main/java/cyano/poweradvantage/api/modsupport/techreborn/TileEntityTRConverter.java
@@ -1,6 +1,6 @@
package cyano.poweradvantage.api.modsupport.techreborn;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.modsupport.TileEntityConverter;
import net.minecraft.tileentity.TileEntity;
diff --git a/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidConduit.java b/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidConduit.java
index 73034fa..d169c22 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidConduit.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidConduit.java
@@ -3,7 +3,7 @@
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PowerConnectorContext;
import cyano.poweradvantage.api.fluid.FluidConduitBlock;
-import zone.moddev.mc.poweradvantage.util.PowerHelper;
+import zone.moddev.mc.basepower.util.PowerHelper;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
diff --git a/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidMachine.java b/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidMachine.java
index 0e376c8..3fdbc7a 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidMachine.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidMachine.java
@@ -1,6 +1,6 @@
package cyano.poweradvantage.api.simple;
-import zone.moddev.mc.poweradvantage.init.Fluids;
+import zone.moddev.mc.basepower.init.Fluids;
import net.minecraft.block.material.Material;
/**
@@ -8,7 +8,7 @@
* block with an inventory and user interface that gives fluids to connected
* fluid consumers.
* Example usage:
-int guiID = zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry.addGUI(new MySimpleMachineGUI());
+int guiID = zone.moddev.mc.basepower.registry.MachineGUIRegistry.addGUI(new MySimpleMachineGUI());
Block myMachineBlock = new MyBlockSimpleFluidSource(guiID,PowerAdvantage.getInstance());
myMachineBlock.setUnlocalizedName(MODID+"."+"my_machine");
GameRegistry.registerBlock(myMachineBlock,"my_machine");
diff --git a/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerConduit.java b/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerConduit.java
index ddd7780..17f18bb 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerConduit.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerConduit.java
@@ -3,7 +3,7 @@
import cyano.poweradvantage.api.ConduitBlock;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PowerConnectorContext;
-import zone.moddev.mc.poweradvantage.util.PowerHelper;
+import zone.moddev.mc.basepower.util.PowerHelper;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
diff --git a/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerMachine.java b/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerMachine.java
index 2d90210..65fc812 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerMachine.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerMachine.java
@@ -1,7 +1,7 @@
package cyano.poweradvantage.api.simple;
import cyano.poweradvantage.api.*;
-import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry;
+import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
@@ -28,7 +28,7 @@
* block with an inventory and user interface that gives power to connected
* machines.
* Example usage:
-int guiID = zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry.addGUI(new MySimpleMachineGUI());
+int guiID = zone.moddev.mc.basepower.registry.MachineGUIRegistry.addGUI(new MySimpleMachineGUI());
Block myMachineBlock = new MyBlockSimplePowerSource(guiID,PowerAdvantage.getInstance());
myMachineBlock.setUnlocalizedName(MODID+"."+"my_machine");
GameRegistry.registerBlock(myMachineBlock,"my_machine");
diff --git a/src/main/java/cyano/poweradvantage/api/simple/SimpleMachineGUI.java b/src/main/java/cyano/poweradvantage/api/simple/SimpleMachineGUI.java
index 1540445..2c4d62c 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/SimpleMachineGUI.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/SimpleMachineGUI.java
@@ -1,10 +1,10 @@
package cyano.poweradvantage.api.simple;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import com.mcmoddev.poweradvantage.math.Integer2D;
import com.mcmoddev.poweradvantage.registry.ITileEntityGUI;
-import zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry;
+import zone.moddev.mc.basepower.registry.MachineGUIRegistry;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.player.EntityPlayer;
diff --git a/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java b/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java
index 7aee735..375ba76 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java
@@ -5,7 +5,7 @@
import cyano.poweradvantage.api.PowerRequest;
import cyano.poweradvantage.api.fluid.FluidPoweredEntity;
import cyano.poweradvantage.api.fluid.FluidRequest;
-import zone.moddev.mc.poweradvantage.init.Fluids;
+import zone.moddev.mc.basepower.init.Fluids;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
@@ -23,6 +23,7 @@
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
+import net.minecraftforge.fluids.capability.wrappers.FluidHandlerWrapper;
import java.util.List;
@@ -72,7 +73,9 @@ public boolean hasCapability(Capability> capability, EnumFacing facing) {
@Override
public T getCapability(Capability capability, EnumFacing facing) {
- return (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)? (T)tank : super.getCapability(capability,facing);
+ // Delegate through the machine so overrides retain input/output routing and restrictions.
+ return (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
+ ? (T)new FluidHandlerWrapper(this, facing) : super.getCapability(capability,facing);
}
/**
@@ -744,4 +747,4 @@ public FluidTank getTank(){
return tank;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimplePowerMachine.java b/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimplePowerMachine.java
index e8d9151..5eeeaa4 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimplePowerMachine.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimplePowerMachine.java
@@ -4,7 +4,7 @@
import cyano.poweradvantage.api.PowerConnectorContext;
import cyano.poweradvantage.api.PowerRequest;
import cyano.poweradvantage.api.PoweredEntity;
-import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry;
+import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/PowerAdvantage.java b/src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java
similarity index 87%
rename from src/main/java/zone/moddev/mc/poweradvantage/PowerAdvantage.java
rename to src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java
index cfb8e4c..ff0c593 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/PowerAdvantage.java
+++ b/src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java
@@ -1,10 +1,10 @@
-package zone.moddev.mc.poweradvantage;
+package zone.moddev.mc.basepower;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.FluidCategoryRegistry;
-import zone.moddev.mc.poweradvantage.registry.FuelRegistry;
-import zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry;
-import zone.moddev.mc.poweradvantage.registry.still.recipe.DistillationRecipeRegistry;
+import zone.moddev.mc.basepower.registry.FuelRegistry;
+import zone.moddev.mc.basepower.registry.MachineGUIRegistry;
+import zone.moddev.mc.basepower.registry.still.recipe.DistillationRecipeRegistry;
import net.minecraft.block.Block;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
@@ -18,6 +18,12 @@
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
+import net.minecraftforge.fml.common.event.FMLMissingMappingsEvent;
+import net.minecraftforge.fml.common.event.FMLServerAboutToStartEvent;
+import net.minecraftforge.fml.common.Loader;
+import zone.moddev.mc.basepower.compat.LegacyIdentity;
+import zone.moddev.mc.basepower.compat.LegacyLevelData;
+import zone.moddev.mc.basepower.compat.LegacyWorldgenIdentity;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.registry.GameData;
import net.minecraftforge.fml.common.registry.GameRegistry;
@@ -33,7 +39,7 @@
import java.util.*;
// NOTE: other mods dependant on this one need to add the following to their @Mod annotation:
-// dependencies = "required-after:poweradvantage"
+// dependencies = "required-after:basepower"
/* IDEA list
* drain block ✓
@@ -178,7 +184,7 @@
* compile classpath. Do not embed PowerAdvantage in the dependent mod.
*
* Next, you need to specify the dependencies in the @mod annotation. For example:
- * @Mod(modid = MyMod.MODID, version = MyMod.VERSION, name=MyMod.NAME, dependencies = "required-after:poweradvantage")
+ * @Mod(modid = MyMod.MODID, version = MyMod.VERSION, name=MyMod.NAME, dependencies = "required-after:basepower")
*
* Gradle or Eclipse should then derive its compile classpath from that declared dependency. The
* Minecraft 1.10.2 build targets Java 8.
@@ -186,7 +192,7 @@
* @author DrCyano
*
*/
-@Mod(modid = PowerAdvantage.MODID, version = PowerAdvantage.VERSION, name=PowerAdvantage.NAME, dependencies = "required-after:orespawn@[4.0.6,5.0.0);after:basemetals",
+@Mod(modid = PowerAdvantage.MODID, version = PowerAdvantage.VERSION, name=PowerAdvantage.NAME, dependencies = "required-before:orespawn@[4.0.6,5.0.0)",
acceptedMinecraftVersions = "[1.10.2,)")
public class PowerAdvantage
{
@@ -196,11 +202,11 @@ public class PowerAdvantage
}
/** The identifier for this mod */
- public static final String MODID = "poweradvantage";
+ public static final String MODID = "basepower";
/** The display name for this mod */
- public static final String NAME = "Power Advantage";
+ public static final String NAME = "basePower";
/** The version of this mod, in the format major.minor.patch.target */
- public static final String VERSION = "2.4.3.110021";
+ public static final String VERSION = "2.4.4.110021";
@@ -250,9 +256,20 @@ public class PowerAdvantage
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
+ LegacyIdentity.requireReplacementsOnly(Loader::isModLoaded);
FMLLog.info("%s: loading config file", MODID);
instance = this;
- Configuration config = new Configuration(event.getSuggestedConfigurationFile());
+ try {
+ java.nio.file.Path directory = event.getSuggestedConfigurationFile().toPath().getParent();
+ LegacyWorldgenIdentity.migrateConfig(directory, "poweradvantage", MODID);
+ if (Loader.isModLoaded("baseelectric")) {
+ LegacyWorldgenIdentity.migrateConfig(directory, "electricadvantage", "baseelectric");
+ }
+ } catch (java.io.IOException error) {
+ throw new IllegalStateException("Cannot safely migrate Advantage world-generation configuration", error);
+ }
+ Configuration config = new Configuration(LegacyIdentity.migrateConfiguration(
+ event.getSuggestedConfigurationFile(), "poweradvantage"));
config.load();
String[] presets = {"NORMAL", "TECH_PROGRESSION", "APOCALYPTIC"};
String mode = config.getString("recipe_mode", "options", "NORMAL", "NORMAL, APOCALYPTIC, or TECH_PROGRESSION. \n"
@@ -361,12 +378,14 @@ public void preInit(FMLPreInitializationEvent event)
config.save();
FMLLog.info("%s: initializing fluids, blocks, items, and loot tables", MODID);
- zone.moddev.mc.poweradvantage.init.Fluids.init();
- zone.moddev.mc.poweradvantage.init.Blocks.init();
- zone.moddev.mc.poweradvantage.init.Items.init();
- zone.moddev.mc.poweradvantage.init.OreSpawnWorldGen.register(
+ zone.moddev.mc.basepower.init.Fluids.init();
+ zone.moddev.mc.basepower.init.Blocks.init();
+ zone.moddev.mc.basepower.init.Items.init();
+ zone.moddev.mc.basepower.init.OreSpawnWorldGen.register(
event.getSuggestedConfigurationFile().toPath().getParent());
- zone.moddev.mc.poweradvantage.init.TreasureChests.init(event.getSuggestedConfigurationFile().toPath().getParent());
+ LegacyIdentity.migrateAdditionalLootTables(event.getSuggestedConfigurationFile().toPath().getParent(),
+ "poweradvantage", MODID);
+ zone.moddev.mc.basepower.init.TreasureChests.init(event.getSuggestedConfigurationFile().toPath().getParent());
// keep this next comment, it is useful for finding Vanilla recipes
//OreDictionary.initVanillaEntries();
@@ -380,10 +399,35 @@ public void preInit(FMLPreInitializationEvent event)
FMLLog.info("%s: preinit complete", MODID);
}
+ @EventHandler
+ public void missingMappings(FMLMissingMappingsEvent event) {
+ LegacyIdentity.remapMissingMappings(event, "poweradvantage", MODID);
+ }
+
+ @EventHandler
+ public void serverAboutToStart(FMLServerAboutToStartEvent event) {
+ // Run before OreSpawn's matching callback reads this world's saved profile.
+ java.nio.file.Path world = event.getServer().getActiveAnvilConverter()
+ .getSaveLoader(event.getServer().getFolderName(), false).getWorldDirectory().toPath();
+ try {
+ Set replacements = new HashSet<>();
+ replacements.add(MODID);
+ if (Loader.isModLoaded("basesteam")) replacements.add("basesteam");
+ if (Loader.isModLoaded("baseelectric")) replacements.add("baseelectric");
+ LegacyLevelData.migrateWorld(world, replacements);
+ LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", MODID);
+ if (Loader.isModLoaded("baseelectric")) {
+ LegacyWorldgenIdentity.migrateWorld(world, "electricadvantage", "baseelectric");
+ }
+ } catch (java.io.IOException error) {
+ throw new IllegalStateException("Cannot safely migrate this world's Advantage generation profile", error);
+ }
+ }
+
@SideOnly(Side.CLIENT)
private void clientPreInit(FMLPreInitializationEvent event){
// client-only code
- zone.moddev.mc.poweradvantage.init.Blocks.bakeModels();
+ zone.moddev.mc.basepower.init.Blocks.bakeModels();
}
@SideOnly(Side.SERVER)
private void serverPreInit(FMLPreInitializationEvent event){
@@ -401,7 +445,7 @@ public void init(FMLInitializationEvent event)
FMLLog.info("%s: starting main inititalization", MODID);
// BaseMetals has initialized; fill missing aliases before fuel and child recipe setup.
- zone.moddev.mc.poweradvantage.compat.BaseMetalsCompat.registerOreDictionaryFallbacks();
+ zone.moddev.mc.basepower.compat.BaseMetalsCompat.registerOreDictionaryFallbacks();
try {
FMLLog.info("%s: testing whether we have to support redstone flux", MODID);
Class> rfClass = Class.forName("cofh.api.energy.IEnergyReceiver", false, getClass().getClassLoader());
@@ -427,16 +471,16 @@ public void init(FMLInitializationEvent event)
GameRegistry.registerFuelHandler(FuelRegistry.getInstance());
FMLLog.info("%s: initializing more content", MODID);
- zone.moddev.mc.poweradvantage.init.Fuels.init();
- zone.moddev.mc.poweradvantage.init.Entities.init();
- zone.moddev.mc.poweradvantage.init.Recipes.init();
- zone.moddev.mc.poweradvantage.init.Recipes.initDistillationRecipes(distillRecipes);
- zone.moddev.mc.poweradvantage.init.Recipes.initCrudeOilAliasDistillationRecipes();
- zone.moddev.mc.poweradvantage.init.Villages.init();
- zone.moddev.mc.poweradvantage.init.GUI.init();
+ zone.moddev.mc.basepower.init.Fuels.init();
+ zone.moddev.mc.basepower.init.Entities.init();
+ zone.moddev.mc.basepower.init.Recipes.init();
+ zone.moddev.mc.basepower.init.Recipes.initDistillationRecipes(distillRecipes);
+ zone.moddev.mc.basepower.init.Recipes.initCrudeOilAliasDistillationRecipes();
+ zone.moddev.mc.basepower.init.Villages.init();
+ zone.moddev.mc.basepower.init.GUI.init();
FMLLog.info("%s: mod support data registries", MODID);
- zone.moddev.mc.poweradvantage.init.ModSupport.init(detectedRF,detectedTechReborn);
+ zone.moddev.mc.basepower.init.ModSupport.init(detectedRF,detectedTechReborn);
if(event.getSide() == Side.CLIENT){
@@ -454,9 +498,9 @@ public void init(FMLInitializationEvent event)
private void clientInit(FMLInitializationEvent event){
// client-only code
FMLLog.info("%s: initializing renders", MODID);
- zone.moddev.mc.poweradvantage.init.Items.registerItemRenders(event);
- zone.moddev.mc.poweradvantage.init.Blocks.registerItemRenders(event);
- zone.moddev.mc.poweradvantage.init.ModSupport.registerItemRenders(event);
+ zone.moddev.mc.basepower.init.Items.registerItemRenders(event);
+ zone.moddev.mc.basepower.init.Blocks.registerItemRenders(event);
+ zone.moddev.mc.basepower.init.ModSupport.registerItemRenders(event);
}
@SideOnly(Side.SERVER)
private void serverInit(FMLInitializationEvent event){
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/RecipeMode.java b/src/main/java/zone/moddev/mc/basepower/RecipeMode.java
similarity index 96%
rename from src/main/java/zone/moddev/mc/poweradvantage/RecipeMode.java
rename to src/main/java/zone/moddev/mc/basepower/RecipeMode.java
index cf753ec..03c5450 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/RecipeMode.java
+++ b/src/main/java/zone/moddev/mc/basepower/RecipeMode.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage;
+package zone.moddev.mc.basepower;
/**
* Differnet recipe modes change the difficulty and means by which the players make the core items
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockFrame.java b/src/main/java/zone/moddev/mc/basepower/blocks/BlockFrame.java
similarity index 95%
rename from src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockFrame.java
rename to src/main/java/zone/moddev/mc/basepower/blocks/BlockFrame.java
index fccf622..12081e8 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockFrame.java
+++ b/src/main/java/zone/moddev/mc/basepower/blocks/BlockFrame.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.blocks;
+package zone.moddev.mc.basepower.blocks;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockPowerSwitch.java b/src/main/java/zone/moddev/mc/basepower/blocks/BlockPowerSwitch.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockPowerSwitch.java
rename to src/main/java/zone/moddev/mc/basepower/blocks/BlockPowerSwitch.java
index 447430f..17f940f 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockPowerSwitch.java
+++ b/src/main/java/zone/moddev/mc/basepower/blocks/BlockPowerSwitch.java
@@ -1,9 +1,9 @@
-package zone.moddev.mc.poweradvantage.blocks;
+package zone.moddev.mc.basepower.blocks;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.ITypedConduit;
import cyano.poweradvantage.api.PowerConnectorContext;
-import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry;
+import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry;
import net.minecraft.block.Block;
import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/gui/package-info.java b/src/main/java/zone/moddev/mc/basepower/blocks/package-info.java
similarity index 77%
rename from src/main/java/zone/moddev/mc/poweradvantage/gui/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/blocks/package-info.java
index a8bcce1..0b4337c 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/gui/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/blocks/package-info.java
@@ -3,10 +3,10 @@
This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API.
If you are writing an add-on mod, use the code in this package for reference, but you should not
depend on it's implementation details as future updates might change them. For a better way to get
-PowerAdvantage content, look in the zone.moddev.mc.poweradvantage.init package.
+PowerAdvantage content, look in the zone.moddev.mc.basepower.init package.
Because these classes are not part of the API, they are not well documented. They were only meant
for the eyes of the mod author(s).
*/
-package zone.moddev.mc.poweradvantage.gui;
\ No newline at end of file
+package zone.moddev.mc.basepower.blocks;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/compat/BaseMetalsCompat.java b/src/main/java/zone/moddev/mc/basepower/compat/BaseMetalsCompat.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/compat/BaseMetalsCompat.java
rename to src/main/java/zone/moddev/mc/basepower/compat/BaseMetalsCompat.java
index 67cee6f..ef6629c 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/compat/BaseMetalsCompat.java
+++ b/src/main/java/zone/moddev/mc/basepower/compat/BaseMetalsCompat.java
@@ -1,7 +1,7 @@
-package zone.moddev.mc.poweradvantage.compat;
+package zone.moddev.mc.basepower.compat;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
-import zone.moddev.mc.poweradvantage.registry.FuelRegistry;
+import zone.moddev.mc.basepower.PowerAdvantage;
+import zone.moddev.mc.basepower.registry.FuelRegistry;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
diff --git a/src/main/java/zone/moddev/mc/basepower/compat/LegacyIdentity.java b/src/main/java/zone/moddev/mc/basepower/compat/LegacyIdentity.java
new file mode 100644
index 0000000..c63fa13
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/compat/LegacyIdentity.java
@@ -0,0 +1,156 @@
+package zone.moddev.mc.basepower.compat;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonPrimitive;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fml.common.FMLLog;
+import net.minecraftforge.fml.common.event.FMLMissingMappingsEvent;
+import net.minecraftforge.fml.common.registry.GameRegistry;
+
+/** Read compatibility for released Cyano 1.10 worlds; new saves use base identities. */
+public final class LegacyIdentity {
+ private LegacyIdentity() { }
+
+ public static void requireReplacementsOnly(java.util.function.Predicate loaded) {
+ for (String old : new String[] { "poweradvantage", "steamadvantage", "electricadvantage" }) {
+ if (loaded.test(old)) {
+ throw new IllegalStateException("Remove the old " + old
+ + " jar before loading basePower, baseSteam and baseElectric. These are replacements, not add-ons.");
+ }
+ }
+ }
+
+ public static void remapMissingMappings(FMLMissingMappingsEvent event, String oldModId, String newModId) {
+ int count = 0;
+ for (FMLMissingMappingsEvent.MissingMapping mapping : event.getAll()) {
+ if (!oldModId.equals(mapping.resourceLocation.getResourceDomain())) continue;
+ ResourceLocation target = new ResourceLocation(newModId, mapping.resourceLocation.getResourcePath());
+ if (mapping.type == GameRegistry.Type.BLOCK && Block.REGISTRY.containsKey(target)) {
+ mapping.remap(Block.REGISTRY.getObject(target));
+ count++;
+ } else if (mapping.type == GameRegistry.Type.ITEM && Item.REGISTRY.containsKey(target)) {
+ mapping.remap(Item.REGISTRY.getObject(target));
+ count++;
+ } else {
+ // Never silently replace an unsupported legacy component with air.
+ mapping.fail();
+ FMLLog.severe("%s: no migration target for %s %s", newModId, mapping.type, mapping.name);
+ }
+ }
+ if (count > 0) FMLLog.info("%s: remapped %d released %s registry entries", newModId, count, oldModId);
+ }
+
+ public static void registerTileEntity(Class extends TileEntity> type, String canonical, String... alternatives) {
+ if (alternatives.length == 0 && canonical.startsWith("basepower.")) {
+ alternatives = new String[] { "poweradvantage" + canonical.substring("basepower".length()) };
+ }
+ GameRegistry.registerTileEntityWithAlternatives(type, canonical, alternatives);
+ }
+
+ public static File migrateConfiguration(File newConfig, String oldModId) {
+ requireModId(oldModId);
+ Path target = newConfig.toPath().toAbsolutePath().normalize();
+ Path legacy = target.resolveSibling(oldModId + ".cfg");
+ try {
+ if (!Files.exists(target) && Files.isRegularFile(legacy)) {
+ Files.copy(legacy, target);
+ FMLLog.info("Imported %s as %s; the original configuration is unchanged", legacy, target);
+ }
+ return newConfig;
+ } catch (IOException error) {
+ throw new IllegalStateException("Cannot preserve legacy configuration " + legacy, error);
+ }
+ }
+
+ public static void migrateAdditionalLootTables(Path config, String oldModId, String newModId) {
+ requireModId(oldModId);
+ requireModId(newModId);
+ Path root = config.toAbsolutePath().normalize().resolve("additional-loot-tables");
+ Path legacy = root.resolve(oldModId);
+ Path target = root.resolve(newModId);
+ if (!Files.isDirectory(legacy)) return;
+ try (Stream walk = Files.walk(legacy)) {
+ List sources = walk.filter(Files::isRegularFile)
+ .filter(path -> path.toString().endsWith(".json")).collect(Collectors.toList());
+ for (Path source : sources) {
+ if (Files.isSymbolicLink(source)) throw new IOException("Refusing linked loot file " + source);
+ Path destination = target.resolve(legacy.relativize(source)).normalize();
+ if (!destination.startsWith(target)) throw new IOException("Loot migration escaped its directory");
+ if (!Files.exists(destination)) {
+ JsonElement document = new JsonParser().parse(new String(Files.readAllBytes(source), StandardCharsets.UTF_8));
+ remapJsonValues(document, oldModId, newModId);
+ Files.createDirectories(destination.getParent());
+ Files.write(destination, new GsonBuilder().setPrettyPrinting().create().toJson(document)
+ .getBytes(StandardCharsets.UTF_8));
+ }
+ // ALT reads every *.json. Preserve old bytes outside that suffix to avoid double loot.
+ Path backup = source.resolveSibling(source.getFileName() + ".before-" + newModId);
+ if (Files.exists(backup)) throw new IOException("Existing loot backup requires review: " + backup);
+ Files.move(source, backup);
+ }
+ } catch (IOException | RuntimeException error) {
+ throw new IllegalStateException("Cannot safely migrate legacy loot tables from " + legacy, error);
+ }
+ }
+
+ public static void remapJsonValues(JsonElement value, String oldModId, String newModId) {
+ if (value.isJsonObject()) {
+ JsonObject object = value.getAsJsonObject();
+ List> entries = new ArrayList<>(object.entrySet());
+ for (Map.Entry entry : entries) {
+ JsonElement child = entry.getValue();
+ if (child.isJsonPrimitive() && child.getAsJsonPrimitive().isString()) {
+ object.add(entry.getKey(), new JsonPrimitive(remapIdentifier(child.getAsString(), oldModId, newModId)));
+ } else remapJsonValues(child, oldModId, newModId);
+ }
+ } else if (value.isJsonArray()) {
+ JsonArray array = value.getAsJsonArray();
+ List children = new ArrayList<>();
+ Iterator iterator = array.iterator();
+ while (iterator.hasNext()) {
+ children.add(iterator.next());
+ iterator.remove();
+ }
+ for (JsonElement child : children) {
+ if (child.isJsonPrimitive() && child.getAsJsonPrimitive().isString()) {
+ array.add(new JsonPrimitive(remapIdentifier(child.getAsString(), oldModId, newModId)));
+ } else {
+ remapJsonValues(child, oldModId, newModId);
+ array.add(child);
+ }
+ }
+ }
+ }
+
+ public static String remapIdentifier(String value, String oldModId, String newModId) {
+ if ("steamadvantage".equals(oldModId)
+ && java.util.Arrays.asList("steamadvantage:rapid_reload", "steamadvantage:powderless",
+ "steamadvantage:high_explosive", "steamadvantage:recoil").contains(value)) {
+ // Forge 1.10 has no enchantment missing-mapping event; those saved keys remain stable.
+ return value;
+ }
+ return value.startsWith(oldModId + ":") ? newModId + value.substring(oldModId.length()) : value;
+ }
+
+ private static void requireModId(String id) {
+ if (!id.matches("[a-z][a-z0-9_]*")) throw new IllegalArgumentException("Invalid migration namespace: " + id);
+ }
+}
diff --git a/src/main/java/zone/moddev/mc/basepower/compat/LegacyLevelData.java b/src/main/java/zone/moddev/mc/basepower/compat/LegacyLevelData.java
new file mode 100644
index 0000000..82bffcc
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/compat/LegacyLevelData.java
@@ -0,0 +1,120 @@
+package zone.moddev.mc.basepower.compat;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.LinkOption;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import net.minecraft.nbt.CompressedStreamTools;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraftforge.fml.common.FMLLog;
+
+/** Converts only Forge's saved oil owners, before Forge reads the world header. */
+public final class LegacyLevelData {
+ private LegacyLevelData() { }
+
+ public static boolean remapFluidDefaults(NBTTagCompound root) {
+ if (!root.hasKey("Forge", 10)) return false;
+ NBTTagCompound forge = root.getCompoundTag("Forge");
+ if (!forge.hasKey("DefaultFluidList", 9)) return false;
+ NBTTagList original = forge.getTagList("DefaultFluidList", 8);
+ NBTTagList replacement = new NBTTagList();
+ boolean changed = false;
+ for (int index = 0; index < original.tagCount(); index++) {
+ String before = original.getStringTagAt(index);
+ String after = before;
+ if ("poweradvantage:crude_oil".equals(before)) after = "basepower:crude_oil";
+ if ("poweradvantage:refined_oil".equals(before)) after = "basepower:refined_oil";
+ replacement.appendTag(new NBTTagString(after));
+ changed |= !before.equals(after);
+ }
+ if (changed) forge.setTag("DefaultFluidList", replacement);
+ return changed;
+ }
+
+ public static void migrateWorld(Path worldRoot) throws IOException {
+ migrateWorld(worldRoot, new HashSet<>(Arrays.asList("basepower", "basesteam", "baseelectric")));
+ }
+
+ public static boolean remapModList(NBTTagCompound root, Set loadedReplacements) {
+ if (!root.hasKey("FML", 10)) return false;
+ NBTTagList mods = root.getCompoundTag("FML").getTagList("ModList", 10);
+ Set present = new HashSet<>();
+ for (int index = 0; index < mods.tagCount(); index++) present.add(mods.getCompoundTagAt(index).getString("ModId"));
+ String[][] pairs = { { "poweradvantage", "basepower" }, { "steamadvantage", "basesteam" },
+ { "electricadvantage", "baseelectric" } };
+ for (String[] pair : pairs) {
+ if (loadedReplacements.contains(pair[1]) && present.contains(pair[0]) && present.contains(pair[1])) {
+ throw new IllegalStateException("World header contains both " + pair[0] + " and " + pair[1]);
+ }
+ }
+ boolean changed = false;
+ for (int index = 0; index < mods.tagCount(); index++) {
+ NBTTagCompound mod = mods.getCompoundTagAt(index);
+ for (String[] pair : pairs) {
+ if (loadedReplacements.contains(pair[1]) && pair[0].equals(mod.getString("ModId"))) {
+ mod.setString("ModId", pair[1]);
+ changed = true;
+ }
+ }
+ }
+ return changed;
+ }
+
+ public static void migrateWorld(Path worldRoot, Set loadedReplacements) throws IOException {
+ Path root = worldRoot.toAbsolutePath().normalize();
+ for (String name : new String[] { "level.dat", "level.dat_old" }) {
+ Path file = root.resolve(name);
+ if (!Files.exists(file, LinkOption.NOFOLLOW_LINKS)) continue;
+ if (!Files.isRegularFile(file, LinkOption.NOFOLLOW_LINKS) || Files.isSymbolicLink(file)
+ || Files.size(file) > 64 * 1024 * 1024) {
+ throw new IOException("Refusing an invalid world header: " + file);
+ }
+ byte[] original = Files.readAllBytes(file);
+ NBTTagCompound document;
+ try (InputStream input = new java.io.ByteArrayInputStream(original)) {
+ document = CompressedStreamTools.readCompressed(input);
+ }
+ boolean changed = remapFluidDefaults(document);
+ changed |= remapModList(document, loadedReplacements);
+ if (!changed) continue;
+ Path backups = root.resolve("basepower-migration-backups");
+ Files.createDirectories(backups);
+ Path backup = backups.resolve(name + "." + sha256(original) + ".before-base-identity-migration");
+ if (!Files.exists(backup)) Files.copy(file, backup);
+ if (!Arrays.equals(original, Files.readAllBytes(backup))) {
+ throw new IOException("World-header backup does not match: " + backup);
+ }
+ if (!Arrays.equals(original, Files.readAllBytes(file))) {
+ throw new IOException("World header changed during migration: " + file);
+ }
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ CompressedStreamTools.writeCompressed(document, output);
+ Path temporary = Files.createTempFile(root, ".basepower-level-", ".tmp");
+ try {
+ Files.write(temporary, output.toByteArray());
+ Files.move(temporary, file, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING);
+ } finally { Files.deleteIfExists(temporary); }
+ FMLLog.info("basepower: migrated saved Advantage identities in %s; original header retained at %s", file, backup);
+ }
+ }
+
+ private static String sha256(byte[] bytes) {
+ try {
+ StringBuilder result = new StringBuilder();
+ for (byte value : MessageDigest.getInstance("SHA-256").digest(bytes)) {
+ result.append(String.format(java.util.Locale.ROOT, "%02x", value & 255));
+ }
+ return result.toString();
+ } catch (NoSuchAlgorithmException impossible) { throw new AssertionError(impossible); }
+ }
+}
diff --git a/src/main/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentity.java b/src/main/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentity.java
new file mode 100644
index 0000000..9be1790
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentity.java
@@ -0,0 +1,620 @@
+package zone.moddev.mc.basepower.compat;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonNull;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonToken;
+import java.io.IOException;
+import java.io.StringReader;
+import java.math.BigDecimal;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.LinkOption;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.StandardOpenOption;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Bounded identity migration for released Power/Electric 1.10 configurations.
+ *
+ * Call {@link #migrateConfig} during the owning mod's preInit, before
+ * OreSpawn 4.0.8's init imports OS1/OS3 files and discovers providers. Provider
+ * IDs MUST become the loaded mod ID: the pinned engine rejects unloaded owners
+ * and rules outside their owner's namespace. An old OS1 filename must not
+ * remain discoverable, or the bridge imports it as a standalone OreSpawn rule.
+ *
+ *
Call {@link #migrateWorld} only before OreSpawn reads the selected world's
+ * profile. With required-after:orespawn, an ordinary serverAboutToStart callback
+ * is too late. Native required-before:orespawn ordering on Power permits Power
+ * to migrate both loaded identities before OreSpawn's callback, without ASM.
+ * This helper neither reloads OreSpawn nor discovers/scans worlds. Exceptions
+ * must abort startup, never fall through to fresh defaults. Validation precedes
+ * all changes; filesystem failures can leave a partial, backed-up batch that is
+ * safe to retry, but must not be used to continue the same startup.
+ */
+public final class LegacyWorldgenIdentity {
+ private static final Gson GSON = new GsonBuilder().setPrettyPrinting()
+ .disableHtmlEscaping().serializeNulls().create();
+ private static final LinkOption[] NO_LINKS = { LinkOption.NOFOLLOW_LINKS };
+ // OreSpawn 4.1 uses distinct global/world schemas; provider files keep their own version.
+ private static final int MAX_GLOBAL_PROFILE_SCHEMA = 8;
+ private static final int MAX_WORLD_PROFILE_SCHEMA = 7;
+ private static final List RULE_MAPS = Arrays.asList("ores", "fluid_deposits", "rocks",
+ "geomes", "templates", "biome_palettes", "dimension_materials");
+ private static final List BLOCK_FIELDS = Arrays.asList("block", "blockID", "top_block",
+ "filler_block", "underwater_block", "ceiling_block", "snow_block", "ice_block");
+ private static final List BLOCK_LISTS = Arrays.asList("blocks", "host_blocks", "outputs");
+ private static final List OWNER_FIELDS = Arrays.asList("provider_modid", "source_mod",
+ "source_provider", "sulfur_source", "lithium_source", "crude_oil_source",
+ "sulfur_provider", "lithium_provider", "crude_oil_provider");
+
+ private LegacyWorldgenIdentity() { }
+
+ /** Fixed config filenames only. The return value counts writes and retirements. */
+ public static synchronized int migrateConfig(Path configDirectory, String oldModId,
+ String newModId) throws IOException {
+ Pair pair = new Pair(oldModId, newModId);
+ Batch batch = new Batch(configDirectory, pair);
+ Document oldProvider = batch.read(oldModId + "-orespawn.json", "provider");
+ Document newProvider = batch.read(newModId + "-orespawn.json", "provider");
+ Document profile = batch.read("orespawn-worldgen.json", "global-profile");
+ List legacy = new ArrayList<>();
+ for (String directory : Arrays.asList("orespawn", "orespawn3")) {
+ String kind = "orespawn".equals(directory) ? "os1" : "os3";
+ Document old = batch.read(directory + "/" + oldModId + ".json", kind);
+ Document modern = batch.read(directory + "/" + newModId + ".json", kind);
+ if (old != null) legacy.add(old);
+ if (modern != null) legacy.add(modern);
+ if (old != null && modern != null && !old.migrated.equals(modern.migrated)) {
+ throw problem(old.path, "different old/new legacy authorities; resolve explicitly");
+ }
+ }
+ if (oldProvider != null && newProvider != null
+ && !oldProvider.migrated.equals(newProvider.migrated)) {
+ throw problem(oldProvider.path, "different old/new provider authorities; resolve explicitly");
+ }
+ // Already-imported standalone rules cannot be claimed by another provider.
+ Document standalone = batch.read("orespawn-orespawn.json", "standalone");
+ if (standalone != null && containsStandalone(standalone.original, pair)) {
+ throw problem(standalone.path, "owned standalone legacy rules require explicit reconciliation");
+ }
+ Document provider = newProvider != null ? newProvider : oldProvider;
+ if (provider != null) {
+ batch.write(newModId + "-orespawn.json", provider.migrated);
+ if (oldProvider != null) batch.retire(oldProvider);
+ // The pinned bridge overwrites explicit provider files, so none of
+ // these owned legacy inputs may remain in its *.json discovery.
+ for (Document source : legacy) batch.retire(source);
+ if (profile != null) checkProviderOverlap(profile.migrated, provider.migrated, pair);
+ } else if (!legacy.isEmpty()) {
+ if (batch.exists(".orespawn-legacy-bridge-migrated")) {
+ throw problem(batch.root, "bridge marker exists but owned provider is absent; legacy import would be skipped");
+ }
+ String kind = legacy.get(0).kind;
+ for (Document source : legacy) {
+ if (!kind.equals(source.kind)) {
+ throw problem(source.path, "both OS1 and OS3 authorities exist without an explicit provider");
+ }
+ }
+ if (profile != null && hasOwnedRules(profile.migrated, pair)) {
+ throw problem(profile.path, "saved owned rules plus pending legacy import require explicit reconciliation");
+ }
+ String directory = "os1".equals(kind) ? "orespawn" : "orespawn3";
+ batch.write(directory + "/" + newModId + ".json", legacy.get(0).migrated);
+ for (Document source : legacy) {
+ if (source.path.getFileName().toString().equals(oldModId + ".json")) batch.retire(source);
+ }
+ }
+ if (profile != null) batch.write("orespawn-worldgen.json", profile.migrated);
+ return batch.commit();
+ }
+
+ /** Only serverconfig/orespawn-worldgen.json in the explicitly supplied root. */
+ public static synchronized int migrateWorld(Path worldRoot, String oldModId,
+ String newModId) throws IOException {
+ Pair pair = new Pair(oldModId, newModId);
+ Batch batch = new Batch(worldRoot, pair);
+ Document profile = batch.read("serverconfig/orespawn-worldgen.json", "world-profile");
+ if (profile != null) batch.write("serverconfig/orespawn-worldgen.json", profile.migrated);
+ return batch.commit();
+ }
+
+ /** Exact selector values only; useful to the owning Forge configuration code. */
+ public static String migrateSelectorValue(String value, String oldModId, String newModId) {
+ Pair pair = new Pair(oldModId, newModId);
+ return pair.oldId.equals(value) ? pair.newId : value;
+ }
+
+ private static final class Pair {
+ final String oldId;
+ final String newId;
+ Pair(String oldId, String newId) {
+ if (!("poweradvantage".equals(oldId) && "basepower".equals(newId))
+ && !("electricadvantage".equals(oldId) && "baseelectric".equals(newId))) {
+ throw new IllegalArgumentException("Unsupported worldgen identity pair");
+ }
+ this.oldId = oldId;
+ this.newId = newId;
+ }
+ String id(String text) throws IOException {
+ if (!text.startsWith(oldId + ":")) return text;
+ if (!text.substring(oldId.length() + 1).matches("[a-z0-9_./-]+")) {
+ throw new IOException("Invalid owned identifier: " + text);
+ }
+ return newId + text.substring(oldId.length());
+ }
+ String rule(String text) throws IOException {
+ String result = id(text);
+ // OS1 generates names from output namespace + path + ordinal.
+ String prefix = newId + ":legacy/" + oldId + "_";
+ return result.startsWith(prefix) ? newId + ":legacy/" + newId + "_"
+ + result.substring(prefix.length()) : result;
+ }
+ }
+
+ private static JsonElement rewrite(JsonElement input, Pair pair, String context) throws IOException {
+ if (input.isJsonArray()) {
+ JsonArray output = new JsonArray();
+ for (JsonElement item : input.getAsJsonArray()) {
+ if (isString(item) && (BLOCK_LISTS.contains(context) || context.startsWith("known_"))) {
+ output.add(new JsonPrimitive(context.startsWith("known_")
+ ? pair.rule(item.getAsString()) : pair.id(item.getAsString())));
+ } else output.add(rewrite(item, pair, context));
+ }
+ return output;
+ }
+ if (!input.isJsonObject()) return input;
+ JsonObject output = new JsonObject();
+ for (Map.Entry entry : input.getAsJsonObject().entrySet()) {
+ String key = entry.getKey();
+ JsonElement value = entry.getValue();
+ String target = RULE_MAPS.contains(context) ? pair.rule(key)
+ : (("providers".equals(context) || "ore_providers".equals(context))
+ && pair.oldId.equals(key) ? pair.newId : key);
+ JsonElement mapped;
+ if (BLOCK_FIELDS.contains(key) || ("name".equals(key) && "blocks".equals(context))) {
+ if (!isString(value)) throw new IOException("Block reference must be a string: " + key);
+ mapped = new JsonPrimitive(pair.id(value.getAsString()));
+ } else if (OWNER_FIELDS.contains(key) || ("resource_sources".equals(context)
+ && Arrays.asList("sulfur", "lithium", "crude_oil").contains(key))) {
+ if (!isString(value)) throw new IOException("Owner selector must be a string: " + key);
+ mapped = new JsonPrimitive(pair.oldId.equals(value.getAsString()) ? pair.newId : value.getAsString());
+ } else if (Arrays.asList("notes", "description", "comment", "metadata", "host_tags", "tags").contains(key)) {
+ mapped = value;
+ } else mapped = rewrite(value, pair, key);
+ if (output.has(target) && !output.get(target).equals(mapped)) {
+ throw new IOException("Conflicting identity entries: " + key + " -> " + target);
+ }
+ output.add(target, mapped);
+ }
+ return output;
+ }
+
+ private static boolean isString(JsonElement value) {
+ return value != null && value.isJsonPrimitive() && value.getAsJsonPrimitive().isString();
+ }
+
+ private static void validate(JsonObject root, String kind, Pair pair) throws IOException {
+ if ("os1".equals(kind)) {
+ if (!root.has("dimensions") || !root.get("dimensions").isJsonArray()) {
+ throw new IOException("OS1 dimensions must be an array");
+ }
+ for (JsonElement element : root.getAsJsonArray("dimensions")) {
+ if (!element.isJsonObject()) throw new IOException("Invalid OS1 dimension");
+ JsonObject dimension = element.getAsJsonObject();
+ JsonElement id = dimension.get("dimension");
+ if (id == null || !(isString(id) && "+".equals(id.getAsString()))) {
+ integer(id, "dimension");
+ }
+ if (!dimension.has("ores") || !dimension.get("ores").isJsonArray()) {
+ throw new IOException("OS1 ores must be an array");
+ }
+ for (JsonElement ore : dimension.getAsJsonArray("ores")) {
+ if (!ore.isJsonObject() || !isString(ore.getAsJsonObject().get("blockID"))) {
+ throw new IOException("OS1 ore must have a blockID string");
+ }
+ JsonObject declaration = ore.getAsJsonObject();
+ for (String field : Arrays.asList("size", "variation", "minHeight", "maxHeight", "blockMeta")) {
+ if (!declaration.has(field)) continue;
+ int number = integer(declaration.get(field), field);
+ int minimum = "size".equals(field) || "maxHeight".equals(field) ? 1 : 0;
+ int maximum = "blockMeta".equals(field) ? 15 : "minHeight".equals(field) ? 255
+ : "maxHeight".equals(field) ? 256 : Integer.MAX_VALUE;
+ if (number < minimum || number > maximum) throw new IOException("Invalid OS1 " + field);
+ }
+ if (declaration.has("minHeight") && declaration.has("maxHeight")
+ && integer(declaration.get("minHeight"), "minHeight")
+ >= integer(declaration.get("maxHeight"), "maxHeight")) {
+ throw new IOException("Invalid OS1 exclusive height interval");
+ }
+ if (declaration.has("frequency")) {
+ JsonElement frequency = declaration.get("frequency");
+ if (!frequency.isJsonPrimitive() || !frequency.getAsJsonPrimitive().isNumber()
+ || !Double.isFinite(frequency.getAsDouble()) || frequency.getAsDouble() < 0) {
+ throw new IOException("Invalid OS1 frequency");
+ }
+ }
+ if (declaration.has("biomes") && !declaration.get("biomes").isJsonArray()) {
+ throw new IOException("Invalid OS1 biome list");
+ }
+ // The pin unconditionally enables OS1 declarations. Do not
+ // pretend an unsupported user disable will survive import.
+ if (declaration.has("enabled") && (!declaration.get("enabled").isJsonPrimitive()
+ || !declaration.get("enabled").getAsJsonPrimitive().isBoolean()
+ || !declaration.get("enabled").getAsBoolean())) {
+ throw new IOException("OS1 enabled override requires an explicit provider");
+ }
+ }
+ }
+ } else if ("os3".equals(kind)) {
+ if (!root.has("spawns") || !root.get("spawns").isJsonObject()) {
+ throw new IOException("OS3 spawns must be an object");
+ }
+ for (Map.Entry spawn : root.getAsJsonObject("spawns").entrySet()) {
+ if (!spawn.getValue().isJsonObject()) throw new IOException("Invalid OS3 spawn");
+ JsonElement blocks = spawn.getValue().getAsJsonObject().get("blocks");
+ if (blocks == null || !blocks.isJsonArray() || blocks.getAsJsonArray().size() == 0) {
+ throw new IOException("OS3 spawn requires output blocks");
+ }
+ for (JsonElement output : blocks.getAsJsonArray()) {
+ if (!output.isJsonObject() || !isString(output.getAsJsonObject().get("name"))) {
+ throw new IOException("Invalid OS3 output block");
+ }
+ }
+ }
+ } else if ("provider".equals(kind)) {
+ int schema = integer(root.get("schema_version"), "schema_version");
+ if (schema < 1 || schema > 4 || integer(root.get("provider_revision"), "provider_revision") < 1
+ || !isString(root.get("provider_modid"))
+ || !pair.newId.equals(root.get("provider_modid").getAsString())) {
+ throw new IOException("Invalid provider header");
+ }
+ int entries = 0;
+ for (String section : RULE_MAPS) {
+ if (!root.has(section)) continue;
+ if (!root.get(section).isJsonObject()) throw new IOException("Invalid provider section: " + section);
+ if ((schema == 1 && !"ores".equals(section))
+ || (schema < 3 && "fluid_deposits".equals(section))
+ || (schema < 4 && ("biome_palettes".equals(section) || "dimension_materials".equals(section)))) {
+ throw new IOException("Section not supported by provider schema: " + section);
+ }
+ for (Map.Entry rule : root.getAsJsonObject(section).entrySet()) {
+ if (!rule.getKey().startsWith(pair.newId + ":") || !rule.getValue().isJsonObject()) {
+ throw new IOException("Provider rule outside owned namespace: " + rule.getKey());
+ }
+ entries++;
+ }
+ }
+ if (entries == 0) throw new IOException("Owned provider declares no rules");
+ } else if (root.has("schema_version")) {
+ int schema = integer(root.get("schema_version"), "schema_version");
+ int maximum = "global-profile".equals(kind) ? MAX_GLOBAL_PROFILE_SCHEMA
+ : "world-profile".equals(kind) ? MAX_WORLD_PROFILE_SCHEMA : 6;
+ if (schema < 1 || schema > maximum) {
+ throw new IOException("Unsupported worldgen profile schema " + schema + " for " + kind);
+ }
+ }
+ for (String section : Arrays.asList("ores", "fluid_deposits", "providers", "ore_providers")) {
+ if (root.has(section) && !root.get(section).isJsonObject()) {
+ throw new IOException("Invalid worldgen section: " + section);
+ }
+ }
+ }
+
+ private static int integer(JsonElement value, String field) throws IOException {
+ try {
+ if (value == null || !value.isJsonPrimitive() || !(value.getAsJsonPrimitive().isNumber()
+ || "dimension".equals(field) && value.getAsJsonPrimitive().isString())) {
+ throw new NumberFormatException();
+ }
+ return new BigDecimal(value.getAsString()).intValueExact();
+ } catch (RuntimeException error) { throw new IOException("Invalid integer: " + field, error); }
+ }
+
+ private static boolean containsStandalone(JsonElement value, Pair pair) {
+ if (value.isJsonObject()) {
+ for (Map.Entry entry : value.getAsJsonObject().entrySet()) {
+ if (entry.getKey().startsWith("orespawn:legacy/" + pair.oldId + "/")
+ || entry.getKey().startsWith("orespawn:legacy/" + pair.newId + "/")
+ || containsStandalone(entry.getValue(), pair)) return true;
+ }
+ } else if (value.isJsonArray()) {
+ for (JsonElement item : value.getAsJsonArray()) if (containsStandalone(item, pair)) return true;
+ }
+ return false;
+ }
+
+ private static boolean hasOwnedRules(JsonObject root, Pair pair) throws IOException {
+ if (containsStandalone(root, pair)) throw new IOException("Standalone owned legacy rules require reconciliation");
+ for (String section : Arrays.asList("ores", "fluid_deposits")) {
+ if (!root.has(section)) continue;
+ for (Map.Entry entry : root.getAsJsonObject(section).entrySet()) {
+ if (entry.getKey().startsWith(pair.newId + ":")) return true;
+ }
+ }
+ return false;
+ }
+
+ private static void checkProviderOverlap(JsonObject profile, JsonObject provider, Pair pair) throws IOException {
+ for (String section : Arrays.asList("ores", "fluid_deposits")) {
+ if (!provider.has(section)) continue;
+ for (Map.Entry supplied : provider.getAsJsonObject(section).entrySet()) {
+ String block = block(supplied.getValue());
+ if (block == null || !block.startsWith(pair.newId + ":")) continue;
+ for (String savedSection : Arrays.asList("ores", "fluid_deposits")) {
+ if (!profile.has(savedSection)) continue;
+ for (Map.Entry saved : profile.getAsJsonObject(savedSection).entrySet()) {
+ if (block.equals(block(saved.getValue())) && !saved.getKey().equals(supplied.getKey())
+ && (saved.getKey().contains(":legacy/") || supplied.getKey().contains(":legacy/"))) {
+ throw new IOException("Saved legacy/modern rule overlap for " + block + "; resolve explicitly");
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private static String block(JsonElement rule) {
+ return rule.isJsonObject() && isString(rule.getAsJsonObject().get("block"))
+ ? rule.getAsJsonObject().get("block").getAsString() : null;
+ }
+
+ private static void preserveLegacyAuthority(JsonObject profile, Pair pair) throws IOException {
+ if (containsStandalone(profile, pair)) throw new IOException("Standalone owned legacy rules require reconciliation");
+ boolean legacy = false;
+ boolean modern = false;
+ for (String section : Arrays.asList("ores", "fluid_deposits")) {
+ if (!profile.has(section)) continue;
+ for (Map.Entry rule : profile.getAsJsonObject(section).entrySet()) {
+ if (!rule.getKey().startsWith(pair.newId + ":")) continue;
+ if (!rule.getValue().isJsonObject()) throw new IOException("Invalid owned saved rule");
+ if (rule.getKey().startsWith(pair.newId + ":legacy/")) legacy = true;
+ else modern = true;
+ }
+ }
+ if (legacy && modern) throw new IOException("Saved legacy and modern owned rules require explicit reconciliation");
+ if (!legacy) return;
+ // Prevent an API-default rule being added beside retained OS1/OS3 rules.
+ JsonObject providers = object(profile, "providers");
+ JsonObject manifest = object(providers, pair.newId);
+ manifest.addProperty("profile_defaults_applied", true);
+ if ("basepower".equals(pair.newId)) {
+ remember(manifest, "known_fluid_deposits", "basepower:fluid_deposit/desert_crude_oil");
+ } else {
+ remember(manifest, "known_ores", "baseelectric:ore/lithium");
+ remember(manifest, "known_ores", "baseelectric:ore/sulfur");
+ }
+ }
+
+ private static JsonObject object(JsonObject parent, String key) throws IOException {
+ if (!parent.has(key)) parent.add(key, new JsonObject());
+ if (!parent.get(key).isJsonObject()) throw new IOException("Expected object: " + key);
+ return parent.getAsJsonObject(key);
+ }
+
+ private static void remember(JsonObject parent, String key, String value) throws IOException {
+ if (!parent.has(key)) parent.add(key, new JsonArray());
+ if (!parent.get(key).isJsonArray()) throw new IOException("Expected array: " + key);
+ JsonArray array = parent.getAsJsonArray(key);
+ for (JsonElement item : array) {
+ if (!isString(item)) throw new IOException("Invalid known rule ID");
+ if (value.equals(item.getAsString())) return;
+ }
+ array.add(new JsonPrimitive(value));
+ }
+
+ private static final class Document {
+ final Path path;
+ final String kind;
+ final byte[] bytes;
+ final JsonObject original;
+ final JsonObject migrated;
+ Document(Path path, String kind, byte[] bytes, Pair pair) throws IOException {
+ this.path = path;
+ this.kind = kind;
+ this.bytes = bytes;
+ try (JsonReader reader = new JsonReader(new StringReader(StandardCharsets.UTF_8.newDecoder()
+ .decode(ByteBuffer.wrap(bytes)).toString()))) {
+ reader.setLenient(false);
+ JsonElement parsed = parse(reader, 0);
+ if (!parsed.isJsonObject() || reader.peek() != JsonToken.END_DOCUMENT) {
+ throw problem(path, "expected one JSON object");
+ }
+ original = parsed.getAsJsonObject();
+ if ("provider".equals(kind)) {
+ String expected = path.getFileName().toString().replace("-orespawn.json", "");
+ if (!isString(original.get("provider_modid"))
+ || !expected.equals(original.get("provider_modid").getAsString())) {
+ throw problem(path, "provider_modid does not match its filename");
+ }
+ }
+ migrated = rewrite(original, pair, "").getAsJsonObject();
+ validate(migrated, kind, pair);
+ if ("global-profile".equals(kind) || "world-profile".equals(kind)) preserveLegacyAuthority(migrated, pair);
+ } catch (RuntimeException error) { throw problem(path, "invalid owned JSON", error); }
+ }
+ }
+
+ // JsonParser is lenient even with a strict reader in older Gson. Read tokens
+ // directly so malformed JSON and duplicate authority keys cannot be lost.
+ private static JsonElement parse(JsonReader reader, int depth) throws IOException {
+ if (depth > 128) throw new IOException("Worldgen JSON exceeds nesting limit");
+ switch (reader.peek()) {
+ case BEGIN_OBJECT:
+ JsonObject object = new JsonObject();
+ reader.beginObject();
+ while (reader.hasNext()) {
+ String key = reader.nextName();
+ if (object.has(key)) throw new IOException("Duplicate JSON key: " + key);
+ object.add(key, parse(reader, depth + 1));
+ }
+ reader.endObject();
+ return object;
+ case BEGIN_ARRAY:
+ JsonArray array = new JsonArray();
+ reader.beginArray();
+ while (reader.hasNext()) array.add(parse(reader, depth + 1));
+ reader.endArray();
+ return array;
+ case STRING: return new JsonPrimitive(reader.nextString());
+ case NUMBER: return new JsonPrimitive(new BigDecimal(reader.nextString()));
+ case BOOLEAN: return new JsonPrimitive(reader.nextBoolean());
+ case NULL: reader.nextNull(); return JsonNull.INSTANCE;
+ default: throw new IOException("Invalid JSON token: " + reader.peek());
+ }
+ }
+
+ private static final class Batch {
+ final Path root;
+ final Pair pair;
+ final Map documents = new LinkedHashMap<>();
+ final Map writes = new LinkedHashMap<>();
+ final List retirements = new ArrayList<>();
+ Batch(Path root, Pair pair) throws IOException {
+ this.root = root.toAbsolutePath().normalize();
+ this.pair = pair;
+ checkPath(this.root);
+ if (Files.exists(this.root, NO_LINKS) && !Files.isDirectory(this.root, NO_LINKS)) {
+ throw problem(this.root, "root is not a directory");
+ }
+ }
+ Path path(String relative) throws IOException {
+ Path target = root.resolve(relative).normalize();
+ if (!target.startsWith(root) || target.equals(root)) throw problem(target, "path escapes root");
+ checkPath(target);
+ return target;
+ }
+ boolean exists(String relative) throws IOException { return Files.exists(path(relative), NO_LINKS); }
+ Document read(String relative, String kind) throws IOException {
+ Path path = path(relative);
+ if (!Files.exists(path, NO_LINKS)) return null;
+ if (!Files.isRegularFile(path, NO_LINKS) || Files.size(path) > 16 * 1024 * 1024) {
+ throw problem(path, "expected a regular JSON file of at most 16 MiB");
+ }
+ Document document = new Document(path, kind, Files.readAllBytes(path), pair);
+ documents.put(path, document);
+ return document;
+ }
+ void write(String relative, JsonObject value) throws IOException {
+ Path path = path(relative);
+ Document existing = documents.get(path);
+ if (existing != null && existing.original.equals(value)) return;
+ writes.put(path, (GSON.toJson(value) + "\n").getBytes(StandardCharsets.UTF_8));
+ }
+ void retire(Document source) { retirements.add(source.path); }
+ int commit() throws IOException {
+ // Check every snapshot and backup before the first mutation.
+ for (Document document : documents.values()) unchanged(document);
+ for (Path path : writes.keySet()) {
+ if (!documents.containsKey(path) && Files.exists(path, NO_LINKS)) {
+ throw problem(path, "destination appeared during migration");
+ }
+ }
+ Map backups = new LinkedHashMap<>();
+ for (Document document : documents.values()) {
+ if (!writes.containsKey(document.path) && !retirements.contains(document.path)) continue;
+ Path backup = document.path.resolveSibling(document.path.getFileName()
+ + ".before-" + pair.newId + "-" + sha256(document.bytes) + ".bak");
+ checkPath(backup);
+ if (Files.exists(backup, NO_LINKS) && (!Files.isRegularFile(backup, NO_LINKS)
+ || !Arrays.equals(document.bytes, Files.readAllBytes(backup)))) {
+ throw problem(backup, "backup conflict; original backup will never be overwritten");
+ }
+ backups.put(document.path, backup);
+ }
+ for (Map.Entry backup : backups.entrySet()) {
+ if (!Files.exists(backup.getValue(), NO_LINKS)) {
+ unchanged(documents.get(backup.getKey()));
+ atomicWrite(backup.getValue(), documents.get(backup.getKey()).bytes, false);
+ }
+ if (!Arrays.equals(documents.get(backup.getKey()).bytes, Files.readAllBytes(backup.getValue()))) {
+ throw problem(backup.getValue(), "backup verification failed");
+ }
+ }
+ for (Map.Entry write : writes.entrySet()) {
+ Document old = documents.get(write.getKey());
+ if (old != null) unchanged(old);
+ atomicWrite(write.getKey(), write.getValue(), old != null);
+ }
+ for (Path source : retirements) {
+ unchanged(documents.get(source));
+ // Exact owned filenames only, after byte-verified immutable backup.
+ Files.delete(source);
+ }
+ return writes.size() + retirements.size();
+ }
+ }
+
+ private static void unchanged(Document document) throws IOException {
+ checkPath(document.path);
+ if (!Files.isRegularFile(document.path, NO_LINKS)
+ || !Arrays.equals(document.bytes, Files.readAllBytes(document.path))) {
+ throw problem(document.path, "source changed during migration");
+ }
+ }
+
+ private static void checkPath(Path path) throws IOException {
+ for (Path current = path.toAbsolutePath().normalize(); current != null; current = current.getParent()) {
+ try {
+ java.nio.file.attribute.BasicFileAttributes attributes = Files.readAttributes(current,
+ java.nio.file.attribute.BasicFileAttributes.class, NO_LINKS);
+ if (attributes.isSymbolicLink() || attributes.isOther()) {
+ throw problem(current, "linked/reparse paths are not permitted");
+ }
+ } catch (java.nio.file.NoSuchFileException absent) { /* Nonexistent leaves are allowed. */ }
+ }
+ }
+
+ private static void atomicWrite(Path target, byte[] bytes, boolean replace) throws IOException {
+ checkPath(target);
+ Files.createDirectories(target.getParent());
+ Path temporary = Files.createTempFile(target.getParent(), ".identity-", ".tmp");
+ try {
+ try (FileChannel channel = FileChannel.open(temporary, StandardOpenOption.WRITE)) {
+ ByteBuffer buffer = ByteBuffer.wrap(bytes);
+ while (buffer.hasRemaining()) channel.write(buffer);
+ channel.force(true);
+ }
+ checkPath(target);
+ if (!replace && Files.exists(target, NO_LINKS)) throw problem(target, "destination appeared");
+ if (replace) {
+ // No non-atomic fallback: unsupported filesystems must stop startup.
+ Files.move(temporary, target, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING);
+ } else {
+ // ATOMIC_MOVE may replace an existing destination even without
+ // REPLACE_EXISTING. Publish new files/backups with an atomic,
+ // no-clobber hard link to independent, fully flushed bytes.
+ Files.createLink(target, temporary);
+ }
+ } finally { Files.deleteIfExists(temporary); }
+ }
+
+ private static String sha256(byte[] bytes) {
+ try {
+ StringBuilder hash = new StringBuilder();
+ for (byte value : MessageDigest.getInstance("SHA-256").digest(bytes)) {
+ hash.append(String.format(java.util.Locale.ROOT, "%02x", value & 255));
+ }
+ return hash.toString();
+ } catch (NoSuchAlgorithmException impossible) { throw new AssertionError(impossible); }
+ }
+
+ private static IOException problem(Path path, String message) { return problem(path, message, null); }
+ private static IOException problem(Path path, String message, Throwable cause) {
+ return new IOException("Worldgen identity migration: " + message + " (" + path + ")", cause);
+ }
+}
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManager.java b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManager.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManager.java
rename to src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManager.java
index 4b06a23..8dc465e 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManager.java
+++ b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManager.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.conduitnetwork;
+package zone.moddev.mc.basepower.conduitnetwork;
import java.util.ArrayList;
import java.util.Collections;
@@ -9,8 +9,8 @@
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PowerConnectorContext;
-import zone.moddev.mc.poweradvantage.math.BlockPos4D;
-import zone.moddev.mc.poweradvantage.util.PowerHelper;
+import zone.moddev.mc.basepower.math.BlockPos4D;
+import zone.moddev.mc.basepower.util.PowerHelper;
import net.minecraft.block.state.IBlockState;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.ChunkPos;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitRegistry.java b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitRegistry.java
similarity index 98%
rename from src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitRegistry.java
rename to src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitRegistry.java
index 0abf473..b99fa3b 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitRegistry.java
+++ b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitRegistry.java
@@ -1,6 +1,6 @@
-package zone.moddev.mc.poweradvantage.conduitnetwork;
+package zone.moddev.mc.basepower.conduitnetwork;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.IPowerMachine;
import cyano.poweradvantage.api.ITypedConduit;
@@ -8,7 +8,7 @@
import cyano.poweradvantage.api.modsupport.ExternalPowerRequest;
import cyano.poweradvantage.api.modsupport.LightWeightPowerRegistry;
import cyano.poweradvantage.api.modsupport.Wrappers;
-import zone.moddev.mc.poweradvantage.math.BlockPos4D;
+import zone.moddev.mc.basepower.math.BlockPos4D;
import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.tileentity.TileEntity;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/package-info.java b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/package-info.java
similarity index 87%
rename from src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/conduitnetwork/package-info.java
index 0dae2de..e16e94a 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/package-info.java
@@ -4,4 +4,4 @@
the same power type and caching the resulting list of sources and sinks. Every time a conduit block
is placed or broken, any adjacent networks are revalidated.
*/
-package zone.moddev.mc.poweradvantage.conduitnetwork;
\ No newline at end of file
+package zone.moddev.mc.basepower.conduitnetwork;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/graphics/package-info.java b/src/main/java/zone/moddev/mc/basepower/graphics/package-info.java
similarity index 70%
rename from src/main/java/zone/moddev/mc/poweradvantage/graphics/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/graphics/package-info.java
index d75d837..29bc810 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/graphics/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/graphics/package-info.java
@@ -2,4 +2,4 @@
This package contains classes related to on-demand rendering, such as for
entities and animated blocks.
*/
-package zone.moddev.mc.poweradvantage.graphics;
\ No newline at end of file
+package zone.moddev.mc.basepower.graphics;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/gui/FilteredFluidTankGUI.java b/src/main/java/zone/moddev/mc/basepower/gui/FilteredFluidTankGUI.java
similarity index 95%
rename from src/main/java/zone/moddev/mc/poweradvantage/gui/FilteredFluidTankGUI.java
rename to src/main/java/zone/moddev/mc/basepower/gui/FilteredFluidTankGUI.java
index 96997b3..0a34f69 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/gui/FilteredFluidTankGUI.java
+++ b/src/main/java/zone/moddev/mc/basepower/gui/FilteredFluidTankGUI.java
@@ -1,8 +1,8 @@
-package zone.moddev.mc.poweradvantage.gui;
+package zone.moddev.mc.basepower.gui;
import cyano.poweradvantage.api.fluid.FluidPoweredEntity;
import cyano.poweradvantage.api.simple.SimpleMachineGUI;
-import zone.moddev.mc.poweradvantage.math.Integer2D;
+import zone.moddev.mc.basepower.math.Integer2D;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/gui/FluidTankGUI.java b/src/main/java/zone/moddev/mc/basepower/gui/FluidTankGUI.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/gui/FluidTankGUI.java
rename to src/main/java/zone/moddev/mc/basepower/gui/FluidTankGUI.java
index b3642cd..5f28c52 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/gui/FluidTankGUI.java
+++ b/src/main/java/zone/moddev/mc/basepower/gui/FluidTankGUI.java
@@ -1,8 +1,8 @@
-package zone.moddev.mc.poweradvantage.gui;
+package zone.moddev.mc.basepower.gui;
import cyano.poweradvantage.api.fluid.FluidPoweredEntity;
import cyano.poweradvantage.api.simple.SimpleMachineGUI;
-import zone.moddev.mc.poweradvantage.math.Integer2D;
+import zone.moddev.mc.basepower.math.Integer2D;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.VertexBuffer;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/gui/FunctionalCreativeTab.java b/src/main/java/zone/moddev/mc/basepower/gui/FunctionalCreativeTab.java
similarity index 98%
rename from src/main/java/zone/moddev/mc/poweradvantage/gui/FunctionalCreativeTab.java
rename to src/main/java/zone/moddev/mc/basepower/gui/FunctionalCreativeTab.java
index 22c64bc..9ca4036 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/gui/FunctionalCreativeTab.java
+++ b/src/main/java/zone/moddev/mc/basepower/gui/FunctionalCreativeTab.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.gui;
+package zone.moddev.mc.basepower.gui;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/gui/StillGUI.java b/src/main/java/zone/moddev/mc/basepower/gui/StillGUI.java
similarity index 90%
rename from src/main/java/zone/moddev/mc/poweradvantage/gui/StillGUI.java
rename to src/main/java/zone/moddev/mc/basepower/gui/StillGUI.java
index e26ce4b..74ae782 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/gui/StillGUI.java
+++ b/src/main/java/zone/moddev/mc/basepower/gui/StillGUI.java
@@ -1,8 +1,8 @@
-package zone.moddev.mc.poweradvantage.gui;
+package zone.moddev.mc.basepower.gui;
import cyano.poweradvantage.api.simple.SimpleMachineGUI;
-import zone.moddev.mc.poweradvantage.machines.fluidmachines.StillTileEntity;
-import zone.moddev.mc.poweradvantage.math.Integer2D;
+import zone.moddev.mc.basepower.machines.fluidmachines.StillTileEntity;
+import zone.moddev.mc.basepower.math.Integer2D;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/items/package-info.java b/src/main/java/zone/moddev/mc/basepower/gui/package-info.java
similarity index 76%
rename from src/main/java/zone/moddev/mc/poweradvantage/items/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/gui/package-info.java
index 8478604..e830c8e 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/items/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/gui/package-info.java
@@ -3,10 +3,10 @@
This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API.
If you are writing an add-on mod, use the code in this package for reference, but you should not
depend on it's implementation details as future updates might change them. For a better way to get
-PowerAdvantage content, look in the zone.moddev.mc.poweradvantage.init package.
+PowerAdvantage content, look in the zone.moddev.mc.basepower.init package.
Because these classes are not part of the API, they are not well documented. They were only meant
for the eyes of the mod author(s).
*/
-package zone.moddev.mc.poweradvantage.items;
\ No newline at end of file
+package zone.moddev.mc.basepower.gui;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Blocks.java b/src/main/java/zone/moddev/mc/basepower/init/Blocks.java
similarity index 93%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/Blocks.java
rename to src/main/java/zone/moddev/mc/basepower/init/Blocks.java
index 45e3fdf..11b0e95 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/Blocks.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Blocks.java
@@ -1,15 +1,15 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.GUIBlock;
import cyano.poweradvantage.api.fluid.InteractiveFluidBlock;
-import zone.moddev.mc.poweradvantage.blocks.BlockFrame;
-import zone.moddev.mc.poweradvantage.blocks.BlockPowerSwitch;
-import zone.moddev.mc.poweradvantage.machines.conveyors.*;
-import zone.moddev.mc.poweradvantage.machines.creative.InfiniteEnergyBlock;
-import zone.moddev.mc.poweradvantage.machines.fluidmachines.*;
-import zone.moddev.mc.poweradvantage.machines.fluidmachines.modsupport.TerminalFluidPipeBlock;
+import zone.moddev.mc.basepower.blocks.BlockFrame;
+import zone.moddev.mc.basepower.blocks.BlockPowerSwitch;
+import zone.moddev.mc.basepower.machines.conveyors.*;
+import zone.moddev.mc.basepower.machines.creative.InfiniteEnergyBlock;
+import zone.moddev.mc.basepower.machines.fluidmachines.*;
+import zone.moddev.mc.basepower.machines.fluidmachines.modsupport.TerminalFluidPipeBlock;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
@@ -77,7 +77,7 @@ public static void init() {
if (initDone) return;
ItemGroups.init();
Fluids.init();
- zone.moddev.mc.poweradvantage.init.Materials.init();
+ zone.moddev.mc.basepower.init.Materials.init();
fluid_drain = (GUIBlock) addBlock(new FluidDrainBlock(), "fluid_drain");
diff --git a/src/main/java/zone/moddev/mc/basepower/init/Entities.java b/src/main/java/zone/moddev/mc/basepower/init/Entities.java
new file mode 100644
index 0000000..cc5effa
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/init/Entities.java
@@ -0,0 +1,41 @@
+package zone.moddev.mc.basepower.init;
+
+import net.minecraftforge.fml.common.registry.GameRegistry;
+import zone.moddev.mc.basepower.compat.LegacyIdentity;
+import zone.moddev.mc.basepower.PowerAdvantage;
+import zone.moddev.mc.basepower.machines.conveyors.*;
+import zone.moddev.mc.basepower.machines.creative.InfiniteEnergyTileEntity;
+import zone.moddev.mc.basepower.machines.fluidmachines.*;
+import zone.moddev.mc.basepower.machines.fluidmachines.modsupport.TerminalFluidPipeTileEntity;
+
+public abstract class Entities {
+
+
+ private static boolean initDone = false;
+
+ public static void init() {
+ if (initDone) return;
+
+ Blocks.init();
+
+ LegacyIdentity.registerTileEntity(TerminalFluidPipeTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "pipe_terminal");
+ LegacyIdentity.registerTileEntity(FluidDrainTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_drain");
+ LegacyIdentity.registerTileEntity(FluidDischargeTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_discharge");
+ LegacyIdentity.registerTileEntity(StorageTankTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_storage_tank");
+ LegacyIdentity.registerTileEntity(MetalTankTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_metal_tank");
+ LegacyIdentity.registerTileEntity(StillTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "still");
+ LegacyIdentity.registerTileEntity(TileEntityConveyor.class, PowerAdvantage.MODID + "." + "item_conveyor");
+ LegacyIdentity.registerTileEntity(TileEntityBlockFilter.class, PowerAdvantage.MODID + "." + "item_filter_block");
+ LegacyIdentity.registerTileEntity(TileEntityFoodFilter.class, PowerAdvantage.MODID + "." + "item_filter_food");
+ LegacyIdentity.registerTileEntity(TileEntityFuelFilter.class, PowerAdvantage.MODID + "." + "item_filter_fuel");
+ LegacyIdentity.registerTileEntity(TileEntityInventoryFilter.class, PowerAdvantage.MODID + "." + "item_filter_inventory");
+ LegacyIdentity.registerTileEntity(TileEntityOreFilter.class, PowerAdvantage.MODID + "." + "item_filter_ore");
+ LegacyIdentity.registerTileEntity(TileEntityPlantFilter.class, PowerAdvantage.MODID + "." + "item_filter_plant");
+ LegacyIdentity.registerTileEntity(TileEntitySmeltableFilter.class, PowerAdvantage.MODID + "." + "item_filter_smelt");
+ LegacyIdentity.registerTileEntity(TileEntityOverflowFilter.class, PowerAdvantage.MODID + "." + "item_filter_overflow");
+
+ LegacyIdentity.registerTileEntity(InfiniteEnergyTileEntity.class, PowerAdvantage.MODID + "." + "infinite_energy_source");
+
+ initDone = true;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Fluids.java b/src/main/java/zone/moddev/mc/basepower/init/Fluids.java
similarity index 94%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/Fluids.java
rename to src/main/java/zone/moddev/mc/basepower/init/Fluids.java
index cb00dac..27fa2d4 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/Fluids.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Fluids.java
@@ -1,10 +1,10 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.fluid.ColoredFluid;
-import zone.moddev.mc.poweradvantage.util.ReversibleHashMap;
-import zone.moddev.mc.poweradvantage.util.ReversibleMap;
+import zone.moddev.mc.basepower.util.ReversibleHashMap;
+import zone.moddev.mc.basepower.util.ReversibleMap;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
@@ -44,7 +44,7 @@ public abstract class Fluids {
public static void init() {
if (initDone) return;
- zone.moddev.mc.poweradvantage.init.Materials.init();
+ zone.moddev.mc.basepower.init.Materials.init();
fluidConduit_water = new ConduitType("water");
fluidConduit_lava = new ConduitType("lava");
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Fuels.java b/src/main/java/zone/moddev/mc/basepower/init/Fuels.java
similarity index 94%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/Fuels.java
rename to src/main/java/zone/moddev/mc/basepower/init/Fuels.java
index 767e654..200f098 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/Fuels.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Fuels.java
@@ -1,7 +1,7 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import zone.moddev.mc.poweradvantage.compat.BaseMetalsCompat;
-import zone.moddev.mc.poweradvantage.registry.FuelRegistry;
+import zone.moddev.mc.basepower.compat.BaseMetalsCompat;
+import zone.moddev.mc.basepower.registry.FuelRegistry;
import cyano.poweradvantage.api.FluidCategoryRegistry;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/GUI.java b/src/main/java/zone/moddev/mc/basepower/init/GUI.java
similarity index 93%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/GUI.java
rename to src/main/java/zone/moddev/mc/basepower/init/GUI.java
index 3d845d7..19e1523 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/GUI.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/GUI.java
@@ -1,11 +1,11 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
import net.minecraft.util.ResourceLocation;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import cyano.poweradvantage.api.simple.SimpleMachineGUI;
-import zone.moddev.mc.poweradvantage.gui.*;
-import zone.moddev.mc.poweradvantage.math.Integer2D;
-import zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry;
+import zone.moddev.mc.basepower.gui.*;
+import zone.moddev.mc.basepower.math.Integer2D;
+import zone.moddev.mc.basepower.registry.MachineGUIRegistry;
public abstract class GUI {
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/ItemGroups.java b/src/main/java/zone/moddev/mc/basepower/init/ItemGroups.java
similarity index 90%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/ItemGroups.java
rename to src/main/java/zone/moddev/mc/basepower/init/ItemGroups.java
index 032ab41..48efb2d 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/ItemGroups.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/ItemGroups.java
@@ -1,7 +1,7 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
-import zone.moddev.mc.poweradvantage.gui.FunctionalCreativeTab;
+import zone.moddev.mc.basepower.PowerAdvantage;
+import zone.moddev.mc.basepower.gui.FunctionalCreativeTab;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Items.java b/src/main/java/zone/moddev/mc/basepower/init/Items.java
similarity index 94%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/Items.java
rename to src/main/java/zone/moddev/mc/basepower/init/Items.java
index 974a17d..1c820a4 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/Items.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Items.java
@@ -1,7 +1,7 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
-import zone.moddev.mc.poweradvantage.items.RotationTool;
+import zone.moddev.mc.basepower.PowerAdvantage;
+import zone.moddev.mc.basepower.items.RotationTool;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Materials.java b/src/main/java/zone/moddev/mc/basepower/init/Materials.java
similarity index 77%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/Materials.java
rename to src/main/java/zone/moddev/mc/basepower/init/Materials.java
index 4373aac..91af787 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/Materials.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Materials.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
public class Materials {
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/ModSupport.java b/src/main/java/zone/moddev/mc/basepower/init/ModSupport.java
similarity index 85%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/ModSupport.java
rename to src/main/java/zone/moddev/mc/basepower/init/ModSupport.java
index d2919f5..2bc6bf8 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/ModSupport.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/ModSupport.java
@@ -1,6 +1,6 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.modsupport.rf.BlockRFConverter;
import cyano.poweradvantage.api.modsupport.rf.TileEntityRFElectricityConverter;
@@ -17,6 +17,7 @@
import net.minecraftforge.fml.common.FMLLog;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
+import zone.moddev.mc.basepower.compat.LegacyIdentity;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.oredict.ShapedOreRecipe;
@@ -48,9 +49,9 @@ public static void init(boolean rfSupport, boolean techRebornSupport) {
converter_rf_electricity = addBlock(new BlockRFConverter(defaultMachineMaterial, defaultMachineHardness, new ConduitType("electricity"), TileEntityRFElectricityConverter.class), "converter_rf_electricity");
converter_rf_quantum = addBlock(new BlockRFConverter(defaultMachineMaterial, defaultMachineHardness, new ConduitType("quantum"), TileEntityRFQuantumConverter.class), "converter_rf_quantum");
- GameRegistry.registerTileEntity(TileEntityRFSteamConverter.class, PowerAdvantage.MODID + "." + "rf_steam_converter_tileentity");
- GameRegistry.registerTileEntity(TileEntityRFElectricityConverter.class, PowerAdvantage.MODID + "." + "rf_electricity_converter_tileentity");
- GameRegistry.registerTileEntity(TileEntityRFQuantumConverter.class, PowerAdvantage.MODID + "." + "rf_quantum_converter_tileentity");
+ LegacyIdentity.registerTileEntity(TileEntityRFSteamConverter.class, PowerAdvantage.MODID + "." + "rf_steam_converter_tileentity");
+ LegacyIdentity.registerTileEntity(TileEntityRFElectricityConverter.class, PowerAdvantage.MODID + "." + "rf_electricity_converter_tileentity");
+ LegacyIdentity.registerTileEntity(TileEntityRFQuantumConverter.class, PowerAdvantage.MODID + "." + "rf_quantum_converter_tileentity");
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(converter_rf_steam, 1),
"xyz",
@@ -67,7 +68,7 @@ public static void init(boolean rfSupport, boolean techRebornSupport) {
// first, register transformers in Ore Dictionary
converter_tr_electricity = addBlock(new BlockTRConverter(defaultMachineMaterial, defaultMachineHardness, new ConduitType("electricity"), TileEntityTRElectricityConverter.class), "converter_tr_electricity");
- GameRegistry.registerTileEntity(TileEntityTRElectricityConverter.class, PowerAdvantage.MODID + "." + "tr_electricity_converter_tileentity");
+ LegacyIdentity.registerTileEntity(TileEntityTRElectricityConverter.class, PowerAdvantage.MODID + "." + "tr_electricity_converter_tileentity");
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(converter_tr_electricity, 1), "XXX", "XZX", "XXX",
'Z', "PSU", 'X', "ingotRefinedIron"));
}
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGen.java b/src/main/java/zone/moddev/mc/basepower/init/OreSpawnWorldGen.java
similarity index 92%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGen.java
rename to src/main/java/zone/moddev/mc/basepower/init/OreSpawnWorldGen.java
index 7f97172..64bbc4a 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGen.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/OreSpawnWorldGen.java
@@ -1,6 +1,6 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.FMLLog;
import net.minecraftforge.fml.common.Loader;
@@ -27,9 +27,9 @@ public static void register(Path configDirectory) {
boolean accepted = OreSpawnApi.enqueue(provider);
String override = describeOverride(configDirectory);
String defaults = Loader.isModLoaded("mineralogy")
- ? "mineralogy:ocean crude oil + poweradvantage:desert crude oil"
- : "poweradvantage:desert crude oil";
- FMLLog.info("%s: OreSpawn crude-oil candidates=[mineralogy:ocean, poweradvantage:desert], "
+ ? "mineralogy:ocean crude oil + basepower:desert crude oil"
+ : "basepower:desert crude oil";
+ FMLLog.info("%s: OreSpawn crude-oil candidates=[mineralogy:ocean, basepower:desert], "
+ "selected fresh-world defaults=[%s], explicit override=%s",
PowerAdvantage.MODID, defaults, override);
if (!accepted) {
@@ -68,4 +68,4 @@ static String describeOverride(Path configDirectory) {
}
return "none";
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Recipes.java b/src/main/java/zone/moddev/mc/basepower/init/Recipes.java
similarity index 96%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/Recipes.java
rename to src/main/java/zone/moddev/mc/basepower/init/Recipes.java
index c009569..e84b24b 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/Recipes.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Recipes.java
@@ -1,10 +1,10 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import cyano.poweradvantage.api.FluidCategoryRegistry;
-import zone.moddev.mc.poweradvantage.RecipeMode;
-import zone.moddev.mc.poweradvantage.compat.BaseMetalsCompat;
-import zone.moddev.mc.poweradvantage.registry.still.recipe.DistillationRecipeRegistry;
+import zone.moddev.mc.basepower.RecipeMode;
+import zone.moddev.mc.basepower.compat.BaseMetalsCompat;
+import zone.moddev.mc.basepower.registry.still.recipe.DistillationRecipeRegistry;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.FMLLog;
import net.minecraftforge.fluids.Fluid;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/TreasureChests.java b/src/main/java/zone/moddev/mc/basepower/init/TreasureChests.java
similarity index 88%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/TreasureChests.java
rename to src/main/java/zone/moddev/mc/basepower/init/TreasureChests.java
index 4558051..74966f1 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/TreasureChests.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/TreasureChests.java
@@ -1,6 +1,6 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import net.minecraftforge.fml.common.FMLLog;
import org.apache.logging.log4j.Level;
@@ -30,6 +30,7 @@ public static void init(Path configFolder) {
private static void writeLootFile(Path file, String content) {
try {
+ if (Files.exists(file)) return;
Files.createDirectories(file.getParent());
Files.write(file, Arrays.asList(content), Charset.forName("UTF-8"));
} catch (IOException e) {
@@ -49,7 +50,7 @@ private static void writeLootFile(Path file, String content) {
" },\n" +
" {\n" +
" \"type\": \"item\",\n" +
- " \"name\": \"poweradvantage:sprocket\",\n" +
+ " \"name\": \"basepower:sprocket\",\n" +
" \"weight\": 5,\n" +
" \"functions\": [\n" +
" {\n" +
@@ -63,7 +64,7 @@ private static void writeLootFile(Path file, String content) {
" },\n" +
" {\n" +
" \"type\": \"item\",\n" +
- " \"name\": \"poweradvantage:fluid_pipe\",\n" +
+ " \"name\": \"basepower:fluid_pipe\",\n" +
" \"weight\": 5,\n" +
" \"functions\": [\n" +
" {\n" +
@@ -77,22 +78,22 @@ private static void writeLootFile(Path file, String content) {
" },\n" +
" {\n" +
" \"type\": \"item\",\n" +
- " \"name\": \"poweradvantage:fluid_storage_tank\",\n" +
+ " \"name\": \"basepower:fluid_storage_tank\",\n" +
" \"weight\": 3\n" +
" },\n" +
" {\n" +
" \"type\": \"item\",\n" +
- " \"name\": \"poweradvantage:fluid_drain\",\n" +
+ " \"name\": \"basepower:fluid_drain\",\n" +
" \"weight\": 2\n" +
" },\n" +
" {\n" +
" \"type\": \"item\",\n" +
- " \"name\": \"poweradvantage:fluid_discharge\",\n" +
+ " \"name\": \"basepower:fluid_discharge\",\n" +
" \"weight\": 2\n" +
" },\n" +
" {\n" +
" \"type\": \"item\",\n" +
- " \"name\": \"poweradvantage:item_conveyor\",\n" +
+ " \"name\": \"basepower:item_conveyor\",\n" +
" \"weight\": 3,\n" +
" \"functions\": [\n" +
" {\n" +
@@ -108,4 +109,4 @@ private static void writeLootFile(Path file, String content) {
" }\n" +
" ]\n" +
"}\n";
-}
\ No newline at end of file
+}
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Villages.java b/src/main/java/zone/moddev/mc/basepower/init/Villages.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/Villages.java
rename to src/main/java/zone/moddev/mc/basepower/init/Villages.java
index 2a926dd..ed2b4c6 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/Villages.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Villages.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.util.ResourceLocation;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/WorldGen.java b/src/main/java/zone/moddev/mc/basepower/init/WorldGen.java
similarity index 85%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/WorldGen.java
rename to src/main/java/zone/moddev/mc/basepower/init/WorldGen.java
index 77cc2cb..e25d91c 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/WorldGen.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/WorldGen.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
public abstract class WorldGen {
@@ -20,7 +20,7 @@ public static void init() {
+ " \"dimension\":\"+\",\n"
+ " \"ores\":[\n"
+ " {\n"
- + " \"blockID\":\"poweradvantage:crude_oil\",\n"
+ + " \"blockID\":\"basepower:crude_oil\",\n"
+ " \"size\":64,\n"
+ " \"variation\":50,\n"
+ " \"frequency\":0.25,\n"
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/package-info.java b/src/main/java/zone/moddev/mc/basepower/init/package-info.java
similarity index 77%
rename from src/main/java/zone/moddev/mc/poweradvantage/init/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/init/package-info.java
index 2711107..28a4285 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/package-info.java
@@ -2,4 +2,4 @@
This package contains registries for all of the new content added by PowerAdvantage. Use these
classes to interact with the items and blocks.
*/
-package zone.moddev.mc.poweradvantage.init;
\ No newline at end of file
+package zone.moddev.mc.basepower.init;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/items/RotationTool.java b/src/main/java/zone/moddev/mc/basepower/items/RotationTool.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/items/RotationTool.java
rename to src/main/java/zone/moddev/mc/basepower/items/RotationTool.java
index 9da1115..265abf8 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/items/RotationTool.java
+++ b/src/main/java/zone/moddev/mc/basepower/items/RotationTool.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.items;
+package zone.moddev.mc.basepower.items;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/blocks/package-info.java b/src/main/java/zone/moddev/mc/basepower/items/package-info.java
similarity index 76%
rename from src/main/java/zone/moddev/mc/poweradvantage/blocks/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/items/package-info.java
index 5af68da..04ef1d7 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/blocks/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/items/package-info.java
@@ -3,10 +3,10 @@
This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API.
If you are writing an add-on mod, use the code in this package for reference, but you should not
depend on it's implementation details as future updates might change them. For a better way to get
-PowerAdvantage content, look in the zone.moddev.mc.poweradvantage.init package.
+PowerAdvantage content, look in the zone.moddev.mc.basepower.init package.
Because these classes are not part of the API, they are not well documented. They were only meant
for the eyes of the mod author(s).
*/
-package zone.moddev.mc.poweradvantage.blocks;
\ No newline at end of file
+package zone.moddev.mc.basepower.items;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyor.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyor.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyor.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyor.java
index 178d63d..c1ef080 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyor.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyor.java
@@ -1,7 +1,7 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import cyano.poweradvantage.api.GUIBlock;
-import zone.moddev.mc.poweradvantage.init.ItemGroups;
+import zone.moddev.mc.basepower.init.ItemGroups;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyorFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyorFilter.java
similarity index 96%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyorFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyorFilter.java
index 3ae14e2..30b3aa4 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyorFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyorFilter.java
@@ -1,8 +1,8 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import com.google.common.base.Predicate;
import cyano.poweradvantage.api.GUIBlock;
-import zone.moddev.mc.poweradvantage.init.ItemGroups;
+import zone.moddev.mc.basepower.init.ItemGroups;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityBlockFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityBlockFilter.java
similarity index 83%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityBlockFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityBlockFilter.java
index 9eded62..8a65770 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityBlockFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityBlockFilter.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyor.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyor.java
similarity index 99%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyor.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyor.java
index 12ca3c6..45ccf7f 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyor.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyor.java
@@ -1,6 +1,6 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
-import zone.moddev.mc.poweradvantage.util.InventoryWrapper;
+import zone.moddev.mc.basepower.util.InventoryWrapper;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyorFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyorFilter.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyorFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyorFilter.java
index 4874ffa..31cc3ee 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyorFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyorFilter.java
@@ -1,6 +1,6 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
-import zone.moddev.mc.poweradvantage.util.InventoryWrapper;
+import zone.moddev.mc.basepower.util.InventoryWrapper;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.inventory.IInventory;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFoodFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFoodFilter.java
similarity index 83%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFoodFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFoodFilter.java
index db5eae3..2425df8 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFoodFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFoodFilter.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFuelFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFuelFilter.java
similarity index 83%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFuelFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFuelFilter.java
index d98a6e8..513b828 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFuelFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFuelFilter.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.item.ItemStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityInventoryFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityInventoryFilter.java
similarity index 90%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityInventoryFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityInventoryFilter.java
index b0b9c23..6875aa0 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityInventoryFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityInventoryFilter.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.item.ItemStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOreFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOreFilter.java
similarity index 91%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOreFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOreFilter.java
index 635f3cd..5573d7f 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOreFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOreFilter.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOverflowFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOverflowFilter.java
similarity index 90%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOverflowFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOverflowFilter.java
index 47edee6..052ba25 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOverflowFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOverflowFilter.java
@@ -1,6 +1,6 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
-import zone.moddev.mc.poweradvantage.util.InventoryWrapper;
+import zone.moddev.mc.basepower.util.InventoryWrapper;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityPlantFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityPlantFilter.java
similarity index 91%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityPlantFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityPlantFilter.java
index 59c50fb..6f6f65c 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityPlantFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityPlantFilter.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.block.Block;
import net.minecraft.block.IGrowable;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntitySmeltableFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntitySmeltableFilter.java
similarity index 85%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntitySmeltableFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntitySmeltableFilter.java
index dd4ea04..e2203d3 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntitySmeltableFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntitySmeltableFilter.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/package-info.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/package-info.java
similarity index 75%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/package-info.java
index 23e6fb8..f1881ac 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/package-info.java
@@ -3,10 +3,10 @@
This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API.
If you are writing an add-on mod, use the code in this package for reference, but you should not
depend on it's implementation details as future updates might change them. For a better way to get
-PowerAdvantage content, look in the zone.moddev.mc.poweradvantage.init package.
+PowerAdvantage content, look in the zone.moddev.mc.basepower.init package.
Because these classes are not part of the API, they are not well documented. They were only meant
for the eyes of the mod author(s).
*/
-package zone.moddev.mc.poweradvantage.machines.conveyors;
\ No newline at end of file
+package zone.moddev.mc.basepower.machines.conveyors;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyBlock.java
similarity index 96%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyBlock.java
index 82e8286..d75ce84 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyBlock.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.creative;
+package zone.moddev.mc.basepower.machines.creative;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PoweredEntity;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyTileEntity.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyTileEntity.java
index 3b0d77e..76ad9c4 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyTileEntity.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.creative;
+package zone.moddev.mc.basepower.machines.creative;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.simple.TileEntitySimplePowerMachine;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeBlock.java
similarity index 96%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeBlock.java
index 57d81d8..88597ef 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeBlock.java
@@ -1,10 +1,10 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PoweredEntity;
import cyano.poweradvantage.api.simple.BlockSimpleFluidMachine;
import cyano.poweradvantage.api.simple.TileEntitySimplePowerMachine;
-import zone.moddev.mc.poweradvantage.init.ItemGroups;
+import zone.moddev.mc.basepower.init.ItemGroups;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeTileEntity.java
similarity index 99%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeTileEntity.java
index 2ad5bff..104bea0 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeTileEntity.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainBlock.java
similarity index 95%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainBlock.java
index a04ddc2..e48d49d 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainBlock.java
@@ -1,9 +1,9 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PoweredEntity;
import cyano.poweradvantage.api.simple.BlockSimpleFluidMachine;
-import zone.moddev.mc.poweradvantage.init.ItemGroups;
+import zone.moddev.mc.basepower.init.ItemGroups;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainTileEntity.java
similarity index 99%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainTileEntity.java
index 7a4efb5..33d1762 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainTileEntity.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidPipeBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidPipeBlock.java
similarity index 94%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidPipeBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidPipeBlock.java
index 4d98ed1..70c3fde 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidPipeBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidPipeBlock.java
@@ -1,7 +1,7 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.simple.BlockSimpleFluidConduit;
-import zone.moddev.mc.poweradvantage.init.Blocks;
+import zone.moddev.mc.basepower.init.Blocks;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankBlock.java
similarity index 96%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankBlock.java
index 8a63526..b376e4f 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankBlock.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PoweredEntity;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankTileEntity.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankTileEntity.java
index f610fe0..e02d8f0 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankTileEntity.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PowerRequest;
@@ -12,7 +12,7 @@
public class MetalTankTileEntity extends TileEntitySimpleFluidMachine {
public MetalTankTileEntity() {
- super(FluidContainerRegistry.BUCKET_VOLUME * 10, "tile.poweradvantage.fluid_metal_tank.name");
+ super(FluidContainerRegistry.BUCKET_VOLUME * 10, "tile.basepower.fluid_metal_tank.name");
}
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillBlock.java
similarity index 98%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillBlock.java
index 6d85976..d4b7921 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillBlock.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PoweredEntity;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillTileEntity.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillTileEntity.java
index a4cb796..b9a9df0 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillTileEntity.java
@@ -1,10 +1,10 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.fluid.FluidRequest;
import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine;
-import zone.moddev.mc.poweradvantage.registry.FuelRegistry;
-import zone.moddev.mc.poweradvantage.registry.still.recipe.DistillationRecipe;
-import zone.moddev.mc.poweradvantage.registry.still.recipe.DistillationRecipeRegistry;
+import zone.moddev.mc.basepower.registry.FuelRegistry;
+import zone.moddev.mc.basepower.registry.still.recipe.DistillationRecipe;
+import zone.moddev.mc.basepower.registry.still.recipe.DistillationRecipeRegistry;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankBlock.java
similarity index 94%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankBlock.java
index 1f11b5e..528df41 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankBlock.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PoweredEntity;
@@ -119,11 +119,11 @@ public void displayInformation(ItemStack stack) {
}
if (dataTag.hasKey("Volume") && dataTag.hasKey("FluidID")) {
float buckets = (float) dataTag.getInteger("Volume") / (float) FluidContainerRegistry.BUCKET_VOLUME;
- message = (I18n.translateToLocal("tooltip.poweradvantage.buckets_of")
+ message = (I18n.translateToLocal("tooltip.basepower.buckets_of")
.replace("%x", String.valueOf(buckets))
.replace("%y", FluidRegistry.getFluid(dataTag.getString("FluidID")).getName()));
} else {
- message = (I18n.translateToLocal("tooltip.poweradvantage.empty"));
+ message = (I18n.translateToLocal("tooltip.basepower.empty"));
}
NBTTagCompound displayTag;
@@ -142,7 +142,7 @@ public void displayInformation(ItemStack stack) {
}
loreTag.appendTag(new NBTTagString(message));
if (!stack.hasTagCompound()) {
- stack.setTagCompound(new NBTTagCompound());
+ stack.setTagCompound(dataTag);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankTileEntity.java
similarity index 95%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankTileEntity.java
index 57e7ce6..254c812 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankTileEntity.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.PowerRequest;
import cyano.poweradvantage.api.fluid.FluidRequest;
@@ -12,7 +12,7 @@
public class StorageTankTileEntity extends TileEntitySimpleFluidMachine {
public StorageTankTileEntity() {
- super(FluidContainerRegistry.BUCKET_VOLUME * 4, "tile.poweradvantage.fluid_storage_tank.name");
+ super(FluidContainerRegistry.BUCKET_VOLUME * 4, "tile.basepower.fluid_storage_tank.name");
}
/**
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java
similarity index 92%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java
index 90db281..1eb0cc5 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java
@@ -1,8 +1,8 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines.modsupport;
+package zone.moddev.mc.basepower.machines.fluidmachines.modsupport;
import cyano.poweradvantage.api.ConduitType;
-import zone.moddev.mc.poweradvantage.init.Blocks;
-import zone.moddev.mc.poweradvantage.machines.fluidmachines.FluidPipeBlock;
+import zone.moddev.mc.basepower.init.Blocks;
+import zone.moddev.mc.basepower.machines.fluidmachines.FluidPipeBlock;
import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.state.IBlockState;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java
similarity index 96%
rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java
index bec3c8a..7758f5e 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java
@@ -1,12 +1,12 @@
-package zone.moddev.mc.poweradvantage.machines.fluidmachines.modsupport;
+package zone.moddev.mc.basepower.machines.fluidmachines.modsupport;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.PowerConnectorContext;
import cyano.poweradvantage.api.PowerRequest;
import cyano.poweradvantage.api.PoweredEntity;
import cyano.poweradvantage.api.fluid.FluidRequest;
-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;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
diff --git a/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/package-info.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/package-info.java
new file mode 100644
index 0000000..58c6c73
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/package-info.java
@@ -0,0 +1,12 @@
+/**
+
+This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API.
+If you are writing an add-on mod, use the code in this package for reference, but you should not
+depend on it's implementation details as future updates might change them. For a better way to get
+PowerAdvantage content, look in the zone.moddev.mc.basepower.init package.
+
+Because these classes are not part of the API, they are not well documented. They were only meant
+for the eyes of the mod author(s).
+
+*/
+package zone.moddev.mc.basepower.machines.fluidmachines;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/math/BlockPos4D.java b/src/main/java/zone/moddev/mc/basepower/math/BlockPos4D.java
similarity index 99%
rename from src/main/java/zone/moddev/mc/poweradvantage/math/BlockPos4D.java
rename to src/main/java/zone/moddev/mc/basepower/math/BlockPos4D.java
index 034ad95..3d8b797 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/math/BlockPos4D.java
+++ b/src/main/java/zone/moddev/mc/basepower/math/BlockPos4D.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.math;
+package zone.moddev.mc.basepower.math;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagIntArray;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/math/Integer2D.java b/src/main/java/zone/moddev/mc/basepower/math/Integer2D.java
similarity index 93%
rename from src/main/java/zone/moddev/mc/poweradvantage/math/Integer2D.java
rename to src/main/java/zone/moddev/mc/basepower/math/Integer2D.java
index 71dd3ab..c38d137 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/math/Integer2D.java
+++ b/src/main/java/zone/moddev/mc/basepower/math/Integer2D.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.math;
+package zone.moddev.mc.basepower.math;
/**
* This class is used to store 2D integer coordinates
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/math/package-info.java b/src/main/java/zone/moddev/mc/basepower/math/package-info.java
similarity index 55%
rename from src/main/java/zone/moddev/mc/poweradvantage/math/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/math/package-info.java
index 72c1ee2..2ec83a0 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/math/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/math/package-info.java
@@ -3,4 +3,4 @@
This package contains helper classes.
*/
-package zone.moddev.mc.poweradvantage.math;
\ No newline at end of file
+package zone.moddev.mc.basepower.math;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/package-info.java b/src/main/java/zone/moddev/mc/basepower/package-info.java
similarity index 81%
rename from src/main/java/zone/moddev/mc/poweradvantage/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/package-info.java
index b594f49..e4cdd20 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/package-info.java
@@ -2,4 +2,4 @@
This package contains the main mod class. If you are making an add-on mod, you probably want to use
classes from the cyano.poweradvantage.api.simple package
*/
-package zone.moddev.mc.poweradvantage;
\ No newline at end of file
+package zone.moddev.mc.basepower;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/FuelRegistry.java b/src/main/java/zone/moddev/mc/basepower/registry/FuelRegistry.java
similarity index 98%
rename from src/main/java/zone/moddev/mc/poweradvantage/registry/FuelRegistry.java
rename to src/main/java/zone/moddev/mc/basepower/registry/FuelRegistry.java
index 5c33b28..d93cbbb 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/registry/FuelRegistry.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/FuelRegistry.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.registry;
+package zone.moddev.mc.basepower.registry;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
@@ -13,7 +13,7 @@
/**
* The fuel registry keeps track of the cooking time for new burnables added by PowerAdvantage. The
- * actual registration of these burnables occurs in zone.moddev.mc.poweradvantage.init.Fuels
+ * actual registration of these burnables occurs in zone.moddev.mc.basepower.init.Fuels
* @author DrCyano
*
*/
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/MachineGUIRegistry.java b/src/main/java/zone/moddev/mc/basepower/registry/MachineGUIRegistry.java
similarity index 98%
rename from src/main/java/zone/moddev/mc/poweradvantage/registry/MachineGUIRegistry.java
rename to src/main/java/zone/moddev/mc/basepower/registry/MachineGUIRegistry.java
index 5e27461..39d8181 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/registry/MachineGUIRegistry.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/MachineGUIRegistry.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.registry;
+package zone.moddev.mc.basepower.registry;
import com.mcmoddev.poweradvantage.registry.ITileEntityGUI;
import net.minecraft.block.Block;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/package-info.java b/src/main/java/zone/moddev/mc/basepower/registry/package-info.java
similarity index 67%
rename from src/main/java/zone/moddev/mc/poweradvantage/registry/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/registry/package-info.java
index d71055e..d22177c 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/registry/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/package-info.java
@@ -2,4 +2,4 @@
This package contains registry classes for registering content related to
PowerAdvantage.
*/
-package zone.moddev.mc.poweradvantage.registry;
\ No newline at end of file
+package zone.moddev.mc.basepower.registry;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipe.java b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipe.java
similarity index 98%
rename from src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipe.java
rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipe.java
index ff05f5d..3ff6029 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipe.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipe.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.registry.still.recipe;
+package zone.moddev.mc.basepower.registry.still.recipe;
import java.util.Collection;
import java.util.LinkedList;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipeRegistry.java b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipeRegistry.java
similarity index 98%
rename from src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipeRegistry.java
rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipeRegistry.java
index 7ba51d7..8c9d572 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipeRegistry.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipeRegistry.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.registry.still.recipe;
+package zone.moddev.mc.basepower.registry.still.recipe;
import java.util.ArrayList;
import java.util.HashMap;
@@ -7,7 +7,7 @@
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/ExplicitFluidReference.java b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/ExplicitFluidReference.java
similarity index 96%
rename from src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/ExplicitFluidReference.java
rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/ExplicitFluidReference.java
index 0f1884d..fc1a706 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/ExplicitFluidReference.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/ExplicitFluidReference.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.registry.still.recipe;
+package zone.moddev.mc.basepower.registry.still.recipe;
import net.minecraftforge.fluids.Fluid;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/FluidReference.java b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/FluidReference.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/FluidReference.java
rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/FluidReference.java
index 76d58c7..e5ef703 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/FluidReference.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/FluidReference.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.registry.still.recipe;
+package zone.moddev.mc.basepower.registry.still.recipe;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/RegistryNameFluidReference.java b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/RegistryNameFluidReference.java
similarity index 96%
rename from src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/RegistryNameFluidReference.java
rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/RegistryNameFluidReference.java
index 3f79a4d..afb9582 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/RegistryNameFluidReference.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/RegistryNameFluidReference.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.registry.still.recipe;
+package zone.moddev.mc.basepower.registry.still.recipe;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/HashCodeHelper.java b/src/main/java/zone/moddev/mc/basepower/util/HashCodeHelper.java
similarity index 96%
rename from src/main/java/zone/moddev/mc/poweradvantage/util/HashCodeHelper.java
rename to src/main/java/zone/moddev/mc/basepower/util/HashCodeHelper.java
index efed636..c7b3a12 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/util/HashCodeHelper.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/HashCodeHelper.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
public abstract class HashCodeHelper {
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/InventoryWrapper.java b/src/main/java/zone/moddev/mc/basepower/util/InventoryWrapper.java
similarity index 99%
rename from src/main/java/zone/moddev/mc/poweradvantage/util/InventoryWrapper.java
rename to src/main/java/zone/moddev/mc/basepower/util/InventoryWrapper.java
index 3e1ab8a..df56f7c 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/util/InventoryWrapper.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/InventoryWrapper.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/PowerHelper.java b/src/main/java/zone/moddev/mc/basepower/util/PowerHelper.java
similarity index 94%
rename from src/main/java/zone/moddev/mc/poweradvantage/util/PowerHelper.java
rename to src/main/java/zone/moddev/mc/basepower/util/PowerHelper.java
index 726c661..fe3c9a7 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/util/PowerHelper.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/PowerHelper.java
@@ -1,7 +1,7 @@
-package zone.moddev.mc.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
import cofh.api.energy.IEnergyReceiver;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import cyano.poweradvantage.api.ITypedConduit;
import cyano.poweradvantage.api.PowerConnectorContext;
import net.minecraft.block.ITileEntityProvider;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleHashMap.java b/src/main/java/zone/moddev/mc/basepower/util/ReversibleHashMap.java
similarity index 97%
rename from src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleHashMap.java
rename to src/main/java/zone/moddev/mc/basepower/util/ReversibleHashMap.java
index 5e386d1..770ff7d 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleHashMap.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/ReversibleHashMap.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
import java.util.Collection;
import java.util.Map;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleMap.java b/src/main/java/zone/moddev/mc/basepower/util/ReversibleMap.java
similarity index 81%
rename from src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleMap.java
rename to src/main/java/zone/moddev/mc/basepower/util/ReversibleMap.java
index d8b39b0..fce0f4c 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleMap.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/ReversibleMap.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
public interface ReversibleMap extends java.util.Map {
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/package-info.java b/src/main/java/zone/moddev/mc/basepower/util/package-info.java
similarity index 55%
rename from src/main/java/zone/moddev/mc/poweradvantage/util/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/util/package-info.java
index 8346da0..e2fb4a0 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/util/package-info.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/package-info.java
@@ -3,4 +3,4 @@
This package contains helper classes.
*/
-package zone.moddev.mc.poweradvantage.util;
\ No newline at end of file
+package zone.moddev.mc.basepower.util;
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Entities.java b/src/main/java/zone/moddev/mc/poweradvantage/init/Entities.java
deleted file mode 100644
index 0dc2901..0000000
--- a/src/main/java/zone/moddev/mc/poweradvantage/init/Entities.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package zone.moddev.mc.poweradvantage.init;
-
-import net.minecraftforge.fml.common.registry.GameRegistry;
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
-import zone.moddev.mc.poweradvantage.machines.conveyors.*;
-import zone.moddev.mc.poweradvantage.machines.creative.InfiniteEnergyTileEntity;
-import zone.moddev.mc.poweradvantage.machines.fluidmachines.*;
-import zone.moddev.mc.poweradvantage.machines.fluidmachines.modsupport.TerminalFluidPipeTileEntity;
-
-public abstract class Entities {
-
-
- private static boolean initDone = false;
-
- public static void init() {
- if (initDone) return;
-
- Blocks.init();
-
- GameRegistry.registerTileEntity(TerminalFluidPipeTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "pipe_terminal");
- GameRegistry.registerTileEntity(FluidDrainTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_drain");
- GameRegistry.registerTileEntity(FluidDischargeTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_discharge");
- GameRegistry.registerTileEntity(StorageTankTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_storage_tank");
- GameRegistry.registerTileEntity(MetalTankTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_metal_tank");
- GameRegistry.registerTileEntity(StillTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "still");
- GameRegistry.registerTileEntity(TileEntityConveyor.class, PowerAdvantage.MODID + "." + "item_conveyor");
- GameRegistry.registerTileEntity(TileEntityBlockFilter.class, PowerAdvantage.MODID + "." + "item_filter_block");
- GameRegistry.registerTileEntity(TileEntityFoodFilter.class, PowerAdvantage.MODID + "." + "item_filter_food");
- GameRegistry.registerTileEntity(TileEntityFuelFilter.class, PowerAdvantage.MODID + "." + "item_filter_fuel");
- GameRegistry.registerTileEntity(TileEntityInventoryFilter.class, PowerAdvantage.MODID + "." + "item_filter_inventory");
- GameRegistry.registerTileEntity(TileEntityOreFilter.class, PowerAdvantage.MODID + "." + "item_filter_ore");
- GameRegistry.registerTileEntity(TileEntityPlantFilter.class, PowerAdvantage.MODID + "." + "item_filter_plant");
- GameRegistry.registerTileEntity(TileEntitySmeltableFilter.class, PowerAdvantage.MODID + "." + "item_filter_smelt");
- GameRegistry.registerTileEntity(TileEntityOverflowFilter.class, PowerAdvantage.MODID + "." + "item_filter_overflow");
-
- GameRegistry.registerTileEntity(InfiniteEnergyTileEntity.class, PowerAdvantage.MODID + "." + "infinite_energy_source");
-
- initDone = true;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/package-info.java b/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/package-info.java
deleted file mode 100644
index 7bde542..0000000
--- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/package-info.java
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
-
-This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API.
-If you are writing an add-on mod, use the code in this package for reference, but you should not
-depend on it's implementation details as future updates might change them. For a better way to get
-PowerAdvantage content, look in the zone.moddev.mc.poweradvantage.init package.
-
-Because these classes are not part of the API, they are not well documented. They were only meant
-for the eyes of the mod author(s).
-
-*/
-package zone.moddev.mc.poweradvantage.machines.fluidmachines;
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/converter_rf_electricity.json b/src/main/resources/assets/basepower/blockstates/converter_rf_electricity.json
new file mode 100644
index 0000000..c1651bf
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/converter_rf_electricity.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:converter_rf_electricity", "y": 90 },
+ "facing=north": { "model": "basepower:converter_rf_electricity" },
+ "facing=south": { "model": "basepower:converter_rf_electricity", "y": 180 },
+ "facing=west": { "model": "basepower:converter_rf_electricity", "y": 270 }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/converter_rf_quantum.json b/src/main/resources/assets/basepower/blockstates/converter_rf_quantum.json
new file mode 100644
index 0000000..ee86021
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/converter_rf_quantum.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:converter_rf_quantum", "y": 90 },
+ "facing=north": { "model": "basepower:converter_rf_quantum" },
+ "facing=south": { "model": "basepower:converter_rf_quantum", "y": 180 },
+ "facing=west": { "model": "basepower:converter_rf_quantum", "y": 270 }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/converter_rf_steam.json b/src/main/resources/assets/basepower/blockstates/converter_rf_steam.json
new file mode 100644
index 0000000..d27391c
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/converter_rf_steam.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:converter_rf_steam", "y": 90 },
+ "facing=north": { "model": "basepower:converter_rf_steam" },
+ "facing=south": { "model": "basepower:converter_rf_steam", "y": 180 },
+ "facing=west": { "model": "basepower:converter_rf_steam", "y": 270 }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/converter_tr_electricity.json b/src/main/resources/assets/basepower/blockstates/converter_tr_electricity.json
new file mode 100644
index 0000000..499b875
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/converter_tr_electricity.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:converter_tr_electricity", "y": 90 },
+ "facing=north": { "model": "basepower:converter_tr_electricity" },
+ "facing=south": { "model": "basepower:converter_tr_electricity", "y": 180 },
+ "facing=west": { "model": "basepower:converter_tr_electricity", "y": 270 }
+ }
+}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/crude_oil.json b/src/main/resources/assets/basepower/blockstates/crude_oil.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/blockstates/crude_oil.json
rename to src/main/resources/assets/basepower/blockstates/crude_oil.json
diff --git a/src/main/resources/assets/basepower/blockstates/fluid_discharge.json b/src/main/resources/assets/basepower/blockstates/fluid_discharge.json
new file mode 100644
index 0000000..e8b811c
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/fluid_discharge.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:fluid_discharge", "y": 90 },
+ "facing=north": { "model": "basepower:fluid_discharge" },
+ "facing=south": { "model": "basepower:fluid_discharge", "y": 180 },
+ "facing=west": { "model": "basepower:fluid_discharge", "y": 270 }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/fluid_drain.json b/src/main/resources/assets/basepower/blockstates/fluid_drain.json
new file mode 100644
index 0000000..7dc40c7
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/fluid_drain.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:fluid_drain", "y": 90 },
+ "facing=north": { "model": "basepower:fluid_drain" },
+ "facing=south": { "model": "basepower:fluid_drain", "y": 180 },
+ "facing=west": { "model": "basepower:fluid_drain", "y": 270 }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/fluid_metal_tank.json b/src/main/resources/assets/basepower/blockstates/fluid_metal_tank.json
new file mode 100644
index 0000000..11898d2
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/fluid_metal_tank.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:fluid_metal_tank", "y": 90, "uvlock": true },
+ "facing=north": { "model": "basepower:fluid_metal_tank", "uvlock": true },
+ "facing=south": { "model": "basepower:fluid_metal_tank", "y": 180, "uvlock": true },
+ "facing=west": { "model": "basepower:fluid_metal_tank", "y": 270, "uvlock": true }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/fluid_pipe.json b/src/main/resources/assets/basepower/blockstates/fluid_pipe.json
new file mode 100644
index 0000000..846b1b7
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/fluid_pipe.json
@@ -0,0 +1,70 @@
+{
+ "__comment": "blockstate parameters MUST be in alphabetical order!",
+ "variants": {
+ "down=false,east=false,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false },
+ "down=true,east=false,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 90, "y": 0, "uvlock": false },
+ "down=false,east=true,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=false,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=false,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 180, "uvlock": false },
+ "down=false,east=false,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_n", "x": 270, "y": 0, "uvlock": false },
+ "down=false,east=false,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 270, "uvlock": false },
+ "down=true,east=true,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 180, "uvlock": false },
+ "down=true,east=false,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 90, "uvlock": false },
+ "down=true,east=false,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 270, "uvlock": false },
+ "down=true,east=false,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_ns", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=false,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 0, "uvlock": false },
+ "down=false,east=true,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=true,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 180, "uvlock": false },
+ "down=false,east=true,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 180, "uvlock": false },
+ "down=false,east=true,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_ns", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=false,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_ns", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=false,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 90, "uvlock": false },
+ "down=false,east=false,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=false,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 270, "uvlock": false },
+ "down=false,east=false,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 270, "uvlock": false },
+ "down=false,east=false,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 0, "uvlock": false },
+ "down=true,east=true,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 90, "uvlock": false },
+ "down=true,east=true,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 180, "uvlock": false },
+ "down=true,east=true,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 90, "uvlock": false },
+ "down=true,east=true,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 90, "y": 90, "uvlock": false },
+ "down=true,east=false,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=false,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 0, "uvlock": false },
+ "down=true,east=false,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=false,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 180, "uvlock": false },
+ "down=true,east=false,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 270, "uvlock": false },
+ "down=true,east=false,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 270, "uvlock": false },
+ "down=false,east=true,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 180, "uvlock": false },
+ "down=false,east=true,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=true,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=true,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 180, "uvlock": false },
+ "down=false,east=true,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 270, "uvlock": false },
+ "down=false,east=true,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 270, "y": 90, "uvlock": false },
+ "down=false,east=false,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 270, "y": 0, "uvlock": false },
+ "down=false,east=false,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=false,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=false,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 270, "uvlock": false },
+ "down=true,east=true,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 180, "uvlock": false },
+ "down=true,east=true,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 90, "uvlock": false },
+ "down=true,east=true,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 90, "uvlock": false },
+ "down=true,east=true,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 180, "uvlock": false },
+ "down=true,east=true,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 270, "uvlock": false },
+ "down=true,east=true,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_ensw", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=false,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_ensw", "x": 90, "y": 90, "uvlock": false },
+ "down=true,east=false,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 0, "uvlock": false },
+ "down=true,east=false,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=false,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 270, "uvlock": false },
+ "down=false,east=true,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 180, "uvlock": false },
+ "down=false,east=true,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=true,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=true,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 270, "uvlock": false },
+ "down=false,east=false,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 0, "uvlock": false },
+ "down=true,east=true,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 270, "uvlock": false },
+ "down=true,east=true,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 270, "y": 0, "uvlock": false },
+ "down=true,east=true,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 180, "uvlock": false },
+ "down=true,east=true,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 0, "uvlock": false },
+ "down=true,east=false,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=true,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=true,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_densuw", "x": 0, "y": 0, "uvlock": false }
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/fluid_pipe_terminal.json b/src/main/resources/assets/basepower/blockstates/fluid_pipe_terminal.json
new file mode 100644
index 0000000..51f7d5d
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/fluid_pipe_terminal.json
@@ -0,0 +1,70 @@
+{
+ "__comment": "blockstate parameters MUST be in alphabetical order!",
+ "variants": {
+ "down=false,east=false,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_0", "x": 0, "y": 0, "uvlock": false },
+ "down=true,east=false,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 90, "y": 0, "uvlock": false },
+ "down=false,east=true,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=false,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=false,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 180, "uvlock": false },
+ "down=false,east=false,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_n", "x": 270, "y": 0, "uvlock": false },
+ "down=false,east=false,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 270, "uvlock": false },
+ "down=true,east=true,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 180, "uvlock": false },
+ "down=true,east=false,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 90, "uvlock": false },
+ "down=true,east=false,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 270, "uvlock": false },
+ "down=true,east=false,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_ns", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=false,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 0, "uvlock": false },
+ "down=false,east=true,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=true,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 180, "uvlock": false },
+ "down=false,east=true,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 180, "uvlock": false },
+ "down=false,east=true,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_ns", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=false,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_ns", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=false,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 90, "uvlock": false },
+ "down=false,east=false,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=false,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 270, "uvlock": false },
+ "down=false,east=false,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 270, "uvlock": false },
+ "down=false,east=false,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 0, "uvlock": false },
+ "down=true,east=true,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 90, "uvlock": false },
+ "down=true,east=true,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 180, "uvlock": false },
+ "down=true,east=true,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 90, "uvlock": false },
+ "down=true,east=true,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 90, "y": 90, "uvlock": false },
+ "down=true,east=false,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=false,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 0, "uvlock": false },
+ "down=true,east=false,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=false,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 180, "uvlock": false },
+ "down=true,east=false,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 270, "uvlock": false },
+ "down=true,east=false,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 270, "uvlock": false },
+ "down=false,east=true,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 180, "uvlock": false },
+ "down=false,east=true,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=true,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=true,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 180, "uvlock": false },
+ "down=false,east=true,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 270, "uvlock": false },
+ "down=false,east=true,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 270, "y": 90, "uvlock": false },
+ "down=false,east=false,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 270, "y": 0, "uvlock": false },
+ "down=false,east=false,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=false,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=false,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 270, "uvlock": false },
+ "down=true,east=true,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 180, "uvlock": false },
+ "down=true,east=true,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 90, "uvlock": false },
+ "down=true,east=true,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 90, "uvlock": false },
+ "down=true,east=true,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 180, "uvlock": false },
+ "down=true,east=true,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 270, "uvlock": false },
+ "down=true,east=true,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_ensw", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=false,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_ensw", "x": 90, "y": 90, "uvlock": false },
+ "down=true,east=false,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 0, "uvlock": false },
+ "down=true,east=false,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=false,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 270, "uvlock": false },
+ "down=false,east=true,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 180, "uvlock": false },
+ "down=false,east=true,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false },
+ "down=false,east=true,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=true,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 270, "uvlock": false },
+ "down=false,east=false,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 0, "uvlock": false },
+ "down=true,east=true,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 270, "uvlock": false },
+ "down=true,east=true,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 270, "y": 0, "uvlock": false },
+ "down=true,east=true,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 180, "uvlock": false },
+ "down=true,east=true,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 0, "uvlock": false },
+ "down=true,east=false,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 90, "uvlock": false },
+ "down=false,east=true,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 90, "y": 0, "uvlock": false },
+ "down=true,east=true,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_densuw", "x": 0, "y": 0, "uvlock": false }
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/fluid_storage_tank.json b/src/main/resources/assets/basepower/blockstates/fluid_storage_tank.json
new file mode 100644
index 0000000..8de4840
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/fluid_storage_tank.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:fluid_storage_tank", "y": 90 },
+ "facing=north": { "model": "basepower:fluid_storage_tank" },
+ "facing=south": { "model": "basepower:fluid_storage_tank", "y": 180 },
+ "facing=west": { "model": "basepower:fluid_storage_tank", "y": 270 }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/fluid_switch.json b/src/main/resources/assets/basepower/blockstates/fluid_switch.json
new file mode 100644
index 0000000..c716e08
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/fluid_switch.json
@@ -0,0 +1,6 @@
+{
+ "variants": {
+ "active=false": { "model": "basepower:fluid_switch_off"},
+ "active=true": { "model": "basepower:fluid_switch_on"}
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/infinite_electricity.json b/src/main/resources/assets/basepower/blockstates/infinite_electricity.json
new file mode 100644
index 0000000..f2d91b3
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/infinite_electricity.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:infinite_electricity", "y": 90 },
+ "facing=north": { "model": "basepower:infinite_electricity" },
+ "facing=south": { "model": "basepower:infinite_electricity", "y": 180 },
+ "facing=west": { "model": "basepower:infinite_electricity", "y": 270 }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/infinite_quantum.json b/src/main/resources/assets/basepower/blockstates/infinite_quantum.json
new file mode 100644
index 0000000..4c349cc
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/infinite_quantum.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:infinite_quantum", "y": 90 },
+ "facing=north": { "model": "basepower:infinite_quantum" },
+ "facing=south": { "model": "basepower:infinite_quantum", "y": 180 },
+ "facing=west": { "model": "basepower:infinite_quantum", "y": 270 }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/infinite_steam.json b/src/main/resources/assets/basepower/blockstates/infinite_steam.json
new file mode 100644
index 0000000..2a5080a
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/infinite_steam.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=east": { "model": "basepower:infinite_steam", "y": 90 },
+ "facing=north": { "model": "basepower:infinite_steam" },
+ "facing=south": { "model": "basepower:infinite_steam", "y": 180 },
+ "facing=west": { "model": "basepower:infinite_steam", "y": 270 }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/item_conveyor.json b/src/main/resources/assets/basepower/blockstates/item_conveyor.json
new file mode 100644
index 0000000..f192d11
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/item_conveyor.json
@@ -0,0 +1,10 @@
+{
+ "variants": {
+ "facing=down": { "model": "basepower:item_conveyor", "x": 90 },
+ "facing=up": { "model": "basepower:item_conveyor", "x": 270 },
+ "facing=north": { "model": "basepower:item_conveyor" },
+ "facing=south": { "model": "basepower:item_conveyor", "y": 180 },
+ "facing=west": { "model": "basepower:item_conveyor", "y": 270 },
+ "facing=east": { "model": "basepower:item_conveyor", "y": 90 }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_block.json b/src/main/resources/assets/basepower/blockstates/item_filter_block.json
new file mode 100644
index 0000000..286caf4
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/item_filter_block.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=north": { "model": "basepower:item_filter_block" },
+ "facing=south": { "model": "basepower:item_filter_block", "y": 180 },
+ "facing=west": { "model": "basepower:item_filter_block", "y": 270 },
+ "facing=east": { "model": "basepower:item_filter_block", "y": 90 }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_food.json b/src/main/resources/assets/basepower/blockstates/item_filter_food.json
new file mode 100644
index 0000000..8b6be87
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/item_filter_food.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=north": { "model": "basepower:item_filter_food" },
+ "facing=south": { "model": "basepower:item_filter_food", "y": 180 },
+ "facing=west": { "model": "basepower:item_filter_food", "y": 270 },
+ "facing=east": { "model": "basepower:item_filter_food", "y": 90 }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_fuel.json b/src/main/resources/assets/basepower/blockstates/item_filter_fuel.json
new file mode 100644
index 0000000..c73e9e6
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/item_filter_fuel.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=north": { "model": "basepower:item_filter_fuel" },
+ "facing=south": { "model": "basepower:item_filter_fuel", "y": 180 },
+ "facing=west": { "model": "basepower:item_filter_fuel", "y": 270 },
+ "facing=east": { "model": "basepower:item_filter_fuel", "y": 90 }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_inventory.json b/src/main/resources/assets/basepower/blockstates/item_filter_inventory.json
new file mode 100644
index 0000000..d446b80
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/item_filter_inventory.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=north": { "model": "basepower:item_filter_inventory" },
+ "facing=south": { "model": "basepower:item_filter_inventory", "y": 180 },
+ "facing=west": { "model": "basepower:item_filter_inventory", "y": 270 },
+ "facing=east": { "model": "basepower:item_filter_inventory", "y": 90 }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_ore.json b/src/main/resources/assets/basepower/blockstates/item_filter_ore.json
new file mode 100644
index 0000000..48007b4
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/item_filter_ore.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=north": { "model": "basepower:item_filter_ore" },
+ "facing=south": { "model": "basepower:item_filter_ore", "y": 180 },
+ "facing=west": { "model": "basepower:item_filter_ore", "y": 270 },
+ "facing=east": { "model": "basepower:item_filter_ore", "y": 90 }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_overflow.json b/src/main/resources/assets/basepower/blockstates/item_filter_overflow.json
new file mode 100644
index 0000000..3e7aaa3
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/item_filter_overflow.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=north": { "model": "basepower:item_filter_overflow" },
+ "facing=south": { "model": "basepower:item_filter_overflow", "y": 180 },
+ "facing=west": { "model": "basepower:item_filter_overflow", "y": 270 },
+ "facing=east": { "model": "basepower:item_filter_overflow", "y": 90 }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_plant.json b/src/main/resources/assets/basepower/blockstates/item_filter_plant.json
new file mode 100644
index 0000000..b1a03d5
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/item_filter_plant.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=north": { "model": "basepower:item_filter_plant" },
+ "facing=south": { "model": "basepower:item_filter_plant", "y": 180 },
+ "facing=west": { "model": "basepower:item_filter_plant", "y": 270 },
+ "facing=east": { "model": "basepower:item_filter_plant", "y": 90 }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_smelt.json b/src/main/resources/assets/basepower/blockstates/item_filter_smelt.json
new file mode 100644
index 0000000..9a740fb
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/item_filter_smelt.json
@@ -0,0 +1,8 @@
+{
+ "variants": {
+ "facing=north": { "model": "basepower:item_filter_smelt" },
+ "facing=south": { "model": "basepower:item_filter_smelt", "y": 180 },
+ "facing=west": { "model": "basepower:item_filter_smelt", "y": 270 },
+ "facing=east": { "model": "basepower:item_filter_smelt", "y": 90 }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/refined_oil.json b/src/main/resources/assets/basepower/blockstates/refined_oil.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/blockstates/refined_oil.json
rename to src/main/resources/assets/basepower/blockstates/refined_oil.json
diff --git a/src/main/resources/assets/basepower/blockstates/steel_frame.json b/src/main/resources/assets/basepower/blockstates/steel_frame.json
new file mode 100644
index 0000000..7b402a8
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/steel_frame.json
@@ -0,0 +1,5 @@
+{
+ "variants": {
+ "normal": { "model": "basepower:steel_frame" }
+ }
+}
diff --git a/src/main/resources/assets/basepower/blockstates/still.json b/src/main/resources/assets/basepower/blockstates/still.json
new file mode 100644
index 0000000..4856ead
--- /dev/null
+++ b/src/main/resources/assets/basepower/blockstates/still.json
@@ -0,0 +1,12 @@
+{
+ "variants": {
+ "active=false,facing=east": { "model": "basepower:still_off", "y": 90 },
+ "active=false,facing=north": { "model": "basepower:still_off"},
+ "active=false,facing=south": { "model": "basepower:still_off", "y": 180},
+ "active=false,facing=west": { "model": "basepower:still_off", "y": 270},
+ "active=true,facing=east": { "model": "basepower:still_on", "y": 90 },
+ "active=true,facing=north": { "model": "basepower:still_on"},
+ "active=true,facing=south": { "model": "basepower:still_on", "y": 180},
+ "active=true,facing=west": { "model": "basepower:still_on", "y": 270}
+ }
+}
diff --git a/src/main/resources/assets/basepower/lang/de_DE.lang b/src/main/resources/assets/basepower/lang/de_DE.lang
new file mode 100644
index 0000000..beab6a8
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/de_DE.lang
@@ -0,0 +1,55 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Große Ofen (formlos)
+nei.basepower.recipehandler.shapedfurnace.name=Große Ofen (geformt)
+
+tooltip.basepower.empty=Leer
+tooltip.basepower.buckets_of=%x Eimer %y
+
+itemGroup.basepower=Leistungsvorteil
+
+tile.basepower.fluid_drain.name=Ablauf
+tile.basepower.fluid_discharge.name=Austragsrost
+tile.basepower.fluid_storage_tank.name=Lagertank
+item.basepower.fluid_storage_tank_item.name=Speicher
+tile.basepower.fluid_pipe.name=Rohr
+
+tile.basepower.item_conveyor.name=Förderer
+tile.basepower.item_filter_block.name=Block Auswahl Förder
+tile.basepower.item_filter_food.name=Lebensmittel Auswahl Förder
+tile.basepower.item_filter_fuel.name=Brennstoff Auswahl Förder
+tile.basepower.item_filter_inventory.name=Anpassbare Auswahl Förder
+tile.basepower.item_filter_ore.name=Erz Auswahl Förder
+tile.basepower.item_filter_plant.name=Pflanze Auswahl Förder
+tile.basepower.item_filter_smelt.name=Kochbare Auswahl Förder
+tile.basepower.item_filter_overflow.name=Überlauf Auswahl Förder
+tile.basepower.steel_frame.name=Stahlrahmen
+
+
+item.basepower.starch.name=Kartoffelstärke
+item.basepower.bioplastic_ingot.name=Biokunststoff-Barren
+item.basepower.sprocket.name=Kettenrad
+
+
+tile.basepower.fluid_metal_tank.name=Metall-Lagertank
+item.basepower.rotator_tool.name=Drehwerkzeug
+
+tile.basepower.infinite_steam.name=Unendlichen Dampfkraft
+tile.basepower.infinite_electricity.name=Unendliche Elektrische Leistung
+tile.basepower.infinite_quantum.name=Unendliche Quanten Leistung
+
+tile.basepower.crude_oil.name=Rohöl
+fluid.basepower.crude_oil=Rohöl
+item.bucket.crude_oil=Eimer Rohöl
+
+
+tile.basepower.still.name=Brennerei
+
+tile.basepower.refined_oil.name=Raffiniertes Öl
+fluid.basepower.refined_oil=Raffiniertes Öl
+item.bucket.refined_oil=Eimer für Raffiniertes Öl
+tile.basepower.fluid_switch.name=Ventil
+
+tile.basepower.converter_rf_steam.name=Dampf-RF Leistungstransformator
+tile.basepower.converter_rf_electricity.name=Elektrizität-RF Leistungstransformator
+tile.basepower.converter_rf_quantum.name=Quant-RF Leistungstransformator
+tile.basepower.converter_tr_electricity.name=Elektrizität-EU Leistungstransformator
diff --git a/src/main/resources/assets/basepower/lang/en_AU.lang b/src/main/resources/assets/basepower/lang/en_AU.lang
new file mode 100644
index 0000000..650bf54
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/en_AU.lang
@@ -0,0 +1,54 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
+nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
+
+tooltip.basepower.empty=Empty
+tooltip.basepower.buckets_of=%x buckets of %y
+
+itemGroup.basepower=basePower
+
+tile.basepower.fluid_drain.name=Drain
+tile.basepower.fluid_discharge.name=Discharge Grate
+tile.basepower.fluid_storage_tank.name=Portable Fluid Tank
+item.basepower.fluid_storage_tank_item.name=Storage Tank
+tile.basepower.fluid_pipe.name=Pipe
+
+tile.basepower.item_conveyor.name=Conveyor
+tile.basepower.item_filter_block.name=Block Filter Conveyor
+tile.basepower.item_filter_food.name=Food Filter Conveyor
+tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor
+tile.basepower.item_filter_inventory.name=Filter Conveyor
+tile.basepower.item_filter_ore.name=Ore Filter Conveyor
+tile.basepower.item_filter_plant.name=Plantable Filter Conveyor
+tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor
+tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor
+tile.basepower.steel_frame.name=Steel Frame
+
+
+item.basepower.starch.name=Starch
+item.basepower.bioplastic_ingot.name=Bioplastic Ingot
+item.basepower.sprocket.name=Sprocket
+
+tile.basepower.fluid_metal_tank.name=Metal Fluid Tank
+item.basepower.rotator_tool.name=Rotation Wrench
+
+tile.basepower.infinite_steam.name=Unlimited Steam Power
+tile.basepower.infinite_electricity.name=Unlimited Electrical Power
+tile.basepower.infinite_quantum.name=Unlimited Quantum Power
+
+tile.basepower.crude_oil.name=Crude Oil
+fluid.basepower.crude_oil=Crude Oil
+item.bucket.crude_oil=Bucket of Crude Oil
+
+
+tile.basepower.still.name=Distillation Furnace
+
+tile.basepower.refined_oil.name=Refined Oil
+fluid.basepower.refined_oil=Refined Oil
+item.bucket.refined_oil=Bucket of Refined Oil
+tile.basepower.fluid_switch.name=Fluid Switch Valve
+
+tile.basepower.converter_rf_steam.name=Steam-RF Transformer
+tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer
+tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer
+tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/basepower/lang/en_CA.lang b/src/main/resources/assets/basepower/lang/en_CA.lang
new file mode 100644
index 0000000..650bf54
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/en_CA.lang
@@ -0,0 +1,54 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
+nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
+
+tooltip.basepower.empty=Empty
+tooltip.basepower.buckets_of=%x buckets of %y
+
+itemGroup.basepower=basePower
+
+tile.basepower.fluid_drain.name=Drain
+tile.basepower.fluid_discharge.name=Discharge Grate
+tile.basepower.fluid_storage_tank.name=Portable Fluid Tank
+item.basepower.fluid_storage_tank_item.name=Storage Tank
+tile.basepower.fluid_pipe.name=Pipe
+
+tile.basepower.item_conveyor.name=Conveyor
+tile.basepower.item_filter_block.name=Block Filter Conveyor
+tile.basepower.item_filter_food.name=Food Filter Conveyor
+tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor
+tile.basepower.item_filter_inventory.name=Filter Conveyor
+tile.basepower.item_filter_ore.name=Ore Filter Conveyor
+tile.basepower.item_filter_plant.name=Plantable Filter Conveyor
+tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor
+tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor
+tile.basepower.steel_frame.name=Steel Frame
+
+
+item.basepower.starch.name=Starch
+item.basepower.bioplastic_ingot.name=Bioplastic Ingot
+item.basepower.sprocket.name=Sprocket
+
+tile.basepower.fluid_metal_tank.name=Metal Fluid Tank
+item.basepower.rotator_tool.name=Rotation Wrench
+
+tile.basepower.infinite_steam.name=Unlimited Steam Power
+tile.basepower.infinite_electricity.name=Unlimited Electrical Power
+tile.basepower.infinite_quantum.name=Unlimited Quantum Power
+
+tile.basepower.crude_oil.name=Crude Oil
+fluid.basepower.crude_oil=Crude Oil
+item.bucket.crude_oil=Bucket of Crude Oil
+
+
+tile.basepower.still.name=Distillation Furnace
+
+tile.basepower.refined_oil.name=Refined Oil
+fluid.basepower.refined_oil=Refined Oil
+item.bucket.refined_oil=Bucket of Refined Oil
+tile.basepower.fluid_switch.name=Fluid Switch Valve
+
+tile.basepower.converter_rf_steam.name=Steam-RF Transformer
+tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer
+tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer
+tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/basepower/lang/en_EN.lang b/src/main/resources/assets/basepower/lang/en_EN.lang
new file mode 100644
index 0000000..650bf54
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/en_EN.lang
@@ -0,0 +1,54 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
+nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
+
+tooltip.basepower.empty=Empty
+tooltip.basepower.buckets_of=%x buckets of %y
+
+itemGroup.basepower=basePower
+
+tile.basepower.fluid_drain.name=Drain
+tile.basepower.fluid_discharge.name=Discharge Grate
+tile.basepower.fluid_storage_tank.name=Portable Fluid Tank
+item.basepower.fluid_storage_tank_item.name=Storage Tank
+tile.basepower.fluid_pipe.name=Pipe
+
+tile.basepower.item_conveyor.name=Conveyor
+tile.basepower.item_filter_block.name=Block Filter Conveyor
+tile.basepower.item_filter_food.name=Food Filter Conveyor
+tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor
+tile.basepower.item_filter_inventory.name=Filter Conveyor
+tile.basepower.item_filter_ore.name=Ore Filter Conveyor
+tile.basepower.item_filter_plant.name=Plantable Filter Conveyor
+tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor
+tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor
+tile.basepower.steel_frame.name=Steel Frame
+
+
+item.basepower.starch.name=Starch
+item.basepower.bioplastic_ingot.name=Bioplastic Ingot
+item.basepower.sprocket.name=Sprocket
+
+tile.basepower.fluid_metal_tank.name=Metal Fluid Tank
+item.basepower.rotator_tool.name=Rotation Wrench
+
+tile.basepower.infinite_steam.name=Unlimited Steam Power
+tile.basepower.infinite_electricity.name=Unlimited Electrical Power
+tile.basepower.infinite_quantum.name=Unlimited Quantum Power
+
+tile.basepower.crude_oil.name=Crude Oil
+fluid.basepower.crude_oil=Crude Oil
+item.bucket.crude_oil=Bucket of Crude Oil
+
+
+tile.basepower.still.name=Distillation Furnace
+
+tile.basepower.refined_oil.name=Refined Oil
+fluid.basepower.refined_oil=Refined Oil
+item.bucket.refined_oil=Bucket of Refined Oil
+tile.basepower.fluid_switch.name=Fluid Switch Valve
+
+tile.basepower.converter_rf_steam.name=Steam-RF Transformer
+tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer
+tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer
+tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/basepower/lang/en_GB.lang b/src/main/resources/assets/basepower/lang/en_GB.lang
new file mode 100644
index 0000000..2490aec
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/en_GB.lang
@@ -0,0 +1,53 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
+nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
+
+tooltip.basepower.empty=Empty
+tooltip.basepower.buckets_of=%x buckets of %y
+
+itemGroup.basepower=basePower
+
+tile.basepower.fluid_drain.name=Drain
+tile.basepower.fluid_discharge.name=Discharge Grate
+tile.basepower.fluid_storage_tank.name=Portable Fluid Tank
+item.basepower.fluid_storage_tank_item.name=Storage Tank
+tile.basepower.fluid_pipe.name=Pipe
+
+tile.basepower.item_conveyor.name=Conveyor
+tile.basepower.item_filter_block.name=Block Filter Conveyor
+tile.basepower.item_filter_food.name=Food Filter Conveyor
+tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor
+tile.basepower.item_filter_inventory.name=Filter Conveyor
+tile.basepower.item_filter_ore.name=Ore Filter Conveyor
+tile.basepower.item_filter_plant.name=Plantable Filter Conveyor
+tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor
+tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor
+tile.basepower.steel_frame.name=Steel Frame
+
+
+item.basepower.starch.name=Starch
+item.basepower.bioplastic_ingot.name=Bioplastic Ingot
+item.basepower.sprocket.name=Sprocket
+
+tile.basepower.fluid_metal_tank.name=Metal Fluid Tank
+item.basepower.rotator_tool.name=Rotation Wrench
+
+tile.basepower.infinite_steam.name=Unlimited Steam Power
+tile.basepower.infinite_electricity.name=Unlimited Electrical Power
+tile.basepower.infinite_quantum.name=Unlimited Quantum Power
+
+tile.basepower.crude_oil.name=Crude Oil
+fluid.basepower.crude_oil=Crude Oil
+item.bucket.crude_oil=Bucket of Crude Oil
+
+tile.basepower.still.name=Distillation Furnace
+
+tile.basepower.refined_oil.name=Refined Oil
+fluid.basepower.refined_oil=Refined Oil
+item.bucket.refined_oil=Bucket of Refined Oil
+tile.basepower.fluid_switch.name=Fluid Switch Valve
+
+tile.basepower.converter_rf_steam.name=Steam-RF Transformer
+tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer
+tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer
+tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/basepower/lang/en_PT.lang b/src/main/resources/assets/basepower/lang/en_PT.lang
new file mode 100644
index 0000000..8b463e8
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/en_PT.lang
@@ -0,0 +1,53 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
+nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
+
+tooltip.basepower.empty=Empty
+tooltip.basepower.buckets_of=%x buckets of %y
+
+itemGroup.basepower=basePower
+
+tile.basepower.fluid_drain.name=Drain
+tile.basepower.fluid_discharge.name=Discharge Grate
+tile.basepower.fluid_storage_tank.name=Portable Fluid Tank
+item.basepower.fluid_storage_tank_item.name=Storage Tank
+tile.basepower.fluid_pipe.name=Pipe
+
+tile.basepower.item_conveyor.name=Conveyor
+tile.basepower.item_filter_block.name=Block Filter Conveyor
+tile.basepower.item_filter_food.name=Food Filter Conveyor
+tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor
+tile.basepower.item_filter_inventory.name=Filter Conveyor
+tile.basepower.item_filter_ore.name=Ore Filter Conveyor
+tile.basepower.item_filter_plant.name=Plantable Filter Conveyor
+tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor
+tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor
+tile.basepower.steel_frame.name=Steel Frame
+
+
+item.basepower.starch.name=Starch
+item.basepower.bioplastic_ingot.name=Bioplastic Ingot
+item.basepower.sprocket.name=Sprocket
+
+tile.basepower.fluid_metal_tank.name=Metal Fluid Tank
+item.basepower.rotator_tool.name=Rotation Wrench
+
+tile.basepower.infinite_steam.name=Unlimited Steam Power
+tile.basepower.infinite_electricity.name=Unlimited Electrical Power
+tile.basepower.infinite_quantum.name=Unlimited Quantum Power
+
+tile.basepower.crude_oil.name=Black Gold
+fluid.basepower.crude_oil=Black Gold
+item.bucket.crude_oil=Bucket o' Black Gold
+
+tile.basepower.still.name='Stillery
+
+tile.basepower.refined_oil.name=Lamp Oil
+fluid.basepower.refined_oil=Lamp Oil
+item.bucket.refined_oil=Bucket o' Lamp Oil
+tile.basepower.fluid_switch.name=Big Red Valve
+
+tile.basepower.converter_rf_steam.name=Steam-RF Transformer
+tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer
+tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer
+tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/basepower/lang/en_US.lang b/src/main/resources/assets/basepower/lang/en_US.lang
new file mode 100644
index 0000000..453959e
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/en_US.lang
@@ -0,0 +1,52 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
+nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
+
+tooltip.basepower.empty=Empty
+tooltip.basepower.buckets_of=%x buckets of %y
+
+itemGroup.basepower=basePower
+
+tile.basepower.fluid_drain.name=Drain
+tile.basepower.fluid_discharge.name=Discharge Grate
+tile.basepower.fluid_storage_tank.name=Portable Fluid Tank
+tile.basepower.fluid_pipe.name=Pipe
+
+tile.basepower.item_conveyor.name=Conveyor
+tile.basepower.item_filter_block.name=Block Filter Conveyor
+tile.basepower.item_filter_food.name=Food Filter Conveyor
+tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor
+tile.basepower.item_filter_inventory.name=Filter Conveyor
+tile.basepower.item_filter_ore.name=Ore Filter Conveyor
+tile.basepower.item_filter_plant.name=Plantable Filter Conveyor
+tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor
+tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor
+tile.basepower.steel_frame.name=Steel Frame
+
+
+item.basepower.starch.name=Starch
+item.basepower.bioplastic_ingot.name=Bioplastic Ingot
+item.basepower.sprocket.name=Sprocket
+
+
+tile.basepower.fluid_metal_tank.name=Metal Fluid Tank
+item.basepower.rotator_tool.name=Rotation Wrench
+
+tile.basepower.infinite_steam.name=Unlimited Steam Power
+tile.basepower.infinite_electricity.name=Unlimited Electrical Power
+tile.basepower.infinite_quantum.name=Unlimited Quantum Power
+
+tile.basepower.crude_oil.name=Crude Oil
+fluid.basepower.crude_oil=Crude Oil
+item.bucket.crude_oil=Bucket of Crude Oil
+
+tile.basepower.still.name=Distillation Furnace
+tile.basepower.refined_oil.name=Refined Oil
+fluid.basepower.refined_oil=Refined Oil
+item.bucket.refined_oil=Bucket of Refined Oil
+tile.basepower.fluid_switch.name=Fluid Switch Valve
+
+tile.basepower.converter_rf_steam.name=Steam-RF Transformer
+tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer
+tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer
+tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/basepower/lang/es_ES.lang b/src/main/resources/assets/basepower/lang/es_ES.lang
new file mode 100644
index 0000000..673795a
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/es_ES.lang
@@ -0,0 +1,56 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Gran Horno (no forma)
+nei.basepower.recipehandler.shapedfurnace.name=Gran Horno (en forma)
+
+tooltip.basepower.empty=Vacío
+tooltip.basepower.buckets_of =%x cubos de %y
+
+itemGroup.basepower=Ventaja de Energía
+
+tile.basepower.fluid_drain.name=Drenaje
+tile.basepower.fluid_discharge.name=Descarga Grate
+tile.basepower.fluid_storage_tank.name=Tanque de almacenamiento
+item.basepower.fluid_storage_tank_item.name=Tanque de almacenamiento
+tile.basepower.fluid_pipe.name=Tubo
+
+tile.basepower.item_conveyor.name=Transportadores
+tile.basepower.item_filter_block.name=Bloquear Filtro Transportadores
+tile.basepower.item_filter_food.name=Filtro Alimentos Transportadores
+tile.basepower.item_filter_fuel.name=Filtro de combustible Transportadores
+tile.basepower.item_filter_inventory.name=Filtro Transportadores
+tile.basepower.item_filter_ore.name=Ore Transportadores Filtro
+tile.basepower.item_filter_plant.name=Plantable Transportadores Filtro
+tile.basepower.item_filter_smelt.name=Horno Filtro Transportadores
+tile.basepower.item_filter_overflow.name=Desbordamiento Filtro Transportadores
+tile.basepower.steel_frame.name=Marco de Acero
+
+
+item.basepower.starch.name=Almidón
+item.basepower.bioplastic_ingot.name=Bioplástico Lingote
+item.basepower.sprocket.name=Piñón
+
+
+tile.basepower.fluid_metal_tank.name=Tanque de Almacenamiento de Acero
+item.basepower.rotator_tool.name=Herramienta de Rotación
+
+tile.basepower.infinite_steam.name=La Energía de Vapor Infinito
+tile.basepower.infinite_electricity.name=Energía Eléctrica Infinito
+tile.basepower.infinite_quantum.name=Cuántica Infinito
+
+tile.basepower.crude_oil.name=Petróleo Crudo
+fluid.basepower.crude_oil=Petróleo Crudo
+item.bucket.crude_oil.name=Cubo de Crudo
+
+
+tile.basepower.still.name=Destilería
+
+tile.basepower.refined_oil.name=Refinado de Petróleo
+fluid.basepower.refined_oil=Refinado de Petróleo
+item.bucket.refined_oil.name=Cubo de Refinado de Petróleo
+tile.basepower.fluid_switch.name=Válvula
+
+
+tile.basepower.converter_rf_steam.name=Vapor-RF Transformador
+tile.basepower.converter_rf_electricity.name=Electricidad-RF Transformador
+tile.basepower.converter_rf_quantum.name=Cuántico-RF Transformador
+tile.basepower.converter_tr_electricity.name=Electricidad-EU Transformador
diff --git a/src/main/resources/assets/basepower/lang/es_MX.lang b/src/main/resources/assets/basepower/lang/es_MX.lang
new file mode 100644
index 0000000..2a0ea30
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/es_MX.lang
@@ -0,0 +1,56 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Gran Horno (no forma)
+nei.basepower.recipehandler.shapedfurnace.name=Gran Horno (en forma)
+
+tooltip.basepower.empty=Vacío
+tooltip.basepower.buckets_of=%x cubos de %y
+
+itemGroup.basepower=Ventaja de Energía
+
+tile.basepower.fluid_drain.name=Drenaje
+tile.basepower.fluid_discharge.name=Descarga Grate
+tile.basepower.fluid_storage_tank.name=Tanque de almacenamiento
+item.basepower.fluid_storage_tank_item.name=Tanque de almacenamiento
+tile.basepower.fluid_pipe.name=Tubo
+
+tile.basepower.item_conveyor.name=Transportadores
+tile.basepower.item_filter_block.name=Bloquear Filtro Transportadores
+tile.basepower.item_filter_food.name=Filtro Alimentos Transportadores
+tile.basepower.item_filter_fuel.name=Filtro de combustible Transportadores
+tile.basepower.item_filter_inventory.name=Filtro Transportadores
+tile.basepower.item_filter_ore.name=Ore Transportadores Filtro
+tile.basepower.item_filter_plant.name=Plantable Transportadores Filtro
+tile.basepower.item_filter_smelt.name=Horno Filtro Transportadores
+tile.basepower.item_filter_overflow.name=Desbordamiento Filtro Transportadores
+tile.basepower.steel_frame.name=Marco de Acero
+
+
+item.basepower.starch.name=Almidón
+item.basepower.bioplastic_ingot.name=Bioplástico Lingote
+item.basepower.sprocket.name=Piñón
+
+
+tile.basepower.fluid_metal_tank.name=Tanque de Almacenamiento de Acero
+item.basepower.rotator_tool.name=Herramienta de Rotación
+
+tile.basepower.infinite_steam.name=La Energía de Vapor Infinito
+tile.basepower.infinite_electricity.name=Energía Eléctrica Infinito
+tile.basepower.infinite_quantum.name=Cuántica Infinito
+
+tile.basepower.crude_oil.name=Petróleo Crudo
+fluid.basepower.crude_oil=Petróleo Crudo
+item.bucket.crude_oil.name=Cubo de Crudo
+
+
+tile.basepower.still.name=Destilería
+
+tile.basepower.refined_oil.name=Refinado de Petróleo
+fluid.basepower.refined_oil=Refinado de Petróleo
+item.bucket.refined_oil.name=Cubo de Refinado de Petróleo
+tile.basepower.fluid_switch.name=Válvula
+
+
+tile.basepower.converter_rf_steam.name=Vapor-RF Transformador
+tile.basepower.converter_rf_electricity.name=Electricidad-RF Transformador
+tile.basepower.converter_rf_quantum.name=Cuántico-RF Transformador
+tile.basepower.converter_tr_electricity.name=Electricidad-EU Transformador
diff --git a/src/main/resources/assets/basepower/lang/it_IT.lang b/src/main/resources/assets/basepower/lang/it_IT.lang
new file mode 100644
index 0000000..a8b04ef
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/it_IT.lang
@@ -0,0 +1,55 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Grande Fornace (informe)
+nei.basepower.recipehandler.shapedfurnace.name=Grande Fornace (forma)
+
+tooltip.basepower.empty=vuoto
+tooltip.basepower.buckets_of=%x secchi d'%y
+
+itemGroup.basepower=Potenza Advantage
+
+tile.basepower.fluid_drain.name=Scarico
+tile.basepower.fluid_discharge.name=Griglia di scarico
+tile.basepower.fluid_storage_tank.name=Serbatoio
+item.basepower.fluid_storage_tank_item.name=Serbatoio
+tile.basepower.fluid_pipe.name=Tubo
+
+tile.basepower.item_conveyor.name=Trasportatore
+tile.basepower.item_filter_block.name=Filtro di blocco trasportatore
+tile.basepower.item_filter_food.name=Filtro alimentare Conveyor
+tile.basepower.item_filter_fuel.name=carburante Filtro Conveyor
+tile.basepower.item_filter_inventory.name=Filtro Conveyor
+tile.basepower.item_filter_ore.name=Ore Filtro Conveyor
+tile.basepower.item_filter_plant.name=Plantable Filtro Conveyor
+tile.basepower.item_filter_smelt.name=Forno Filtro Conveyor
+tile.basepower.item_filter_overflow.name=Straripamento Filtro Conveyor
+tile.basepower.steel_frame.name=Steel Frame
+
+
+item.basepower.starch.name=Amido
+item.basepower.bioplastic_ingot.name=Bioplastica Lingotto
+item.basepower.sprocket.name=Sprocket
+
+
+tile.basepower.fluid_metal_tank.name=Serbatoio in Metallo
+item.basepower.rotator_tool.name=Strumento di Rotazione
+
+tile.basepower.infinite_steam.name=Forza Vapore Infinite
+tile.basepower.infinite_electricity.name=Elettricità Infinite
+tile.basepower.infinite_quantum.name=Atomica Infinite
+
+tile.basepower.crude_oil.name=Olio a Crudo
+fluid.basepower.crude_oil=Olio a Crudo
+item.bucket.crude_oil.name=Secchio di Greggio
+
+
+tile.basepower.still.name=Distilleria
+tile.basepower.refined_oil.name=Olio Raffinato
+fluid.basepower.refined_oil=Olio Raffinato
+item.bucket.refined_oil.name=Secchio di Olio Raffinato
+tile.basepower.fluid_switch.name=Valvola
+
+
+tile.basepower.converter_rf_steam.name=Vapore-RF Trasformatore
+tile.basepower.converter_rf_electricity.name=Elettricità-RF Trasformatore
+tile.basepower.converter_rf_quantum.name=Quantistico-RF Trasformatore
+tile.basepower.converter_tr_electricity.name=Elettricità-EU Trasformatore
diff --git a/src/main/resources/assets/basepower/lang/ja_JP.lang b/src/main/resources/assets/basepower/lang/ja_JP.lang
new file mode 100644
index 0000000..0c47868
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/ja_JP.lang
@@ -0,0 +1,56 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+Translate
+nei.basepower.recipehandler.shapelessfurnace.name=大型炉(型崩れ)
+nei.basepower.recipehandler.shapedfurnace.name=大型炉(形)
+
+tooltip.basepower.empty=空
+tooltip.basepower.buckets_of=%yの%xバケット
+
+itemGroup.basepower=パワー·アドバンテージ
+
+tile.basepower.fluid_drain.name=ドレン
+tile.basepower.fluid_discharge.name=放電グレート
+tile.basepower.fluid_storage_tank.name=貯蔵タンク
+item.basepower.fluid_storage_tank_item.name=貯蔵タンク
+tile.basepower.fluid_pipe.name=パイプ
+
+tile.basepower.item_conveyor.name=コンベア
+tile.basepower.item_filter_block.name=ブロックフィルタコンベア
+tile.basepower.item_filter_food.name=フードフィルターコンベア
+tile.basepower.item_filter_fuel.name=燃料フィルターコンベア
+tile.basepower.item_filter_inventory.name=フィルタコンベヤー
+tile.basepower.item_filter_ore.name=鉱石フィルターコンベア
+tile.basepower.item_filter_plant.name=プラントフィルタコンベヤー
+tile.basepower.item_filter_smelt.name=炉フィルターコンベア
+tile.basepower.item_filter_overflow.name=オーバーフローフィルタコンベヤー
+tile.basepower.steel_frame.name=鉄骨
+
+
+item.basepower.starch.name=デンプン
+item.basepower.bioplastic_ingot.name=は、バイオプラスチックインゴットを
+item.basepower.sprocket.name=スプロケット
+
+tile.basepower.infinite_steam.name=無限の蒸気動力
+tile.basepower.infinite_electricity.name=無限の電力
+tile.basepower.infinite_quantum.name=無限の量子パワー
+
+
+tile.basepower.fluid_metal_tank.name=金属製貯蔵タンク
+item.basepower.rotator_tool.name=回転ツール
+
+tile.basepower.crude_oil.name=原油
+fluid.basepower.crude_oil=原油
+item.bucket.crude_oil.name=原油のバケット
+
+
+tile.basepower.still.name=蒸留酒製造所
+tile.basepower.refined_oil.name=精製油
+fluid.basepower.refined_oil=精製油
+item.bucket.refined_oil.name=精製油のバケツ
+tile.basepower.fluid_switch.name=バルブ
+
+
+tile.basepower.converter_rf_steam.name=蒸気-RFトランス
+tile.basepower.converter_rf_electricity.name=電気-RFトランス
+tile.basepower.converter_rf_quantum.name=量子-RFトランス
+tile.basepower.converter_tr_electricity.name=電気-EUトランス
diff --git a/src/main/resources/assets/basepower/lang/ko_KR.lang b/src/main/resources/assets/basepower/lang/ko_KR.lang
new file mode 100644
index 0000000..b9d1b83
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/ko_KR.lang
@@ -0,0 +1,56 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=대형 전기로 (못생긴)
+nei.basepower.recipehandler.shapedfurnace.name=대형 전기로 (모양)
+
+tooltip.basepower.empty=빈
+tooltip.tooltip.basepower.buckets_of=%는 X 버킷
+
+itemGroup.basepower=전원의 장점을
+
+tile.basepower.fluid_drain.name=드레인
+tile.basepower.fluid_discharge.name=방전 화격자
+tile.basepower.fluid_storage_tank.name=저장 탱크
+item.basepower.fluid_storage_tank_item.name=는 저장 탱크를
+tile.basepower.fluid_pipe.name=파이프
+
+tile.basepower.item_conveyor.name=컨베이어
+tile.basepower.item_filter_block.name=블록 필터 컨베이어
+tile.basepower.item_filter_food.name=식품 필터 컨베이어
+tile.basepower.item_filter_fuel.name=연료 필터 컨베이어
+tile.basepower.item_filter_inventory.name=필터 컨베이어
+tile.basepower.item_filter_ore.name=광석 필터 컨베이어
+tile.basepower.item_filter_plant.name=물만 주면 식물이 필터 컨베이어
+tile.basepower.item_filter_smelt.name=노 필터 컨베이어
+tile.basepower.item_filter_overflow.name=오버 플로우필터 컨베이어
+tile.basepower.steel_frame.name=스틸 프레임
+
+
+item.basepower.starch.name=전분
+item.basepower.bioplastic_ingot.name=는 바이오 플라스틱 잉곳을
+item.basepower.sprocket.name=스프로킷
+
+
+tile.basepower.fluid_metal_tank.name=금속 저장조
+item.basepower.rotator_tool.name=회전 도구
+
+
+tile.basepower.infinite_steam.name=무한 증기 력
+tile.basepower.infinite_electricity.name=무한 전력
+tile.basepower.infinite_quantum.name=무한 양자 전력
+
+tile.basepower.crude_oil.name=원유
+fluid.basepower.crude_oil=원유
+item.bucket.crude_oil.name=원유의 버킷
+
+
+tile.basepower.still.name=증류소
+tile.basepower.refined_oil.name=정유
+fluid.basepower.refined_oil=정유
+item.bucket.refined_oil.name=정유의 통
+tile.basepower.fluid_switch.name=판막
+
+
+tile.basepower.converter_rf_steam.name=증기-RF 전원 트랜스
+tile.basepower.converter_rf_electricity.name=전기-RF 전원 트랜스
+tile.basepower.converter_rf_quantum.name=양자-RF 전원 트랜스
+tile.basepower.converter_tr_electricity.name=전기-EU 전원 트랜스
diff --git a/src/main/resources/assets/basepower/lang/pt_BR.lang b/src/main/resources/assets/basepower/lang/pt_BR.lang
new file mode 100644
index 0000000..48f51d3
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/pt_BR.lang
@@ -0,0 +1,54 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+nei.basepower.recipehandler.shapelessfurnace.name=Forno Grande (no forma)
+nei.basepower.recipehandler.shapedfurnace.name=Forno Grande (em forma)
+
+tooltip.basepower.empty=vazio
+tooltip.basepower.buckets_of=%x baldes de %y
+
+itemGroup.basepower=Vantagem de Poder
+
+tile.basepower.fluid_drain.name=Dreno
+tile.basepower.fluid_discharge.name=Grate Discharge
+tile.basepower.fluid_storage_tank.name=Tanque de armazenamento
+item.basepower.fluid_storage_tank_item.name=Tanque de armazenamento
+tile.basepower.fluid_pipe.name=Tubulação
+
+tile.basepower.item_conveyor.name=Transportador
+tile.basepower.item_filter_block.name=Bloquear filtro transportador
+tile.basepower.item_filter_food.name=Transportador Filtro de Alimentos
+tile.basepower.item_filter_fuel.name=Filtro de combustível Transportador
+tile.basepower.item_filter_inventory.name=Transportador Filtro
+tile.basepower.item_filter_ore.name=Ore Transportadora Filtro
+tile.basepower.item_filter_plant.name=Plantable Transportadora Filtro
+tile.basepower.item_filter_smelt.name=Fornalha Filtro Transportador
+tile.basepower.item_filter_overflow.name=Transbordamento Transportador Filtro
+tile.basepower.steel_frame.name=Armação de Aço
+
+
+item.basepower.starch.name=Amido
+item.basepower.bioplastic_ingot.name=Bioplastic lingote
+item.basepower.sprocket.name=Roda Dentada
+
+
+tile.basepower.fluid_metal_tank.name=Tanque de Armazenamento de Aço
+item.basepower.rotator_tool.name=Ferramenta de Rotação
+
+tile.basepower.infinite_steam.name=Energia a Vapor Infinito
+tile.basepower.infinite_electricity.name=Energia Elétrica Infinito
+tile.basepower.infinite_quantum.name=Energia Quantum Infinito
+
+tile.basepower.crude_oil.name=Óleo Cru
+fluid.basepower.crude_oil=Óleo Cru
+item.bucket.crude_oil.name=Balde de Óleo Cru
+
+
+tile.basepower.still.name=Destilaria
+tile.basepower.refined_oil.name=Óleo Refinado
+fluid.basepower.refined_oil=Óleo Refinado
+item.bucket.refined_oil.name=Balde de Óleo Refinado
+tile.basepower.fluid_switch.name=Válvula
+
+tile.basepower.converter_rf_steam.name=Vapor-RF Transformador
+tile.basepower.converter_rf_electricity.name=Electricidade-RF Transformador
+tile.basepower.converter_rf_quantum.name=Quantidade-RF Transformador
+tile.basepower.converter_tr_electricity.name=Electricidade-EU Transformador
diff --git a/src/main/resources/assets/basepower/lang/zh_CN.lang b/src/main/resources/assets/basepower/lang/zh_CN.lang
new file mode 100644
index 0000000..611540f
--- /dev/null
+++ b/src/main/resources/assets/basepower/lang/zh_CN.lang
@@ -0,0 +1,57 @@
+language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
+
+nei.basepower.recipehandler.shapelessfurnace.name=大熔炉(无形的)
+nei.basepower.recipehandler.shapedfurnace.name=大熔炉(有形的)
+
+tooltip.basepower.empty=空
+tooltip.basepower.buckets_of=%x水桶的%y
+
+itemGroup.basepower=能量优势
+
+tile.basepower.fluid_drain.name=抽水机
+tile.basepower.fluid_discharge.name=排液器
+tile.basepower.fluid_storage_tank.name=便携式液体储罐
+item.basepower.fluid_storage_tank_item.name=便携式液体储罐
+tile.basepower.fluid_pipe.name=液体管
+
+tile.basepower.item_conveyor.name=输送机
+tile.basepower.item_filter_block.name=方块过滤输送机
+tile.basepower.item_filter_food.name=食品过滤输送机
+tile.basepower.item_filter_fuel.name=燃料过滤输送机
+tile.basepower.item_filter_inventory.name=选择过滤输送机
+tile.basepower.item_filter_ore.name=矿物过滤输送机
+tile.basepower.item_filter_plant.name=种子过滤输送机
+tile.basepower.item_filter_smelt.name=熔炉过滤输送机
+tile.basepower.item_filter_overflow.name=溢出过滤输送机
+tile.basepower.steel_frame.name=钢框架
+
+
+item.basepower.starch.name=淀粉
+item.basepower.bioplastic_ingot.name=生物塑料锭
+item.basepower.sprocket.name=链轮
+
+
+tile.basepower.fluid_metal_tank.name=金属液罐
+item.basepower.rotator_tool.name=旋转扳手
+
+tile.basepower.infinite_steam.name=无限蒸汽动力
+tile.basepower.infinite_electricity.name=无限电力
+tile.basepower.infinite_quantum.name=无限量子动力
+
+tile.basepower.crude_oil.name=原油
+fluid.basepower.crude_oil=原油
+item.bucket.crude_oil.name=原油桶
+
+
+tile.basepower.still.name=酒廠
+
+tile.basepower.refined_oil.name=成品油
+fluid.basepower.refined_oil=成品油
+item.bucket.refined_oil.name=成品油的桶
+tile.basepower.fluid_switch.name=閥
+
+
+tile.basepower.converter_rf_steam.name=蒸汽-RF 變壓器
+tile.basepower.converter_rf_electricity.name=電力-RF 變壓器
+tile.basepower.converter_rf_quantum.name=量子-RF 變壓器
+tile.basepower.converter_tr_electricity.name=電力-EU 變壓器
diff --git a/src/main/resources/assets/poweradvantage/models/block/converter_rf_electricity.json b/src/main/resources/assets/basepower/models/block/converter_rf_electricity.json
similarity index 94%
rename from src/main/resources/assets/poweradvantage/models/block/converter_rf_electricity.json
rename to src/main/resources/assets/basepower/models/block/converter_rf_electricity.json
index 01a03f6..dbdf82a 100644
--- a/src/main/resources/assets/poweradvantage/models/block/converter_rf_electricity.json
+++ b/src/main/resources/assets/basepower/models/block/converter_rf_electricity.json
@@ -1,10 +1,10 @@
{
"parent": "block/block",
"textures": {
- "face": "poweradvantage:blocks/steel_frame",
- "core": "poweradvantage:materials/plastic",
- "plug": "poweradvantage:blocks/filter_bottom",
- "particle": "poweradvantage:materials/steel"
+ "face": "basepower:blocks/steel_frame",
+ "core": "basepower:materials/plastic",
+ "plug": "basepower:blocks/filter_bottom",
+ "particle": "basepower:materials/steel"
},
"elements": [
{
diff --git a/src/main/resources/assets/poweradvantage/models/block/converter_rf_quantum.json b/src/main/resources/assets/basepower/models/block/converter_rf_quantum.json
similarity index 96%
rename from src/main/resources/assets/poweradvantage/models/block/converter_rf_quantum.json
rename to src/main/resources/assets/basepower/models/block/converter_rf_quantum.json
index 82f513c..5a534f0 100644
--- a/src/main/resources/assets/poweradvantage/models/block/converter_rf_quantum.json
+++ b/src/main/resources/assets/basepower/models/block/converter_rf_quantum.json
@@ -1,10 +1,10 @@
{
"parent": "block/block",
"textures": {
- "face": "poweradvantage:blocks/steel_frame",
+ "face": "basepower:blocks/steel_frame",
"core": "minecraft:blocks/ice_packed",
- "plug": "poweradvantage:blocks/filter_bottom",
- "particle": "poweradvantage:materials/steel"
+ "plug": "basepower:blocks/filter_bottom",
+ "particle": "basepower:materials/steel"
},
"elements": [
{
diff --git a/src/main/resources/assets/poweradvantage/models/block/converter_rf_steam.json b/src/main/resources/assets/basepower/models/block/converter_rf_steam.json
similarity index 95%
rename from src/main/resources/assets/poweradvantage/models/block/converter_rf_steam.json
rename to src/main/resources/assets/basepower/models/block/converter_rf_steam.json
index a831250..b1fe2c8 100644
--- a/src/main/resources/assets/poweradvantage/models/block/converter_rf_steam.json
+++ b/src/main/resources/assets/basepower/models/block/converter_rf_steam.json
@@ -1,10 +1,10 @@
{
"parent": "block/block",
"textures": {
- "face": "poweradvantage:blocks/steel_frame",
- "core": "poweradvantage:materials/brass",
- "plug": "poweradvantage:blocks/filter_bottom",
- "particle": "poweradvantage:materials/steel"
+ "face": "basepower:blocks/steel_frame",
+ "core": "basepower:materials/brass",
+ "plug": "basepower:blocks/filter_bottom",
+ "particle": "basepower:materials/steel"
},
"elements": [
{
diff --git a/src/main/resources/assets/basepower/models/block/converter_tr_electricity.json b/src/main/resources/assets/basepower/models/block/converter_tr_electricity.json
new file mode 100644
index 0000000..102f107
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/converter_tr_electricity.json
@@ -0,0 +1,6 @@
+{
+ "parent": "block/cube_all",
+ "textures": {
+ "all": "basepower:blocks/techreborn_converter"
+ }
+}
diff --git a/src/main/resources/assets/poweradvantage/models/block/conveyor_base.json b/src/main/resources/assets/basepower/models/block/conveyor_base.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/conveyor_base.json
rename to src/main/resources/assets/basepower/models/block/conveyor_base.json
diff --git a/src/main/resources/assets/basepower/models/block/fluid_discharge.json b/src/main/resources/assets/basepower/models/block/fluid_discharge.json
new file mode 100644
index 0000000..2ee7970
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_discharge.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/cube_bottom_top",
+ "textures": {
+ "top": "basepower:blocks/fluid_discharge_side",
+ "bottom": "basepower:blocks/fluid_discharge_face",
+ "side": "basepower:blocks/fluid_discharge_side"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/block/fluid_drain.json b/src/main/resources/assets/basepower/models/block/fluid_drain.json
new file mode 100644
index 0000000..b076dd0
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_drain.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/cube_bottom_top",
+ "textures": {
+ "top": "basepower:blocks/fluid_drain_face",
+ "bottom": "basepower:blocks/fluid_drain_side",
+ "side": "basepower:blocks/fluid_drain_side"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_metal_tank.json b/src/main/resources/assets/basepower/models/block/fluid_metal_tank.json
similarity index 94%
rename from src/main/resources/assets/poweradvantage/models/block/fluid_metal_tank.json
rename to src/main/resources/assets/basepower/models/block/fluid_metal_tank.json
index 3342841..85fc4ab 100644
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_metal_tank.json
+++ b/src/main/resources/assets/basepower/models/block/fluid_metal_tank.json
@@ -1,10 +1,10 @@
{
"parent": "block/block",
"textures": {
- "top": "poweradvantage:blocks/fluid_metal_tank_top",
- "bottom": "poweradvantage:blocks/fluid_metal_tank_top",
- "side": "poweradvantage:blocks/fluid_metal_tank_side",
- "particle": "poweradvantage:blocks/fluid_metal_tank_side"
+ "top": "basepower:blocks/fluid_metal_tank_top",
+ "bottom": "basepower:blocks/fluid_metal_tank_top",
+ "side": "basepower:blocks/fluid_metal_tank_side",
+ "particle": "basepower:blocks/fluid_metal_tank_side"
},
"elements": [
{
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_0.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_0.json
new file mode 100644
index 0000000..9d3f723
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_0.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_0",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_densuw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_densuw.json
new file mode 100644
index 0000000..6d07fd4
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_densuw.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_densuw",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_desuw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_desuw.json
new file mode 100644
index 0000000..3311cb3
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_desuw.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_desuw",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_dnu.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_dnu.json
new file mode 100644
index 0000000..cc3d8f6
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_dnu.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_dnu",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_ensw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_ensw.json
new file mode 100644
index 0000000..f31a841
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_ensw.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_ensw",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_n.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_n.json
new file mode 100644
index 0000000..11a2c6d
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_n.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_n",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_ns.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_ns.json
new file mode 100644
index 0000000..aa64b8a
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_ns.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_ns",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_nsuw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_nsuw.json
new file mode 100644
index 0000000..95c3367
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nsuw.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_nsuw",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_nsw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_nsw.json
new file mode 100644
index 0000000..60ec039
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nsw.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_nsw",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_nuw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_nuw.json
new file mode 100644
index 0000000..5b0dbb1
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nuw.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_nuw",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_nw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_nw.json
new file mode 100644
index 0000000..2f87ee8
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nw.json
@@ -0,0 +1,8 @@
+{
+ "parent": "block/block",
+ "parent": "basepower:block/pipe4_nw",
+ "textures": {
+ "texture": "basepower:blocks/fluid_pipe",
+ "particle": "basepower:materials/iron"
+ }
+}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_storage_tank.json b/src/main/resources/assets/basepower/models/block/fluid_storage_tank.json
similarity index 97%
rename from src/main/resources/assets/poweradvantage/models/block/fluid_storage_tank.json
rename to src/main/resources/assets/basepower/models/block/fluid_storage_tank.json
index c8daff3..70f1e28 100644
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_storage_tank.json
+++ b/src/main/resources/assets/basepower/models/block/fluid_storage_tank.json
@@ -1,9 +1,9 @@
{
"parent": "block/block",
"textures": {
- "walls": "poweradvantage:materials/plastic",
- "supports": "poweradvantage:materials/steel",
- "particle": "poweradvantage:materials/plastic"
+ "walls": "basepower:materials/plastic",
+ "supports": "basepower:materials/steel",
+ "particle": "basepower:materials/plastic"
},
"elements": [
{
diff --git a/src/main/resources/assets/basepower/models/block/fluid_switch_off.json b/src/main/resources/assets/basepower/models/block/fluid_switch_off.json
new file mode 100644
index 0000000..53991a6
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_switch_off.json
@@ -0,0 +1,7 @@
+{
+ "parent": "block/cube_all",
+ "textures": {
+ "all": "basepower:blocks/fluid_switch_off",
+ "particle": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/fluid_switch_on.json b/src/main/resources/assets/basepower/models/block/fluid_switch_on.json
new file mode 100644
index 0000000..b132b59
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_switch_on.json
@@ -0,0 +1,7 @@
+{
+ "parent": "block/cube_all",
+ "textures": {
+ "all": "basepower:blocks/fluid_switch_on",
+ "particle": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/poweradvantage/models/block/infinite_electricity.json b/src/main/resources/assets/basepower/models/block/infinite_electricity.json
similarity index 52%
rename from src/main/resources/assets/poweradvantage/models/block/infinite_electricity.json
rename to src/main/resources/assets/basepower/models/block/infinite_electricity.json
index 40f79af..8300510 100644
--- a/src/main/resources/assets/poweradvantage/models/block/infinite_electricity.json
+++ b/src/main/resources/assets/basepower/models/block/infinite_electricity.json
@@ -1,6 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
- "all": "poweradvantage:materials/metal_panel"
+ "all": "basepower:materials/metal_panel"
}
}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/block/infinite_quantum.json b/src/main/resources/assets/basepower/models/block/infinite_quantum.json
similarity index 52%
rename from src/main/resources/assets/poweradvantage/models/block/infinite_quantum.json
rename to src/main/resources/assets/basepower/models/block/infinite_quantum.json
index 40f79af..8300510 100644
--- a/src/main/resources/assets/poweradvantage/models/block/infinite_quantum.json
+++ b/src/main/resources/assets/basepower/models/block/infinite_quantum.json
@@ -1,6 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
- "all": "poweradvantage:materials/metal_panel"
+ "all": "basepower:materials/metal_panel"
}
}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/block/infinite_steam.json b/src/main/resources/assets/basepower/models/block/infinite_steam.json
similarity index 52%
rename from src/main/resources/assets/poweradvantage/models/block/infinite_steam.json
rename to src/main/resources/assets/basepower/models/block/infinite_steam.json
index 40f79af..8300510 100644
--- a/src/main/resources/assets/poweradvantage/models/block/infinite_steam.json
+++ b/src/main/resources/assets/basepower/models/block/infinite_steam.json
@@ -1,6 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
- "all": "poweradvantage:materials/metal_panel"
+ "all": "basepower:materials/metal_panel"
}
}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/block/item_conveyor.json b/src/main/resources/assets/basepower/models/block/item_conveyor.json
new file mode 100644
index 0000000..9da9824
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/item_conveyor.json
@@ -0,0 +1,10 @@
+{
+ "parent": "basepower:block/conveyor_base",
+ "textures": {
+ "top": "basepower:blocks/item_conveyor_top",
+ "bottom": "basepower:blocks/item_conveyor_top",
+ "side": "basepower:blocks/item_conveyor_side",
+ "end": "basepower:blocks/item_conveyor_end",
+ "rim": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/item_filter_block.json b/src/main/resources/assets/basepower/models/block/item_filter_block.json
new file mode 100644
index 0000000..fadbf83
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/item_filter_block.json
@@ -0,0 +1,10 @@
+{
+ "parent": "basepower:block/conveyor_base",
+ "textures": {
+ "top": "basepower:blocks/item_conveyor_top",
+ "bottom": "basepower:blocks/filter_bottom",
+ "side": "basepower:blocks/filter_side_block",
+ "end": "basepower:blocks/item_conveyor_end",
+ "rim": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/item_filter_food.json b/src/main/resources/assets/basepower/models/block/item_filter_food.json
new file mode 100644
index 0000000..67b14ad
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/item_filter_food.json
@@ -0,0 +1,10 @@
+{
+ "parent": "basepower:block/conveyor_base",
+ "textures": {
+ "top": "basepower:blocks/item_conveyor_top",
+ "bottom": "basepower:blocks/filter_bottom",
+ "side": "basepower:blocks/filter_side_food",
+ "end": "basepower:blocks/item_conveyor_end",
+ "rim": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/item_filter_fuel.json b/src/main/resources/assets/basepower/models/block/item_filter_fuel.json
new file mode 100644
index 0000000..41c8e92
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/item_filter_fuel.json
@@ -0,0 +1,10 @@
+{
+ "parent": "basepower:block/conveyor_base",
+ "textures": {
+ "top": "basepower:blocks/item_conveyor_top",
+ "bottom": "basepower:blocks/filter_bottom",
+ "side": "basepower:blocks/filter_side_fuel",
+ "end": "basepower:blocks/item_conveyor_end",
+ "rim": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/item_filter_inventory.json b/src/main/resources/assets/basepower/models/block/item_filter_inventory.json
new file mode 100644
index 0000000..cbec1c3
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/item_filter_inventory.json
@@ -0,0 +1,10 @@
+{
+ "parent": "basepower:block/conveyor_base",
+ "textures": {
+ "top": "basepower:blocks/item_conveyor_top",
+ "bottom": "basepower:blocks/filter_bottom",
+ "side": "basepower:blocks/filter_side_inventory",
+ "end": "basepower:blocks/item_conveyor_end",
+ "rim": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/item_filter_ore.json b/src/main/resources/assets/basepower/models/block/item_filter_ore.json
new file mode 100644
index 0000000..040a4fd
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/item_filter_ore.json
@@ -0,0 +1,10 @@
+{
+ "parent": "basepower:block/conveyor_base",
+ "textures": {
+ "top": "basepower:blocks/item_conveyor_top",
+ "bottom": "basepower:blocks/filter_bottom",
+ "side": "basepower:blocks/filter_side_ore",
+ "end": "basepower:blocks/item_conveyor_end",
+ "rim": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/item_filter_overflow.json b/src/main/resources/assets/basepower/models/block/item_filter_overflow.json
new file mode 100644
index 0000000..4f71669
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/item_filter_overflow.json
@@ -0,0 +1,10 @@
+{
+ "parent": "basepower:block/conveyor_base",
+ "textures": {
+ "top": "basepower:blocks/item_conveyor_top",
+ "bottom": "basepower:blocks/filter_bottom",
+ "side": "basepower:blocks/filter_side_overflow",
+ "end": "basepower:blocks/item_conveyor_end",
+ "rim": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/item_filter_plant.json b/src/main/resources/assets/basepower/models/block/item_filter_plant.json
new file mode 100644
index 0000000..1e097b1
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/item_filter_plant.json
@@ -0,0 +1,10 @@
+{
+ "parent": "basepower:block/conveyor_base",
+ "textures": {
+ "top": "basepower:blocks/item_conveyor_top",
+ "bottom": "basepower:blocks/filter_bottom",
+ "side": "basepower:blocks/filter_side_plantable",
+ "end": "basepower:blocks/item_conveyor_end",
+ "rim": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/block/item_filter_smelt.json b/src/main/resources/assets/basepower/models/block/item_filter_smelt.json
new file mode 100644
index 0000000..ee43633
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/item_filter_smelt.json
@@ -0,0 +1,10 @@
+{
+ "parent": "basepower:block/conveyor_base",
+ "textures": {
+ "top": "basepower:blocks/item_conveyor_top",
+ "bottom": "basepower:blocks/filter_bottom",
+ "side": "basepower:blocks/filter_side_smeltable",
+ "end": "basepower:blocks/item_conveyor_end",
+ "rim": "basepower:materials/steel"
+ }
+}
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_0.json b/src/main/resources/assets/basepower/models/block/pipe1_0.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_0.json
rename to src/main/resources/assets/basepower/models/block/pipe1_0.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_densuw.json b/src/main/resources/assets/basepower/models/block/pipe1_densuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_densuw.json
rename to src/main/resources/assets/basepower/models/block/pipe1_densuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_desuw.json b/src/main/resources/assets/basepower/models/block/pipe1_desuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_desuw.json
rename to src/main/resources/assets/basepower/models/block/pipe1_desuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_dnu.json b/src/main/resources/assets/basepower/models/block/pipe1_dnu.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_dnu.json
rename to src/main/resources/assets/basepower/models/block/pipe1_dnu.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_ensw.json b/src/main/resources/assets/basepower/models/block/pipe1_ensw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_ensw.json
rename to src/main/resources/assets/basepower/models/block/pipe1_ensw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_n.json b/src/main/resources/assets/basepower/models/block/pipe1_n.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_n.json
rename to src/main/resources/assets/basepower/models/block/pipe1_n.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_ns.json b/src/main/resources/assets/basepower/models/block/pipe1_ns.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_ns.json
rename to src/main/resources/assets/basepower/models/block/pipe1_ns.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_nsuw.json b/src/main/resources/assets/basepower/models/block/pipe1_nsuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_nsuw.json
rename to src/main/resources/assets/basepower/models/block/pipe1_nsuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_nsw.json b/src/main/resources/assets/basepower/models/block/pipe1_nsw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_nsw.json
rename to src/main/resources/assets/basepower/models/block/pipe1_nsw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_nuw.json b/src/main/resources/assets/basepower/models/block/pipe1_nuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_nuw.json
rename to src/main/resources/assets/basepower/models/block/pipe1_nuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_nw.json b/src/main/resources/assets/basepower/models/block/pipe1_nw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe1_nw.json
rename to src/main/resources/assets/basepower/models/block/pipe1_nw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_0.json b/src/main/resources/assets/basepower/models/block/pipe2_0.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_0.json
rename to src/main/resources/assets/basepower/models/block/pipe2_0.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_densuw.json b/src/main/resources/assets/basepower/models/block/pipe2_densuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_densuw.json
rename to src/main/resources/assets/basepower/models/block/pipe2_densuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_desuw.json b/src/main/resources/assets/basepower/models/block/pipe2_desuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_desuw.json
rename to src/main/resources/assets/basepower/models/block/pipe2_desuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_dnu.json b/src/main/resources/assets/basepower/models/block/pipe2_dnu.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_dnu.json
rename to src/main/resources/assets/basepower/models/block/pipe2_dnu.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_ensw.json b/src/main/resources/assets/basepower/models/block/pipe2_ensw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_ensw.json
rename to src/main/resources/assets/basepower/models/block/pipe2_ensw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_n.json b/src/main/resources/assets/basepower/models/block/pipe2_n.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_n.json
rename to src/main/resources/assets/basepower/models/block/pipe2_n.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_ns.json b/src/main/resources/assets/basepower/models/block/pipe2_ns.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_ns.json
rename to src/main/resources/assets/basepower/models/block/pipe2_ns.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_nsuw.json b/src/main/resources/assets/basepower/models/block/pipe2_nsuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_nsuw.json
rename to src/main/resources/assets/basepower/models/block/pipe2_nsuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_nsw.json b/src/main/resources/assets/basepower/models/block/pipe2_nsw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_nsw.json
rename to src/main/resources/assets/basepower/models/block/pipe2_nsw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_nuw.json b/src/main/resources/assets/basepower/models/block/pipe2_nuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_nuw.json
rename to src/main/resources/assets/basepower/models/block/pipe2_nuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_nw.json b/src/main/resources/assets/basepower/models/block/pipe2_nw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe2_nw.json
rename to src/main/resources/assets/basepower/models/block/pipe2_nw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_0.json b/src/main/resources/assets/basepower/models/block/pipe3_0.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_0.json
rename to src/main/resources/assets/basepower/models/block/pipe3_0.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_densuw.json b/src/main/resources/assets/basepower/models/block/pipe3_densuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_densuw.json
rename to src/main/resources/assets/basepower/models/block/pipe3_densuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_desuw.json b/src/main/resources/assets/basepower/models/block/pipe3_desuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_desuw.json
rename to src/main/resources/assets/basepower/models/block/pipe3_desuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_dnu.json b/src/main/resources/assets/basepower/models/block/pipe3_dnu.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_dnu.json
rename to src/main/resources/assets/basepower/models/block/pipe3_dnu.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_ensw.json b/src/main/resources/assets/basepower/models/block/pipe3_ensw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_ensw.json
rename to src/main/resources/assets/basepower/models/block/pipe3_ensw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_n.json b/src/main/resources/assets/basepower/models/block/pipe3_n.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_n.json
rename to src/main/resources/assets/basepower/models/block/pipe3_n.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_ns.json b/src/main/resources/assets/basepower/models/block/pipe3_ns.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_ns.json
rename to src/main/resources/assets/basepower/models/block/pipe3_ns.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_nsuw.json b/src/main/resources/assets/basepower/models/block/pipe3_nsuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_nsuw.json
rename to src/main/resources/assets/basepower/models/block/pipe3_nsuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_nsw.json b/src/main/resources/assets/basepower/models/block/pipe3_nsw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_nsw.json
rename to src/main/resources/assets/basepower/models/block/pipe3_nsw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_nuw.json b/src/main/resources/assets/basepower/models/block/pipe3_nuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_nuw.json
rename to src/main/resources/assets/basepower/models/block/pipe3_nuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_nw.json b/src/main/resources/assets/basepower/models/block/pipe3_nw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe3_nw.json
rename to src/main/resources/assets/basepower/models/block/pipe3_nw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_0.json b/src/main/resources/assets/basepower/models/block/pipe4_0.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_0.json
rename to src/main/resources/assets/basepower/models/block/pipe4_0.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_densuw.json b/src/main/resources/assets/basepower/models/block/pipe4_densuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_densuw.json
rename to src/main/resources/assets/basepower/models/block/pipe4_densuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_desuw.json b/src/main/resources/assets/basepower/models/block/pipe4_desuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_desuw.json
rename to src/main/resources/assets/basepower/models/block/pipe4_desuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_dnu.json b/src/main/resources/assets/basepower/models/block/pipe4_dnu.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_dnu.json
rename to src/main/resources/assets/basepower/models/block/pipe4_dnu.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_ensw.json b/src/main/resources/assets/basepower/models/block/pipe4_ensw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_ensw.json
rename to src/main/resources/assets/basepower/models/block/pipe4_ensw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_n.json b/src/main/resources/assets/basepower/models/block/pipe4_n.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_n.json
rename to src/main/resources/assets/basepower/models/block/pipe4_n.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_ns.json b/src/main/resources/assets/basepower/models/block/pipe4_ns.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_ns.json
rename to src/main/resources/assets/basepower/models/block/pipe4_ns.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_nsuw.json b/src/main/resources/assets/basepower/models/block/pipe4_nsuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_nsuw.json
rename to src/main/resources/assets/basepower/models/block/pipe4_nsuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_nsw.json b/src/main/resources/assets/basepower/models/block/pipe4_nsw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_nsw.json
rename to src/main/resources/assets/basepower/models/block/pipe4_nsw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_nuw.json b/src/main/resources/assets/basepower/models/block/pipe4_nuw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_nuw.json
rename to src/main/resources/assets/basepower/models/block/pipe4_nuw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_nw.json b/src/main/resources/assets/basepower/models/block/pipe4_nw.json
similarity index 100%
rename from src/main/resources/assets/poweradvantage/models/block/pipe4_nw.json
rename to src/main/resources/assets/basepower/models/block/pipe4_nw.json
diff --git a/src/main/resources/assets/poweradvantage/models/block/steel_frame.json b/src/main/resources/assets/basepower/models/block/steel_frame.json
similarity index 94%
rename from src/main/resources/assets/poweradvantage/models/block/steel_frame.json
rename to src/main/resources/assets/basepower/models/block/steel_frame.json
index 6e5ef04..a423e34 100644
--- a/src/main/resources/assets/poweradvantage/models/block/steel_frame.json
+++ b/src/main/resources/assets/basepower/models/block/steel_frame.json
@@ -1,8 +1,8 @@
{
"parent": "block/block",
"textures": {
- "face": "poweradvantage:blocks/steel_frame",
- "particle": "poweradvantage:materials/steel"
+ "face": "basepower:blocks/steel_frame",
+ "particle": "basepower:materials/steel"
},
"elements": [
{
diff --git a/src/main/resources/assets/poweradvantage/models/block/still_off.json b/src/main/resources/assets/basepower/models/block/still_off.json
similarity index 96%
rename from src/main/resources/assets/poweradvantage/models/block/still_off.json
rename to src/main/resources/assets/basepower/models/block/still_off.json
index 132b402..8918690 100644
--- a/src/main/resources/assets/poweradvantage/models/block/still_off.json
+++ b/src/main/resources/assets/basepower/models/block/still_off.json
@@ -4,8 +4,8 @@
"top": "blocks/furnace_top",
"front": "blocks/furnace_front_off",
"side": "blocks/furnace_side",
- "tank": "poweradvantage:materials/steel",
- "particle": "poweradvantage:materials/steel"
+ "tank": "basepower:materials/steel",
+ "particle": "basepower:materials/steel"
},
"elements": [
{
diff --git a/src/main/resources/assets/poweradvantage/models/block/still_on.json b/src/main/resources/assets/basepower/models/block/still_on.json
similarity index 96%
rename from src/main/resources/assets/poweradvantage/models/block/still_on.json
rename to src/main/resources/assets/basepower/models/block/still_on.json
index 399a8e4..2e3bb66 100644
--- a/src/main/resources/assets/poweradvantage/models/block/still_on.json
+++ b/src/main/resources/assets/basepower/models/block/still_on.json
@@ -4,8 +4,8 @@
"top": "blocks/furnace_top",
"front": "blocks/furnace_front_on",
"side": "blocks/furnace_side",
- "tank": "poweradvantage:materials/steel",
- "particle": "poweradvantage:materials/steel"
+ "tank": "basepower:materials/steel",
+ "particle": "basepower:materials/steel"
},
"elements": [
{
diff --git a/src/main/resources/assets/basepower/models/item/bioplastic_ingot.json b/src/main/resources/assets/basepower/models/item/bioplastic_ingot.json
new file mode 100644
index 0000000..96b8cfd
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/bioplastic_ingot.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "basepower:items/bioplastic_ingot"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/bucket_crude_oil.json b/src/main/resources/assets/basepower/models/item/bucket_crude_oil.json
new file mode 100644
index 0000000..bc0182f
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/bucket_crude_oil.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "basepower:items/bucket_crude_oil"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/item/bucket_refined_oil.json b/src/main/resources/assets/basepower/models/item/bucket_refined_oil.json
new file mode 100644
index 0000000..145160a
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/bucket_refined_oil.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "basepower:items/bucket_refined_oil"
+ }
+}
diff --git a/src/main/resources/assets/basepower/models/item/converter_rf_electricity.json b/src/main/resources/assets/basepower/models/item/converter_rf_electricity.json
new file mode 100644
index 0000000..8016dd4
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/converter_rf_electricity.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/converter_rf_electricity"
+}
diff --git a/src/main/resources/assets/basepower/models/item/converter_rf_quantum.json b/src/main/resources/assets/basepower/models/item/converter_rf_quantum.json
new file mode 100644
index 0000000..20bffbe
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/converter_rf_quantum.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/converter_rf_quantum"
+}
diff --git a/src/main/resources/assets/basepower/models/item/converter_rf_steam.json b/src/main/resources/assets/basepower/models/item/converter_rf_steam.json
new file mode 100644
index 0000000..77e6147
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/converter_rf_steam.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/converter_rf_steam"
+}
diff --git a/src/main/resources/assets/basepower/models/item/converter_tr_electricity.json b/src/main/resources/assets/basepower/models/item/converter_tr_electricity.json
new file mode 100644
index 0000000..8c54bb8
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/converter_tr_electricity.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/converter_tr_electricity"
+}
diff --git a/src/main/resources/assets/basepower/models/item/fluid_discharge.json b/src/main/resources/assets/basepower/models/item/fluid_discharge.json
new file mode 100644
index 0000000..d9af146
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/fluid_discharge.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/fluid_discharge"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/fluid_drain.json b/src/main/resources/assets/basepower/models/item/fluid_drain.json
new file mode 100644
index 0000000..60de5a6
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/fluid_drain.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/fluid_drain"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/fluid_metal_tank.json b/src/main/resources/assets/basepower/models/item/fluid_metal_tank.json
new file mode 100644
index 0000000..cc8c605
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/fluid_metal_tank.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/fluid_metal_tank"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/fluid_pipe.json b/src/main/resources/assets/basepower/models/item/fluid_pipe.json
new file mode 100644
index 0000000..2cfca62
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/fluid_pipe.json
@@ -0,0 +1,4 @@
+{
+ "parent": "basepower:block/fluid_pipe_ns",
+ "ambientocclusion": false
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/fluid_pipe_terminal.json b/src/main/resources/assets/basepower/models/item/fluid_pipe_terminal.json
new file mode 100644
index 0000000..2cfca62
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/fluid_pipe_terminal.json
@@ -0,0 +1,4 @@
+{
+ "parent": "basepower:block/fluid_pipe_ns",
+ "ambientocclusion": false
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/fluid_storage_tank.json b/src/main/resources/assets/basepower/models/item/fluid_storage_tank.json
new file mode 100644
index 0000000..33831e3
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/fluid_storage_tank.json
@@ -0,0 +1,4 @@
+{
+ "parent": "basepower:block/fluid_storage_tank",
+ "ambientocclusion": false
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/fluid_switch.json b/src/main/resources/assets/basepower/models/item/fluid_switch.json
new file mode 100644
index 0000000..e62bd15
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/fluid_switch.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/fluid_switch_on"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/infinite_electricity.json b/src/main/resources/assets/basepower/models/item/infinite_electricity.json
new file mode 100644
index 0000000..a1abf24
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/infinite_electricity.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/infinite_electricity"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/infinite_quantum.json b/src/main/resources/assets/basepower/models/item/infinite_quantum.json
new file mode 100644
index 0000000..53b56dd
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/infinite_quantum.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/infinite_quantum"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/infinite_steam.json b/src/main/resources/assets/basepower/models/item/infinite_steam.json
new file mode 100644
index 0000000..e8f9061
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/infinite_steam.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/infinite_steam"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/item_conveyor.json b/src/main/resources/assets/basepower/models/item/item_conveyor.json
new file mode 100644
index 0000000..f042d83
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/item_conveyor.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/item_conveyor"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/item_filter_block.json b/src/main/resources/assets/basepower/models/item/item_filter_block.json
new file mode 100644
index 0000000..e820da7
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/item_filter_block.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/item_filter_block"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/item_filter_food.json b/src/main/resources/assets/basepower/models/item/item_filter_food.json
new file mode 100644
index 0000000..96db616
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/item_filter_food.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/item_filter_food"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/item_filter_fuel.json b/src/main/resources/assets/basepower/models/item/item_filter_fuel.json
new file mode 100644
index 0000000..1399fb3
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/item_filter_fuel.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/item_filter_fuel"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/item_filter_inventory.json b/src/main/resources/assets/basepower/models/item/item_filter_inventory.json
new file mode 100644
index 0000000..03a135d
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/item_filter_inventory.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/item_filter_inventory"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/item_filter_ore.json b/src/main/resources/assets/basepower/models/item/item_filter_ore.json
new file mode 100644
index 0000000..7a44c34
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/item_filter_ore.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/item_filter_ore"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/item_filter_overflow.json b/src/main/resources/assets/basepower/models/item/item_filter_overflow.json
new file mode 100644
index 0000000..caac642
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/item_filter_overflow.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/item_filter_overflow"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/item_filter_plant.json b/src/main/resources/assets/basepower/models/item/item_filter_plant.json
new file mode 100644
index 0000000..40beb7a
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/item_filter_plant.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/item_filter_plant"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/item_filter_smelt.json b/src/main/resources/assets/basepower/models/item/item_filter_smelt.json
new file mode 100644
index 0000000..5386d84
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/item_filter_smelt.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/item_filter_smelt"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/rotator_tool.json b/src/main/resources/assets/basepower/models/item/rotator_tool.json
similarity index 50%
rename from src/main/resources/assets/poweradvantage/models/item/rotator_tool.json
rename to src/main/resources/assets/basepower/models/item/rotator_tool.json
index 498abaf..e096fa4 100644
--- a/src/main/resources/assets/poweradvantage/models/item/rotator_tool.json
+++ b/src/main/resources/assets/basepower/models/item/rotator_tool.json
@@ -1,6 +1,6 @@
{
"parent": "item/handheld",
"textures": {
- "layer0": "poweradvantage:items/rotator_tool"
+ "layer0": "basepower:items/rotator_tool"
}
}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/sprocket.json b/src/main/resources/assets/basepower/models/item/sprocket.json
similarity index 53%
rename from src/main/resources/assets/poweradvantage/models/item/sprocket.json
rename to src/main/resources/assets/basepower/models/item/sprocket.json
index f26d464..8555e9f 100644
--- a/src/main/resources/assets/poweradvantage/models/item/sprocket.json
+++ b/src/main/resources/assets/basepower/models/item/sprocket.json
@@ -1,6 +1,6 @@
{
"parent": "item/generated",
"textures": {
- "layer0": "poweradvantage:items/sprocket"
+ "layer0": "basepower:items/sprocket"
}
}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/starch.json b/src/main/resources/assets/basepower/models/item/starch.json
similarity index 54%
rename from src/main/resources/assets/poweradvantage/models/item/starch.json
rename to src/main/resources/assets/basepower/models/item/starch.json
index ac3db87..5e9dbcf 100644
--- a/src/main/resources/assets/poweradvantage/models/item/starch.json
+++ b/src/main/resources/assets/basepower/models/item/starch.json
@@ -1,6 +1,6 @@
{
"parent": "item/generated",
"textures": {
- "layer0": "poweradvantage:items/starch"
+ "layer0": "basepower:items/starch"
}
}
\ No newline at end of file
diff --git a/src/main/resources/assets/basepower/models/item/steel_frame.json b/src/main/resources/assets/basepower/models/item/steel_frame.json
new file mode 100644
index 0000000..78e655e
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/steel_frame.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/steel_frame"
+}
diff --git a/src/main/resources/assets/basepower/models/item/still.json b/src/main/resources/assets/basepower/models/item/still.json
new file mode 100644
index 0000000..74f0491
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/item/still.json
@@ -0,0 +1,3 @@
+{
+ "parent": "basepower:block/still_off"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_flow.png b/src/main/resources/assets/basepower/textures/blocks/crude_oil_flow.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_flow.png
rename to src/main/resources/assets/basepower/textures/blocks/crude_oil_flow.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_flow.png.mcmeta b/src/main/resources/assets/basepower/textures/blocks/crude_oil_flow.png.mcmeta
similarity index 91%
rename from src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_flow.png.mcmeta
rename to src/main/resources/assets/basepower/textures/blocks/crude_oil_flow.png.mcmeta
index de3267f..4f0718a 100644
--- a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_flow.png.mcmeta
+++ b/src/main/resources/assets/basepower/textures/blocks/crude_oil_flow.png.mcmeta
@@ -1,3 +1,3 @@
-{
- "animation": {}
+{
+ "animation": {}
}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_still.png b/src/main/resources/assets/basepower/textures/blocks/crude_oil_still.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_still.png
rename to src/main/resources/assets/basepower/textures/blocks/crude_oil_still.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_still.png.mcmeta b/src/main/resources/assets/basepower/textures/blocks/crude_oil_still.png.mcmeta
similarity index 89%
rename from src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_still.png.mcmeta
rename to src/main/resources/assets/basepower/textures/blocks/crude_oil_still.png.mcmeta
index 4b721e0..0645f48 100644
--- a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_still.png.mcmeta
+++ b/src/main/resources/assets/basepower/textures/blocks/crude_oil_still.png.mcmeta
@@ -1,5 +1,5 @@
-{
- "animation": {
- "frametime": 2
- }
-}
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_bottom.png b/src/main/resources/assets/basepower/textures/blocks/filter_bottom.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_bottom.png
rename to src/main/resources/assets/basepower/textures/blocks/filter_bottom.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_block.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_block.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_block.png
rename to src/main/resources/assets/basepower/textures/blocks/filter_side_block.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_food.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_food.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_food.png
rename to src/main/resources/assets/basepower/textures/blocks/filter_side_food.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_fuel.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_fuel.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_fuel.png
rename to src/main/resources/assets/basepower/textures/blocks/filter_side_fuel.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_inventory.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_inventory.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_inventory.png
rename to src/main/resources/assets/basepower/textures/blocks/filter_side_inventory.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_ore.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_ore.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_ore.png
rename to src/main/resources/assets/basepower/textures/blocks/filter_side_ore.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_overflow.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_overflow.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_overflow.png
rename to src/main/resources/assets/basepower/textures/blocks/filter_side_overflow.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_plantable.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_plantable.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_plantable.png
rename to src/main/resources/assets/basepower/textures/blocks/filter_side_plantable.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_smeltable.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_smeltable.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_smeltable.png
rename to src/main/resources/assets/basepower/textures/blocks/filter_side_smeltable.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_discharge_face.png b/src/main/resources/assets/basepower/textures/blocks/fluid_discharge_face.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_discharge_face.png
rename to src/main/resources/assets/basepower/textures/blocks/fluid_discharge_face.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_discharge_side.png b/src/main/resources/assets/basepower/textures/blocks/fluid_discharge_side.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_discharge_side.png
rename to src/main/resources/assets/basepower/textures/blocks/fluid_discharge_side.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_drain_face.png b/src/main/resources/assets/basepower/textures/blocks/fluid_drain_face.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_drain_face.png
rename to src/main/resources/assets/basepower/textures/blocks/fluid_drain_face.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_drain_side.png b/src/main/resources/assets/basepower/textures/blocks/fluid_drain_side.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_drain_side.png
rename to src/main/resources/assets/basepower/textures/blocks/fluid_drain_side.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_metal_tank_side.png b/src/main/resources/assets/basepower/textures/blocks/fluid_metal_tank_side.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_metal_tank_side.png
rename to src/main/resources/assets/basepower/textures/blocks/fluid_metal_tank_side.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_metal_tank_top.png b/src/main/resources/assets/basepower/textures/blocks/fluid_metal_tank_top.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_metal_tank_top.png
rename to src/main/resources/assets/basepower/textures/blocks/fluid_metal_tank_top.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_pipe.png b/src/main/resources/assets/basepower/textures/blocks/fluid_pipe.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_pipe.png
rename to src/main/resources/assets/basepower/textures/blocks/fluid_pipe.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_switch_off.png b/src/main/resources/assets/basepower/textures/blocks/fluid_switch_off.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_switch_off.png
rename to src/main/resources/assets/basepower/textures/blocks/fluid_switch_off.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_switch_on.png b/src/main/resources/assets/basepower/textures/blocks/fluid_switch_on.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_switch_on.png
rename to src/main/resources/assets/basepower/textures/blocks/fluid_switch_on.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_end.png b/src/main/resources/assets/basepower/textures/blocks/item_conveyor_end.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_end.png
rename to src/main/resources/assets/basepower/textures/blocks/item_conveyor_end.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_side.png b/src/main/resources/assets/basepower/textures/blocks/item_conveyor_side.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_side.png
rename to src/main/resources/assets/basepower/textures/blocks/item_conveyor_side.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_top.png b/src/main/resources/assets/basepower/textures/blocks/item_conveyor_top.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_top.png
rename to src/main/resources/assets/basepower/textures/blocks/item_conveyor_top.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/metal_panel.png b/src/main/resources/assets/basepower/textures/blocks/metal_panel.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/metal_panel.png
rename to src/main/resources/assets/basepower/textures/blocks/metal_panel.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/powercable.png b/src/main/resources/assets/basepower/textures/blocks/powercable.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/powercable.png
rename to src/main/resources/assets/basepower/textures/blocks/powercable.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_flow.png b/src/main/resources/assets/basepower/textures/blocks/refined_oil_flow.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_flow.png
rename to src/main/resources/assets/basepower/textures/blocks/refined_oil_flow.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_flow.png.mcmeta b/src/main/resources/assets/basepower/textures/blocks/refined_oil_flow.png.mcmeta
similarity index 91%
rename from src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_flow.png.mcmeta
rename to src/main/resources/assets/basepower/textures/blocks/refined_oil_flow.png.mcmeta
index de3267f..4f0718a 100644
--- a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_flow.png.mcmeta
+++ b/src/main/resources/assets/basepower/textures/blocks/refined_oil_flow.png.mcmeta
@@ -1,3 +1,3 @@
-{
- "animation": {}
+{
+ "animation": {}
}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_still.png b/src/main/resources/assets/basepower/textures/blocks/refined_oil_still.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_still.png
rename to src/main/resources/assets/basepower/textures/blocks/refined_oil_still.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_still.png.mcmeta b/src/main/resources/assets/basepower/textures/blocks/refined_oil_still.png.mcmeta
similarity index 89%
rename from src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_still.png.mcmeta
rename to src/main/resources/assets/basepower/textures/blocks/refined_oil_still.png.mcmeta
index 4b721e0..0645f48 100644
--- a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_still.png.mcmeta
+++ b/src/main/resources/assets/basepower/textures/blocks/refined_oil_still.png.mcmeta
@@ -1,5 +1,5 @@
-{
- "animation": {
- "frametime": 2
- }
-}
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/steel_frame.png b/src/main/resources/assets/basepower/textures/blocks/steel_frame.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/steel_frame.png
rename to src/main/resources/assets/basepower/textures/blocks/steel_frame.png
diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/techreborn_converter.png b/src/main/resources/assets/basepower/textures/blocks/techreborn_converter.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/blocks/techreborn_converter.png
rename to src/main/resources/assets/basepower/textures/blocks/techreborn_converter.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/fluid_discharge_gui.png b/src/main/resources/assets/basepower/textures/gui/container/fluid_discharge_gui.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/fluid_discharge_gui.png
rename to src/main/resources/assets/basepower/textures/gui/container/fluid_discharge_gui.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/fluid_drain_gui.png b/src/main/resources/assets/basepower/textures/gui/container/fluid_drain_gui.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/fluid_drain_gui.png
rename to src/main/resources/assets/basepower/textures/gui/container/fluid_drain_gui.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/fluid_metal_tank_gui.png b/src/main/resources/assets/basepower/textures/gui/container/fluid_metal_tank_gui.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/fluid_metal_tank_gui.png
rename to src/main/resources/assets/basepower/textures/gui/container/fluid_metal_tank_gui.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/fluid_storage_tank_gui.png b/src/main/resources/assets/basepower/textures/gui/container/fluid_storage_tank_gui.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/fluid_storage_tank_gui.png
rename to src/main/resources/assets/basepower/textures/gui/container/fluid_storage_tank_gui.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor.png
rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_block.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_block.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_block.png
rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_block.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_food.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_food.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_food.png
rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_food.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_fuel.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_fuel.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_fuel.png
rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_fuel.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_inventory.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_inventory.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_inventory.png
rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_inventory.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_ore.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_ore.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_ore.png
rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_ore.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_overflow.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_overflow.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_overflow.png
rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_overflow.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_plant.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_plant.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_plant.png
rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_plant.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_smelt.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_smelt.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_smelt.png
rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_smelt.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/machineGUI_template.png b/src/main/resources/assets/basepower/textures/gui/container/machineGUI_template.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/machineGUI_template.png
rename to src/main/resources/assets/basepower/textures/gui/container/machineGUI_template.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/player_inventory.png b/src/main/resources/assets/basepower/textures/gui/container/player_inventory.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/player_inventory.png
rename to src/main/resources/assets/basepower/textures/gui/container/player_inventory.png
diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/still_gui.png b/src/main/resources/assets/basepower/textures/gui/container/still_gui.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/gui/container/still_gui.png
rename to src/main/resources/assets/basepower/textures/gui/container/still_gui.png
diff --git a/src/main/resources/assets/poweradvantage/textures/items/bioplastic_ingot.png b/src/main/resources/assets/basepower/textures/items/bioplastic_ingot.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/items/bioplastic_ingot.png
rename to src/main/resources/assets/basepower/textures/items/bioplastic_ingot.png
diff --git a/src/main/resources/assets/poweradvantage/textures/items/bucket_crude_oil.png b/src/main/resources/assets/basepower/textures/items/bucket_crude_oil.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/items/bucket_crude_oil.png
rename to src/main/resources/assets/basepower/textures/items/bucket_crude_oil.png
diff --git a/src/main/resources/assets/poweradvantage/textures/items/bucket_refined_oil.png b/src/main/resources/assets/basepower/textures/items/bucket_refined_oil.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/items/bucket_refined_oil.png
rename to src/main/resources/assets/basepower/textures/items/bucket_refined_oil.png
diff --git a/src/main/resources/assets/poweradvantage/textures/items/rotator_tool.png b/src/main/resources/assets/basepower/textures/items/rotator_tool.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/items/rotator_tool.png
rename to src/main/resources/assets/basepower/textures/items/rotator_tool.png
diff --git a/src/main/resources/assets/poweradvantage/textures/items/sprocket.png b/src/main/resources/assets/basepower/textures/items/sprocket.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/items/sprocket.png
rename to src/main/resources/assets/basepower/textures/items/sprocket.png
diff --git a/src/main/resources/assets/poweradvantage/textures/items/starch.png b/src/main/resources/assets/basepower/textures/items/starch.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/items/starch.png
rename to src/main/resources/assets/basepower/textures/items/starch.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/brass.png b/src/main/resources/assets/basepower/textures/materials/brass.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/brass.png
rename to src/main/resources/assets/basepower/textures/materials/brass.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/copper.png b/src/main/resources/assets/basepower/textures/materials/copper.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/copper.png
rename to src/main/resources/assets/basepower/textures/materials/copper.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/invar.png b/src/main/resources/assets/basepower/textures/materials/invar.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/invar.png
rename to src/main/resources/assets/basepower/textures/materials/invar.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/iron.png b/src/main/resources/assets/basepower/textures/materials/iron.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/iron.png
rename to src/main/resources/assets/basepower/textures/materials/iron.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/metal_panel.png b/src/main/resources/assets/basepower/textures/materials/metal_panel.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/metal_panel.png
rename to src/main/resources/assets/basepower/textures/materials/metal_panel.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/plastic.png b/src/main/resources/assets/basepower/textures/materials/plastic.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/plastic.png
rename to src/main/resources/assets/basepower/textures/materials/plastic.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/steel.png b/src/main/resources/assets/basepower/textures/materials/steel.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/steel.png
rename to src/main/resources/assets/basepower/textures/materials/steel.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/steel_dark.png b/src/main/resources/assets/basepower/textures/materials/steel_dark.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/steel_dark.png
rename to src/main/resources/assets/basepower/textures/materials/steel_dark.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/stone.png b/src/main/resources/assets/basepower/textures/materials/stone.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/stone.png
rename to src/main/resources/assets/basepower/textures/materials/stone.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/stone_brick.png b/src/main/resources/assets/basepower/textures/materials/stone_brick.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/stone_brick.png
rename to src/main/resources/assets/basepower/textures/materials/stone_brick.png
diff --git a/src/main/resources/assets/poweradvantage/textures/materials/wood.png b/src/main/resources/assets/basepower/textures/materials/wood.png
similarity index 100%
rename from src/main/resources/assets/poweradvantage/textures/materials/wood.png
rename to src/main/resources/assets/basepower/textures/materials/wood.png
diff --git a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_electricity.json b/src/main/resources/assets/poweradvantage/blockstates/converter_rf_electricity.json
deleted file mode 100644
index 97d881e..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_electricity.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:converter_rf_electricity", "y": 90 },
- "facing=north": { "model": "poweradvantage:converter_rf_electricity" },
- "facing=south": { "model": "poweradvantage:converter_rf_electricity", "y": 180 },
- "facing=west": { "model": "poweradvantage:converter_rf_electricity", "y": 270 }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_quantum.json b/src/main/resources/assets/poweradvantage/blockstates/converter_rf_quantum.json
deleted file mode 100644
index 5e28590..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_quantum.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:converter_rf_quantum", "y": 90 },
- "facing=north": { "model": "poweradvantage:converter_rf_quantum" },
- "facing=south": { "model": "poweradvantage:converter_rf_quantum", "y": 180 },
- "facing=west": { "model": "poweradvantage:converter_rf_quantum", "y": 270 }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_steam.json b/src/main/resources/assets/poweradvantage/blockstates/converter_rf_steam.json
deleted file mode 100644
index 110dd84..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_steam.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:converter_rf_steam", "y": 90 },
- "facing=north": { "model": "poweradvantage:converter_rf_steam" },
- "facing=south": { "model": "poweradvantage:converter_rf_steam", "y": 180 },
- "facing=west": { "model": "poweradvantage:converter_rf_steam", "y": 270 }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/converter_tr_electricity.json b/src/main/resources/assets/poweradvantage/blockstates/converter_tr_electricity.json
deleted file mode 100644
index f3c6942..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/converter_tr_electricity.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:converter_tr_electricity", "y": 90 },
- "facing=north": { "model": "poweradvantage:converter_tr_electricity" },
- "facing=south": { "model": "poweradvantage:converter_tr_electricity", "y": 180 },
- "facing=west": { "model": "poweradvantage:converter_tr_electricity", "y": 270 }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_discharge.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_discharge.json
deleted file mode 100644
index 33f9842..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/fluid_discharge.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:fluid_discharge", "y": 90 },
- "facing=north": { "model": "poweradvantage:fluid_discharge" },
- "facing=south": { "model": "poweradvantage:fluid_discharge", "y": 180 },
- "facing=west": { "model": "poweradvantage:fluid_discharge", "y": 270 }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_drain.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_drain.json
deleted file mode 100644
index 3997fee..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/fluid_drain.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:fluid_drain", "y": 90 },
- "facing=north": { "model": "poweradvantage:fluid_drain" },
- "facing=south": { "model": "poweradvantage:fluid_drain", "y": 180 },
- "facing=west": { "model": "poweradvantage:fluid_drain", "y": 270 }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_metal_tank.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_metal_tank.json
deleted file mode 100644
index 167fb81..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/fluid_metal_tank.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:fluid_metal_tank", "y": 90, "uvlock": true },
- "facing=north": { "model": "poweradvantage:fluid_metal_tank", "uvlock": true },
- "facing=south": { "model": "poweradvantage:fluid_metal_tank", "y": 180, "uvlock": true },
- "facing=west": { "model": "poweradvantage:fluid_metal_tank", "y": 270, "uvlock": true }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe.json
deleted file mode 100644
index 3d94554..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "__comment": "blockstate parameters MUST be in alphabetical order!",
- "variants": {
- "down=false,east=false,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false },
- "down=true,east=false,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 90, "y": 0, "uvlock": false },
- "down=false,east=true,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=false,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=false,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 180, "uvlock": false },
- "down=false,east=false,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 270, "y": 0, "uvlock": false },
- "down=false,east=false,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 270, "uvlock": false },
- "down=true,east=true,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 180, "uvlock": false },
- "down=true,east=false,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 90, "uvlock": false },
- "down=true,east=false,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 270, "uvlock": false },
- "down=true,east=false,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_ns", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=false,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 0, "uvlock": false },
- "down=false,east=true,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=true,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 180, "uvlock": false },
- "down=false,east=true,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 180, "uvlock": false },
- "down=false,east=true,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_ns", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=false,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_ns", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=false,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 90, "uvlock": false },
- "down=false,east=false,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=false,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 270, "uvlock": false },
- "down=false,east=false,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 270, "uvlock": false },
- "down=false,east=false,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 0, "uvlock": false },
- "down=true,east=true,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 90, "uvlock": false },
- "down=true,east=true,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 180, "uvlock": false },
- "down=true,east=true,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 90, "uvlock": false },
- "down=true,east=true,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 90, "y": 90, "uvlock": false },
- "down=true,east=false,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=false,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 0, "uvlock": false },
- "down=true,east=false,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=false,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 180, "uvlock": false },
- "down=true,east=false,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 270, "uvlock": false },
- "down=true,east=false,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 270, "uvlock": false },
- "down=false,east=true,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 180, "uvlock": false },
- "down=false,east=true,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=true,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=true,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 180, "uvlock": false },
- "down=false,east=true,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 270, "uvlock": false },
- "down=false,east=true,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 270, "y": 90, "uvlock": false },
- "down=false,east=false,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 270, "y": 0, "uvlock": false },
- "down=false,east=false,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=false,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=false,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 270, "uvlock": false },
- "down=true,east=true,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 180, "uvlock": false },
- "down=true,east=true,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 90, "uvlock": false },
- "down=true,east=true,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 90, "uvlock": false },
- "down=true,east=true,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 180, "uvlock": false },
- "down=true,east=true,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 270, "uvlock": false },
- "down=true,east=true,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_ensw", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=false,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_ensw", "x": 90, "y": 90, "uvlock": false },
- "down=true,east=false,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 0, "uvlock": false },
- "down=true,east=false,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=false,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 270, "uvlock": false },
- "down=false,east=true,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 180, "uvlock": false },
- "down=false,east=true,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=true,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=true,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 270, "uvlock": false },
- "down=false,east=false,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 0, "uvlock": false },
- "down=true,east=true,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 270, "uvlock": false },
- "down=true,east=true,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 270, "y": 0, "uvlock": false },
- "down=true,east=true,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 180, "uvlock": false },
- "down=true,east=true,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 0, "uvlock": false },
- "down=true,east=false,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=true,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=true,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_densuw", "x": 0, "y": 0, "uvlock": false }
-
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe_terminal.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe_terminal.json
deleted file mode 100644
index a6e7720..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe_terminal.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "__comment": "blockstate parameters MUST be in alphabetical order!",
- "variants": {
- "down=false,east=false,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_0", "x": 0, "y": 0, "uvlock": false },
- "down=true,east=false,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 90, "y": 0, "uvlock": false },
- "down=false,east=true,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=false,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=false,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 180, "uvlock": false },
- "down=false,east=false,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 270, "y": 0, "uvlock": false },
- "down=false,east=false,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 270, "uvlock": false },
- "down=true,east=true,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 180, "uvlock": false },
- "down=true,east=false,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 90, "uvlock": false },
- "down=true,east=false,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 270, "uvlock": false },
- "down=true,east=false,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_ns", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=false,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 0, "uvlock": false },
- "down=false,east=true,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=true,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 180, "uvlock": false },
- "down=false,east=true,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 180, "uvlock": false },
- "down=false,east=true,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_ns", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=false,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_ns", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=false,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 90, "uvlock": false },
- "down=false,east=false,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=false,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 270, "uvlock": false },
- "down=false,east=false,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 270, "uvlock": false },
- "down=false,east=false,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 0, "uvlock": false },
- "down=true,east=true,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 90, "uvlock": false },
- "down=true,east=true,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 180, "uvlock": false },
- "down=true,east=true,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 90, "uvlock": false },
- "down=true,east=true,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 90, "y": 90, "uvlock": false },
- "down=true,east=false,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=false,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 0, "uvlock": false },
- "down=true,east=false,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=false,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 180, "uvlock": false },
- "down=true,east=false,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 270, "uvlock": false },
- "down=true,east=false,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 270, "uvlock": false },
- "down=false,east=true,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 180, "uvlock": false },
- "down=false,east=true,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=true,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=true,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 180, "uvlock": false },
- "down=false,east=true,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 270, "uvlock": false },
- "down=false,east=true,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 270, "y": 90, "uvlock": false },
- "down=false,east=false,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 270, "y": 0, "uvlock": false },
- "down=false,east=false,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=false,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=false,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 270, "uvlock": false },
- "down=true,east=true,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 180, "uvlock": false },
- "down=true,east=true,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 90, "uvlock": false },
- "down=true,east=true,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 90, "uvlock": false },
- "down=true,east=true,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 180, "uvlock": false },
- "down=true,east=true,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 270, "uvlock": false },
- "down=true,east=true,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_ensw", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=false,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_ensw", "x": 90, "y": 90, "uvlock": false },
- "down=true,east=false,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 0, "uvlock": false },
- "down=true,east=false,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=false,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 270, "uvlock": false },
- "down=false,east=true,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 180, "uvlock": false },
- "down=false,east=true,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false },
- "down=false,east=true,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=true,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 270, "uvlock": false },
- "down=false,east=false,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 0, "uvlock": false },
- "down=true,east=true,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 270, "uvlock": false },
- "down=true,east=true,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 270, "y": 0, "uvlock": false },
- "down=true,east=true,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 180, "uvlock": false },
- "down=true,east=true,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 0, "uvlock": false },
- "down=true,east=false,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 90, "uvlock": false },
- "down=false,east=true,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 90, "y": 0, "uvlock": false },
- "down=true,east=true,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_densuw", "x": 0, "y": 0, "uvlock": false }
-
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_storage_tank.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_storage_tank.json
deleted file mode 100644
index 1becb1c..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/fluid_storage_tank.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:fluid_storage_tank", "y": 90 },
- "facing=north": { "model": "poweradvantage:fluid_storage_tank" },
- "facing=south": { "model": "poweradvantage:fluid_storage_tank", "y": 180 },
- "facing=west": { "model": "poweradvantage:fluid_storage_tank", "y": 270 }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_switch.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_switch.json
deleted file mode 100644
index a3e5b65..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/fluid_switch.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "variants": {
- "active=false": { "model": "poweradvantage:fluid_switch_off"},
- "active=true": { "model": "poweradvantage:fluid_switch_on"}
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/infinite_electricity.json b/src/main/resources/assets/poweradvantage/blockstates/infinite_electricity.json
deleted file mode 100644
index 8cc55cc..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/infinite_electricity.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:infinite_electricity", "y": 90 },
- "facing=north": { "model": "poweradvantage:infinite_electricity" },
- "facing=south": { "model": "poweradvantage:infinite_electricity", "y": 180 },
- "facing=west": { "model": "poweradvantage:infinite_electricity", "y": 270 }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/infinite_quantum.json b/src/main/resources/assets/poweradvantage/blockstates/infinite_quantum.json
deleted file mode 100644
index 7ba2ae4..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/infinite_quantum.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:infinite_quantum", "y": 90 },
- "facing=north": { "model": "poweradvantage:infinite_quantum" },
- "facing=south": { "model": "poweradvantage:infinite_quantum", "y": 180 },
- "facing=west": { "model": "poweradvantage:infinite_quantum", "y": 270 }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/infinite_steam.json b/src/main/resources/assets/poweradvantage/blockstates/infinite_steam.json
deleted file mode 100644
index ea59a65..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/infinite_steam.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=east": { "model": "poweradvantage:infinite_steam", "y": 90 },
- "facing=north": { "model": "poweradvantage:infinite_steam" },
- "facing=south": { "model": "poweradvantage:infinite_steam", "y": 180 },
- "facing=west": { "model": "poweradvantage:infinite_steam", "y": 270 }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_conveyor.json b/src/main/resources/assets/poweradvantage/blockstates/item_conveyor.json
deleted file mode 100644
index f000863..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/item_conveyor.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "variants": {
- "facing=down": { "model": "poweradvantage:item_conveyor", "x": 90 },
- "facing=up": { "model": "poweradvantage:item_conveyor", "x": 270 },
- "facing=north": { "model": "poweradvantage:item_conveyor" },
- "facing=south": { "model": "poweradvantage:item_conveyor", "y": 180 },
- "facing=west": { "model": "poweradvantage:item_conveyor", "y": 270 },
- "facing=east": { "model": "poweradvantage:item_conveyor", "y": 90 }
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_block.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_block.json
deleted file mode 100644
index 9ac2714..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_block.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=north": { "model": "poweradvantage:item_filter_block" },
- "facing=south": { "model": "poweradvantage:item_filter_block", "y": 180 },
- "facing=west": { "model": "poweradvantage:item_filter_block", "y": 270 },
- "facing=east": { "model": "poweradvantage:item_filter_block", "y": 90 }
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_food.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_food.json
deleted file mode 100644
index f3d0201..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_food.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=north": { "model": "poweradvantage:item_filter_food" },
- "facing=south": { "model": "poweradvantage:item_filter_food", "y": 180 },
- "facing=west": { "model": "poweradvantage:item_filter_food", "y": 270 },
- "facing=east": { "model": "poweradvantage:item_filter_food", "y": 90 }
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_fuel.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_fuel.json
deleted file mode 100644
index e3ddd50..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_fuel.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=north": { "model": "poweradvantage:item_filter_fuel" },
- "facing=south": { "model": "poweradvantage:item_filter_fuel", "y": 180 },
- "facing=west": { "model": "poweradvantage:item_filter_fuel", "y": 270 },
- "facing=east": { "model": "poweradvantage:item_filter_fuel", "y": 90 }
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_inventory.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_inventory.json
deleted file mode 100644
index cb50460..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_inventory.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=north": { "model": "poweradvantage:item_filter_inventory" },
- "facing=south": { "model": "poweradvantage:item_filter_inventory", "y": 180 },
- "facing=west": { "model": "poweradvantage:item_filter_inventory", "y": 270 },
- "facing=east": { "model": "poweradvantage:item_filter_inventory", "y": 90 }
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_ore.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_ore.json
deleted file mode 100644
index 9983ebc..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_ore.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=north": { "model": "poweradvantage:item_filter_ore" },
- "facing=south": { "model": "poweradvantage:item_filter_ore", "y": 180 },
- "facing=west": { "model": "poweradvantage:item_filter_ore", "y": 270 },
- "facing=east": { "model": "poweradvantage:item_filter_ore", "y": 90 }
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_overflow.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_overflow.json
deleted file mode 100644
index cae43ed..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_overflow.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=north": { "model": "poweradvantage:item_filter_overflow" },
- "facing=south": { "model": "poweradvantage:item_filter_overflow", "y": 180 },
- "facing=west": { "model": "poweradvantage:item_filter_overflow", "y": 270 },
- "facing=east": { "model": "poweradvantage:item_filter_overflow", "y": 90 }
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_plant.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_plant.json
deleted file mode 100644
index ac947ea..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_plant.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=north": { "model": "poweradvantage:item_filter_plant" },
- "facing=south": { "model": "poweradvantage:item_filter_plant", "y": 180 },
- "facing=west": { "model": "poweradvantage:item_filter_plant", "y": 270 },
- "facing=east": { "model": "poweradvantage:item_filter_plant", "y": 90 }
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_smelt.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_smelt.json
deleted file mode 100644
index 072ae29..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_smelt.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "variants": {
- "facing=north": { "model": "poweradvantage:item_filter_smelt" },
- "facing=south": { "model": "poweradvantage:item_filter_smelt", "y": 180 },
- "facing=west": { "model": "poweradvantage:item_filter_smelt", "y": 270 },
- "facing=east": { "model": "poweradvantage:item_filter_smelt", "y": 90 }
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/blockstates/steel_frame.json b/src/main/resources/assets/poweradvantage/blockstates/steel_frame.json
deleted file mode 100644
index c39fa3b..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/steel_frame.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "variants": {
- "normal": { "model": "poweradvantage:steel_frame" }
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/blockstates/still.json b/src/main/resources/assets/poweradvantage/blockstates/still.json
deleted file mode 100644
index bcd36cb..0000000
--- a/src/main/resources/assets/poweradvantage/blockstates/still.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "variants": {
- "active=false,facing=east": { "model": "poweradvantage:still_off", "y": 90 },
- "active=false,facing=north": { "model": "poweradvantage:still_off"},
- "active=false,facing=south": { "model": "poweradvantage:still_off", "y": 180},
- "active=false,facing=west": { "model": "poweradvantage:still_off", "y": 270},
- "active=true,facing=east": { "model": "poweradvantage:still_on", "y": 90 },
- "active=true,facing=north": { "model": "poweradvantage:still_on"},
- "active=true,facing=south": { "model": "poweradvantage:still_on", "y": 180},
- "active=true,facing=west": { "model": "poweradvantage:still_on", "y": 270}
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/lang/de_DE.lang b/src/main/resources/assets/poweradvantage/lang/de_DE.lang
deleted file mode 100644
index 4ad6bc1..0000000
--- a/src/main/resources/assets/poweradvantage/lang/de_DE.lang
+++ /dev/null
@@ -1,55 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Große Ofen (formlos)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Große Ofen (geformt)
-
-tooltip.poweradvantage.empty=Leer
-tooltip.poweradvantage.buckets_of=%x Eimer %y
-
-itemGroup.poweradvantage=Leistungsvorteil
-
-tile.poweradvantage.fluid_drain.name=Ablauf
-tile.poweradvantage.fluid_discharge.name=Austragsrost
-tile.poweradvantage.fluid_storage_tank.name=Lagertank
-item.poweradvantage.fluid_storage_tank_item.name=Speicher
-tile.poweradvantage.fluid_pipe.name=Rohr
-
-tile.poweradvantage.item_conveyor.name=Förderer
-tile.poweradvantage.item_filter_block.name=Block Auswahl Förder
-tile.poweradvantage.item_filter_food.name=Lebensmittel Auswahl Förder
-tile.poweradvantage.item_filter_fuel.name=Brennstoff Auswahl Förder
-tile.poweradvantage.item_filter_inventory.name=Anpassbare Auswahl Förder
-tile.poweradvantage.item_filter_ore.name=Erz Auswahl Förder
-tile.poweradvantage.item_filter_plant.name=Pflanze Auswahl Förder
-tile.poweradvantage.item_filter_smelt.name=Kochbare Auswahl Förder
-tile.poweradvantage.item_filter_overflow.name=Überlauf Auswahl Förder
-tile.poweradvantage.steel_frame.name=Stahlrahmen
-
-
-item.poweradvantage.starch.name=Kartoffelstärke
-item.poweradvantage.bioplastic_ingot.name=Biokunststoff-Barren
-item.poweradvantage.sprocket.name=Kettenrad
-
-
-tile.poweradvantage.fluid_metal_tank.name=Metall-Lagertank
-item.poweradvantage.rotator_tool.name=Drehwerkzeug
-
-tile.poweradvantage.infinite_steam.name=Unendlichen Dampfkraft
-tile.poweradvantage.infinite_electricity.name=Unendliche Elektrische Leistung
-tile.poweradvantage.infinite_quantum.name=Unendliche Quanten Leistung
-
-tile.poweradvantage.crude_oil.name=Rohöl
-fluid.poweradvantage.crude_oil=Rohöl
-item.bucket.crude_oil=Eimer Rohöl
-
-
-tile.poweradvantage.still.name=Brennerei
-
-tile.poweradvantage.refined_oil.name=Raffiniertes Öl
-fluid.poweradvantage.refined_oil=Raffiniertes Öl
-item.bucket.refined_oil=Eimer für Raffiniertes Öl
-tile.poweradvantage.fluid_switch.name=Ventil
-
-tile.poweradvantage.converter_rf_steam.name=Dampf-RF Leistungstransformator
-tile.poweradvantage.converter_rf_electricity.name=Elektrizität-RF Leistungstransformator
-tile.poweradvantage.converter_rf_quantum.name=Quant-RF Leistungstransformator
-tile.poweradvantage.converter_tr_electricity.name=Elektrizität-EU Leistungstransformator
diff --git a/src/main/resources/assets/poweradvantage/lang/en_AU.lang b/src/main/resources/assets/poweradvantage/lang/en_AU.lang
deleted file mode 100644
index 4009dfa..0000000
--- a/src/main/resources/assets/poweradvantage/lang/en_AU.lang
+++ /dev/null
@@ -1,54 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
-
-tooltip.poweradvantage.empty=Empty
-tooltip.poweradvantage.buckets_of=%x buckets of %y
-
-itemGroup.poweradvantage=Power Advantage
-
-tile.poweradvantage.fluid_drain.name=Drain
-tile.poweradvantage.fluid_discharge.name=Discharge Grate
-tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank
-item.poweradvantage.fluid_storage_tank_item.name=Storage Tank
-tile.poweradvantage.fluid_pipe.name=Pipe
-
-tile.poweradvantage.item_conveyor.name=Conveyor
-tile.poweradvantage.item_filter_block.name=Block Filter Conveyor
-tile.poweradvantage.item_filter_food.name=Food Filter Conveyor
-tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor
-tile.poweradvantage.item_filter_inventory.name=Filter Conveyor
-tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor
-tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor
-tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor
-tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor
-tile.poweradvantage.steel_frame.name=Steel Frame
-
-
-item.poweradvantage.starch.name=Starch
-item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot
-item.poweradvantage.sprocket.name=Sprocket
-
-tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank
-item.poweradvantage.rotator_tool.name=Rotation Wrench
-
-tile.poweradvantage.infinite_steam.name=Unlimited Steam Power
-tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power
-tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power
-
-tile.poweradvantage.crude_oil.name=Crude Oil
-fluid.poweradvantage.crude_oil=Crude Oil
-item.bucket.crude_oil=Bucket of Crude Oil
-
-
-tile.poweradvantage.still.name=Distillation Furnace
-
-tile.poweradvantage.refined_oil.name=Refined Oil
-fluid.poweradvantage.refined_oil=Refined Oil
-item.bucket.refined_oil=Bucket of Refined Oil
-tile.poweradvantage.fluid_switch.name=Fluid Switch Valve
-
-tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer
-tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer
-tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer
-tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/poweradvantage/lang/en_CA.lang b/src/main/resources/assets/poweradvantage/lang/en_CA.lang
deleted file mode 100644
index 4009dfa..0000000
--- a/src/main/resources/assets/poweradvantage/lang/en_CA.lang
+++ /dev/null
@@ -1,54 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
-
-tooltip.poweradvantage.empty=Empty
-tooltip.poweradvantage.buckets_of=%x buckets of %y
-
-itemGroup.poweradvantage=Power Advantage
-
-tile.poweradvantage.fluid_drain.name=Drain
-tile.poweradvantage.fluid_discharge.name=Discharge Grate
-tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank
-item.poweradvantage.fluid_storage_tank_item.name=Storage Tank
-tile.poweradvantage.fluid_pipe.name=Pipe
-
-tile.poweradvantage.item_conveyor.name=Conveyor
-tile.poweradvantage.item_filter_block.name=Block Filter Conveyor
-tile.poweradvantage.item_filter_food.name=Food Filter Conveyor
-tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor
-tile.poweradvantage.item_filter_inventory.name=Filter Conveyor
-tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor
-tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor
-tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor
-tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor
-tile.poweradvantage.steel_frame.name=Steel Frame
-
-
-item.poweradvantage.starch.name=Starch
-item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot
-item.poweradvantage.sprocket.name=Sprocket
-
-tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank
-item.poweradvantage.rotator_tool.name=Rotation Wrench
-
-tile.poweradvantage.infinite_steam.name=Unlimited Steam Power
-tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power
-tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power
-
-tile.poweradvantage.crude_oil.name=Crude Oil
-fluid.poweradvantage.crude_oil=Crude Oil
-item.bucket.crude_oil=Bucket of Crude Oil
-
-
-tile.poweradvantage.still.name=Distillation Furnace
-
-tile.poweradvantage.refined_oil.name=Refined Oil
-fluid.poweradvantage.refined_oil=Refined Oil
-item.bucket.refined_oil=Bucket of Refined Oil
-tile.poweradvantage.fluid_switch.name=Fluid Switch Valve
-
-tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer
-tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer
-tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer
-tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/poweradvantage/lang/en_EN.lang b/src/main/resources/assets/poweradvantage/lang/en_EN.lang
deleted file mode 100644
index 4009dfa..0000000
--- a/src/main/resources/assets/poweradvantage/lang/en_EN.lang
+++ /dev/null
@@ -1,54 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
-
-tooltip.poweradvantage.empty=Empty
-tooltip.poweradvantage.buckets_of=%x buckets of %y
-
-itemGroup.poweradvantage=Power Advantage
-
-tile.poweradvantage.fluid_drain.name=Drain
-tile.poweradvantage.fluid_discharge.name=Discharge Grate
-tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank
-item.poweradvantage.fluid_storage_tank_item.name=Storage Tank
-tile.poweradvantage.fluid_pipe.name=Pipe
-
-tile.poweradvantage.item_conveyor.name=Conveyor
-tile.poweradvantage.item_filter_block.name=Block Filter Conveyor
-tile.poweradvantage.item_filter_food.name=Food Filter Conveyor
-tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor
-tile.poweradvantage.item_filter_inventory.name=Filter Conveyor
-tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor
-tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor
-tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor
-tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor
-tile.poweradvantage.steel_frame.name=Steel Frame
-
-
-item.poweradvantage.starch.name=Starch
-item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot
-item.poweradvantage.sprocket.name=Sprocket
-
-tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank
-item.poweradvantage.rotator_tool.name=Rotation Wrench
-
-tile.poweradvantage.infinite_steam.name=Unlimited Steam Power
-tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power
-tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power
-
-tile.poweradvantage.crude_oil.name=Crude Oil
-fluid.poweradvantage.crude_oil=Crude Oil
-item.bucket.crude_oil=Bucket of Crude Oil
-
-
-tile.poweradvantage.still.name=Distillation Furnace
-
-tile.poweradvantage.refined_oil.name=Refined Oil
-fluid.poweradvantage.refined_oil=Refined Oil
-item.bucket.refined_oil=Bucket of Refined Oil
-tile.poweradvantage.fluid_switch.name=Fluid Switch Valve
-
-tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer
-tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer
-tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer
-tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/poweradvantage/lang/en_GB.lang b/src/main/resources/assets/poweradvantage/lang/en_GB.lang
deleted file mode 100644
index 4c44e61..0000000
--- a/src/main/resources/assets/poweradvantage/lang/en_GB.lang
+++ /dev/null
@@ -1,53 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
-
-tooltip.poweradvantage.empty=Empty
-tooltip.poweradvantage.buckets_of=%x buckets of %y
-
-itemGroup.poweradvantage=Power Advantage
-
-tile.poweradvantage.fluid_drain.name=Drain
-tile.poweradvantage.fluid_discharge.name=Discharge Grate
-tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank
-item.poweradvantage.fluid_storage_tank_item.name=Storage Tank
-tile.poweradvantage.fluid_pipe.name=Pipe
-
-tile.poweradvantage.item_conveyor.name=Conveyor
-tile.poweradvantage.item_filter_block.name=Block Filter Conveyor
-tile.poweradvantage.item_filter_food.name=Food Filter Conveyor
-tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor
-tile.poweradvantage.item_filter_inventory.name=Filter Conveyor
-tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor
-tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor
-tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor
-tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor
-tile.poweradvantage.steel_frame.name=Steel Frame
-
-
-item.poweradvantage.starch.name=Starch
-item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot
-item.poweradvantage.sprocket.name=Sprocket
-
-tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank
-item.poweradvantage.rotator_tool.name=Rotation Wrench
-
-tile.poweradvantage.infinite_steam.name=Unlimited Steam Power
-tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power
-tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power
-
-tile.poweradvantage.crude_oil.name=Crude Oil
-fluid.poweradvantage.crude_oil=Crude Oil
-item.bucket.crude_oil=Bucket of Crude Oil
-
-tile.poweradvantage.still.name=Distillation Furnace
-
-tile.poweradvantage.refined_oil.name=Refined Oil
-fluid.poweradvantage.refined_oil=Refined Oil
-item.bucket.refined_oil=Bucket of Refined Oil
-tile.poweradvantage.fluid_switch.name=Fluid Switch Valve
-
-tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer
-tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer
-tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer
-tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/poweradvantage/lang/en_PT.lang b/src/main/resources/assets/poweradvantage/lang/en_PT.lang
deleted file mode 100644
index 9d8cfee..0000000
--- a/src/main/resources/assets/poweradvantage/lang/en_PT.lang
+++ /dev/null
@@ -1,53 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
-
-tooltip.poweradvantage.empty=Empty
-tooltip.poweradvantage.buckets_of=%x buckets of %y
-
-itemGroup.poweradvantage=Power Advantage
-
-tile.poweradvantage.fluid_drain.name=Drain
-tile.poweradvantage.fluid_discharge.name=Discharge Grate
-tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank
-item.poweradvantage.fluid_storage_tank_item.name=Storage Tank
-tile.poweradvantage.fluid_pipe.name=Pipe
-
-tile.poweradvantage.item_conveyor.name=Conveyor
-tile.poweradvantage.item_filter_block.name=Block Filter Conveyor
-tile.poweradvantage.item_filter_food.name=Food Filter Conveyor
-tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor
-tile.poweradvantage.item_filter_inventory.name=Filter Conveyor
-tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor
-tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor
-tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor
-tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor
-tile.poweradvantage.steel_frame.name=Steel Frame
-
-
-item.poweradvantage.starch.name=Starch
-item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot
-item.poweradvantage.sprocket.name=Sprocket
-
-tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank
-item.poweradvantage.rotator_tool.name=Rotation Wrench
-
-tile.poweradvantage.infinite_steam.name=Unlimited Steam Power
-tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power
-tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power
-
-tile.poweradvantage.crude_oil.name=Black Gold
-fluid.poweradvantage.crude_oil=Black Gold
-item.bucket.crude_oil=Bucket o' Black Gold
-
-tile.poweradvantage.still.name='Stillery
-
-tile.poweradvantage.refined_oil.name=Lamp Oil
-fluid.poweradvantage.refined_oil=Lamp Oil
-item.bucket.refined_oil=Bucket o' Lamp Oil
-tile.poweradvantage.fluid_switch.name=Big Red Valve
-
-tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer
-tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer
-tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer
-tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/poweradvantage/lang/en_US.lang b/src/main/resources/assets/poweradvantage/lang/en_US.lang
deleted file mode 100644
index f4fe620..0000000
--- a/src/main/resources/assets/poweradvantage/lang/en_US.lang
+++ /dev/null
@@ -1,52 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped)
-
-tooltip.poweradvantage.empty=Empty
-tooltip.poweradvantage.buckets_of=%x buckets of %y
-
-itemGroup.poweradvantage=Power Advantage
-
-tile.poweradvantage.fluid_drain.name=Drain
-tile.poweradvantage.fluid_discharge.name=Discharge Grate
-tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank
-tile.poweradvantage.fluid_pipe.name=Pipe
-
-tile.poweradvantage.item_conveyor.name=Conveyor
-tile.poweradvantage.item_filter_block.name=Block Filter Conveyor
-tile.poweradvantage.item_filter_food.name=Food Filter Conveyor
-tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor
-tile.poweradvantage.item_filter_inventory.name=Filter Conveyor
-tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor
-tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor
-tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor
-tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor
-tile.poweradvantage.steel_frame.name=Steel Frame
-
-
-item.poweradvantage.starch.name=Starch
-item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot
-item.poweradvantage.sprocket.name=Sprocket
-
-
-tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank
-item.poweradvantage.rotator_tool.name=Rotation Wrench
-
-tile.poweradvantage.infinite_steam.name=Unlimited Steam Power
-tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power
-tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power
-
-tile.poweradvantage.crude_oil.name=Crude Oil
-fluid.poweradvantage.crude_oil=Crude Oil
-item.bucket.crude_oil=Bucket of Crude Oil
-
-tile.poweradvantage.still.name=Distillation Furnace
-tile.poweradvantage.refined_oil.name=Refined Oil
-fluid.poweradvantage.refined_oil=Refined Oil
-item.bucket.refined_oil=Bucket of Refined Oil
-tile.poweradvantage.fluid_switch.name=Fluid Switch Valve
-
-tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer
-tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer
-tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer
-tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer
diff --git a/src/main/resources/assets/poweradvantage/lang/es_ES.lang b/src/main/resources/assets/poweradvantage/lang/es_ES.lang
deleted file mode 100644
index cd391ff..0000000
--- a/src/main/resources/assets/poweradvantage/lang/es_ES.lang
+++ /dev/null
@@ -1,56 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Gran Horno (no forma)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Gran Horno (en forma)
-
-tooltip.poweradvantage.empty=Vacío
-tooltip.poweradvantage.buckets_of =%x cubos de %y
-
-itemGroup.poweradvantage=Ventaja de Energía
-
-tile.poweradvantage.fluid_drain.name=Drenaje
-tile.poweradvantage.fluid_discharge.name=Descarga Grate
-tile.poweradvantage.fluid_storage_tank.name=Tanque de almacenamiento
-item.poweradvantage.fluid_storage_tank_item.name=Tanque de almacenamiento
-tile.poweradvantage.fluid_pipe.name=Tubo
-
-tile.poweradvantage.item_conveyor.name=Transportadores
-tile.poweradvantage.item_filter_block.name=Bloquear Filtro Transportadores
-tile.poweradvantage.item_filter_food.name=Filtro Alimentos Transportadores
-tile.poweradvantage.item_filter_fuel.name=Filtro de combustible Transportadores
-tile.poweradvantage.item_filter_inventory.name=Filtro Transportadores
-tile.poweradvantage.item_filter_ore.name=Ore Transportadores Filtro
-tile.poweradvantage.item_filter_plant.name=Plantable Transportadores Filtro
-tile.poweradvantage.item_filter_smelt.name=Horno Filtro Transportadores
-tile.poweradvantage.item_filter_overflow.name=Desbordamiento Filtro Transportadores
-tile.poweradvantage.steel_frame.name=Marco de Acero
-
-
-item.poweradvantage.starch.name=Almidón
-item.poweradvantage.bioplastic_ingot.name=Bioplástico Lingote
-item.poweradvantage.sprocket.name=Piñón
-
-
-tile.poweradvantage.fluid_metal_tank.name=Tanque de Almacenamiento de Acero
-item.poweradvantage.rotator_tool.name=Herramienta de Rotación
-
-tile.poweradvantage.infinite_steam.name=La Energía de Vapor Infinito
-tile.poweradvantage.infinite_electricity.name=Energía Eléctrica Infinito
-tile.poweradvantage.infinite_quantum.name=Cuántica Infinito
-
-tile.poweradvantage.crude_oil.name=Petróleo Crudo
-fluid.poweradvantage.crude_oil=Petróleo Crudo
-item.bucket.crude_oil.name=Cubo de Crudo
-
-
-tile.poweradvantage.still.name=Destilería
-
-tile.poweradvantage.refined_oil.name=Refinado de Petróleo
-fluid.poweradvantage.refined_oil=Refinado de Petróleo
-item.bucket.refined_oil.name=Cubo de Refinado de Petróleo
-tile.poweradvantage.fluid_switch.name=Válvula
-
-
-tile.poweradvantage.converter_rf_steam.name=Vapor-RF Transformador
-tile.poweradvantage.converter_rf_electricity.name=Electricidad-RF Transformador
-tile.poweradvantage.converter_rf_quantum.name=Cuántico-RF Transformador
-tile.poweradvantage.converter_tr_electricity.name=Electricidad-EU Transformador
diff --git a/src/main/resources/assets/poweradvantage/lang/es_MX.lang b/src/main/resources/assets/poweradvantage/lang/es_MX.lang
deleted file mode 100644
index 775e4ea..0000000
--- a/src/main/resources/assets/poweradvantage/lang/es_MX.lang
+++ /dev/null
@@ -1,56 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Gran Horno (no forma)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Gran Horno (en forma)
-
-tooltip.poweradvantage.empty=Vacío
-tooltip.poweradvantage.buckets_of=%x cubos de %y
-
-itemGroup.poweradvantage=Ventaja de Energía
-
-tile.poweradvantage.fluid_drain.name=Drenaje
-tile.poweradvantage.fluid_discharge.name=Descarga Grate
-tile.poweradvantage.fluid_storage_tank.name=Tanque de almacenamiento
-item.poweradvantage.fluid_storage_tank_item.name=Tanque de almacenamiento
-tile.poweradvantage.fluid_pipe.name=Tubo
-
-tile.poweradvantage.item_conveyor.name=Transportadores
-tile.poweradvantage.item_filter_block.name=Bloquear Filtro Transportadores
-tile.poweradvantage.item_filter_food.name=Filtro Alimentos Transportadores
-tile.poweradvantage.item_filter_fuel.name=Filtro de combustible Transportadores
-tile.poweradvantage.item_filter_inventory.name=Filtro Transportadores
-tile.poweradvantage.item_filter_ore.name=Ore Transportadores Filtro
-tile.poweradvantage.item_filter_plant.name=Plantable Transportadores Filtro
-tile.poweradvantage.item_filter_smelt.name=Horno Filtro Transportadores
-tile.poweradvantage.item_filter_overflow.name=Desbordamiento Filtro Transportadores
-tile.poweradvantage.steel_frame.name=Marco de Acero
-
-
-item.poweradvantage.starch.name=Almidón
-item.poweradvantage.bioplastic_ingot.name=Bioplástico Lingote
-item.poweradvantage.sprocket.name=Piñón
-
-
-tile.poweradvantage.fluid_metal_tank.name=Tanque de Almacenamiento de Acero
-item.poweradvantage.rotator_tool.name=Herramienta de Rotación
-
-tile.poweradvantage.infinite_steam.name=La Energía de Vapor Infinito
-tile.poweradvantage.infinite_electricity.name=Energía Eléctrica Infinito
-tile.poweradvantage.infinite_quantum.name=Cuántica Infinito
-
-tile.poweradvantage.crude_oil.name=Petróleo Crudo
-fluid.poweradvantage.crude_oil=Petróleo Crudo
-item.bucket.crude_oil.name=Cubo de Crudo
-
-
-tile.poweradvantage.still.name=Destilería
-
-tile.poweradvantage.refined_oil.name=Refinado de Petróleo
-fluid.poweradvantage.refined_oil=Refinado de Petróleo
-item.bucket.refined_oil.name=Cubo de Refinado de Petróleo
-tile.poweradvantage.fluid_switch.name=Válvula
-
-
-tile.poweradvantage.converter_rf_steam.name=Vapor-RF Transformador
-tile.poweradvantage.converter_rf_electricity.name=Electricidad-RF Transformador
-tile.poweradvantage.converter_rf_quantum.name=Cuántico-RF Transformador
-tile.poweradvantage.converter_tr_electricity.name=Electricidad-EU Transformador
diff --git a/src/main/resources/assets/poweradvantage/lang/it_IT.lang b/src/main/resources/assets/poweradvantage/lang/it_IT.lang
deleted file mode 100644
index bae57a5..0000000
--- a/src/main/resources/assets/poweradvantage/lang/it_IT.lang
+++ /dev/null
@@ -1,55 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Grande Fornace (informe)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Grande Fornace (forma)
-
-tooltip.poweradvantage.empty=vuoto
-tooltip.poweradvantage.buckets_of=%x secchi d'%y
-
-itemGroup.poweradvantage=Potenza Advantage
-
-tile.poweradvantage.fluid_drain.name=Scarico
-tile.poweradvantage.fluid_discharge.name=Griglia di scarico
-tile.poweradvantage.fluid_storage_tank.name=Serbatoio
-item.poweradvantage.fluid_storage_tank_item.name=Serbatoio
-tile.poweradvantage.fluid_pipe.name=Tubo
-
-tile.poweradvantage.item_conveyor.name=Trasportatore
-tile.poweradvantage.item_filter_block.name=Filtro di blocco trasportatore
-tile.poweradvantage.item_filter_food.name=Filtro alimentare Conveyor
-tile.poweradvantage.item_filter_fuel.name=carburante Filtro Conveyor
-tile.poweradvantage.item_filter_inventory.name=Filtro Conveyor
-tile.poweradvantage.item_filter_ore.name=Ore Filtro Conveyor
-tile.poweradvantage.item_filter_plant.name=Plantable Filtro Conveyor
-tile.poweradvantage.item_filter_smelt.name=Forno Filtro Conveyor
-tile.poweradvantage.item_filter_overflow.name=Straripamento Filtro Conveyor
-tile.poweradvantage.steel_frame.name=Steel Frame
-
-
-item.poweradvantage.starch.name=Amido
-item.poweradvantage.bioplastic_ingot.name=Bioplastica Lingotto
-item.poweradvantage.sprocket.name=Sprocket
-
-
-tile.poweradvantage.fluid_metal_tank.name=Serbatoio in Metallo
-item.poweradvantage.rotator_tool.name=Strumento di Rotazione
-
-tile.poweradvantage.infinite_steam.name=Forza Vapore Infinite
-tile.poweradvantage.infinite_electricity.name=Elettricità Infinite
-tile.poweradvantage.infinite_quantum.name=Atomica Infinite
-
-tile.poweradvantage.crude_oil.name=Olio a Crudo
-fluid.poweradvantage.crude_oil=Olio a Crudo
-item.bucket.crude_oil.name=Secchio di Greggio
-
-
-tile.poweradvantage.still.name=Distilleria
-tile.poweradvantage.refined_oil.name=Olio Raffinato
-fluid.poweradvantage.refined_oil=Olio Raffinato
-item.bucket.refined_oil.name=Secchio di Olio Raffinato
-tile.poweradvantage.fluid_switch.name=Valvola
-
-
-tile.poweradvantage.converter_rf_steam.name=Vapore-RF Trasformatore
-tile.poweradvantage.converter_rf_electricity.name=Elettricità-RF Trasformatore
-tile.poweradvantage.converter_rf_quantum.name=Quantistico-RF Trasformatore
-tile.poweradvantage.converter_tr_electricity.name=Elettricità-EU Trasformatore
diff --git a/src/main/resources/assets/poweradvantage/lang/ja_JP.lang b/src/main/resources/assets/poweradvantage/lang/ja_JP.lang
deleted file mode 100644
index fdb19de..0000000
--- a/src/main/resources/assets/poweradvantage/lang/ja_JP.lang
+++ /dev/null
@@ -1,56 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-Translate
-nei.poweradvantage.recipehandler.shapelessfurnace.name=大型炉(型崩れ)
-nei.poweradvantage.recipehandler.shapedfurnace.name=大型炉(形)
-
-tooltip.poweradvantage.empty=空
-tooltip.poweradvantage.buckets_of=%yの%xバケット
-
-itemGroup.poweradvantage=パワー·アドバンテージ
-
-tile.poweradvantage.fluid_drain.name=ドレン
-tile.poweradvantage.fluid_discharge.name=放電グレート
-tile.poweradvantage.fluid_storage_tank.name=貯蔵タンク
-item.poweradvantage.fluid_storage_tank_item.name=貯蔵タンク
-tile.poweradvantage.fluid_pipe.name=パイプ
-
-tile.poweradvantage.item_conveyor.name=コンベア
-tile.poweradvantage.item_filter_block.name=ブロックフィルタコンベア
-tile.poweradvantage.item_filter_food.name=フードフィルターコンベア
-tile.poweradvantage.item_filter_fuel.name=燃料フィルターコンベア
-tile.poweradvantage.item_filter_inventory.name=フィルタコンベヤー
-tile.poweradvantage.item_filter_ore.name=鉱石フィルターコンベア
-tile.poweradvantage.item_filter_plant.name=プラントフィルタコンベヤー
-tile.poweradvantage.item_filter_smelt.name=炉フィルターコンベア
-tile.poweradvantage.item_filter_overflow.name=オーバーフローフィルタコンベヤー
-tile.poweradvantage.steel_frame.name=鉄骨
-
-
-item.poweradvantage.starch.name=デンプン
-item.poweradvantage.bioplastic_ingot.name=は、バイオプラスチックインゴットを
-item.poweradvantage.sprocket.name=スプロケット
-
-tile.poweradvantage.infinite_steam.name=無限の蒸気動力
-tile.poweradvantage.infinite_electricity.name=無限の電力
-tile.poweradvantage.infinite_quantum.name=無限の量子パワー
-
-
-tile.poweradvantage.fluid_metal_tank.name=金属製貯蔵タンク
-item.poweradvantage.rotator_tool.name=回転ツール
-
-tile.poweradvantage.crude_oil.name=原油
-fluid.poweradvantage.crude_oil=原油
-item.bucket.crude_oil.name=原油のバケット
-
-
-tile.poweradvantage.still.name=蒸留酒製造所
-tile.poweradvantage.refined_oil.name=精製油
-fluid.poweradvantage.refined_oil=精製油
-item.bucket.refined_oil.name=精製油のバケツ
-tile.poweradvantage.fluid_switch.name=バルブ
-
-
-tile.poweradvantage.converter_rf_steam.name=蒸気-RFトランス
-tile.poweradvantage.converter_rf_electricity.name=電気-RFトランス
-tile.poweradvantage.converter_rf_quantum.name=量子-RFトランス
-tile.poweradvantage.converter_tr_electricity.name=電気-EUトランス
diff --git a/src/main/resources/assets/poweradvantage/lang/ko_KR.lang b/src/main/resources/assets/poweradvantage/lang/ko_KR.lang
deleted file mode 100644
index e3aba15..0000000
--- a/src/main/resources/assets/poweradvantage/lang/ko_KR.lang
+++ /dev/null
@@ -1,56 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=대형 전기로 (못생긴)
-nei.poweradvantage.recipehandler.shapedfurnace.name=대형 전기로 (모양)
-
-tooltip.poweradvantage.empty=빈
-tooltip.tooltip.poweradvantage.buckets_of=%는 X 버킷
-
-itemGroup.poweradvantage=전원의 장점을
-
-tile.poweradvantage.fluid_drain.name=드레인
-tile.poweradvantage.fluid_discharge.name=방전 화격자
-tile.poweradvantage.fluid_storage_tank.name=저장 탱크
-item.poweradvantage.fluid_storage_tank_item.name=는 저장 탱크를
-tile.poweradvantage.fluid_pipe.name=파이프
-
-tile.poweradvantage.item_conveyor.name=컨베이어
-tile.poweradvantage.item_filter_block.name=블록 필터 컨베이어
-tile.poweradvantage.item_filter_food.name=식품 필터 컨베이어
-tile.poweradvantage.item_filter_fuel.name=연료 필터 컨베이어
-tile.poweradvantage.item_filter_inventory.name=필터 컨베이어
-tile.poweradvantage.item_filter_ore.name=광석 필터 컨베이어
-tile.poweradvantage.item_filter_plant.name=물만 주면 식물이 필터 컨베이어
-tile.poweradvantage.item_filter_smelt.name=노 필터 컨베이어
-tile.poweradvantage.item_filter_overflow.name=오버 플로우필터 컨베이어
-tile.poweradvantage.steel_frame.name=스틸 프레임
-
-
-item.poweradvantage.starch.name=전분
-item.poweradvantage.bioplastic_ingot.name=는 바이오 플라스틱 잉곳을
-item.poweradvantage.sprocket.name=스프로킷
-
-
-tile.poweradvantage.fluid_metal_tank.name=금속 저장조
-item.poweradvantage.rotator_tool.name=회전 도구
-
-
-tile.poweradvantage.infinite_steam.name=무한 증기 력
-tile.poweradvantage.infinite_electricity.name=무한 전력
-tile.poweradvantage.infinite_quantum.name=무한 양자 전력
-
-tile.poweradvantage.crude_oil.name=원유
-fluid.poweradvantage.crude_oil=원유
-item.bucket.crude_oil.name=원유의 버킷
-
-
-tile.poweradvantage.still.name=증류소
-tile.poweradvantage.refined_oil.name=정유
-fluid.poweradvantage.refined_oil=정유
-item.bucket.refined_oil.name=정유의 통
-tile.poweradvantage.fluid_switch.name=판막
-
-
-tile.poweradvantage.converter_rf_steam.name=증기-RF 전원 트랜스
-tile.poweradvantage.converter_rf_electricity.name=전기-RF 전원 트랜스
-tile.poweradvantage.converter_rf_quantum.name=양자-RF 전원 트랜스
-tile.poweradvantage.converter_tr_electricity.name=전기-EU 전원 트랜스
diff --git a/src/main/resources/assets/poweradvantage/lang/pt_BR.lang b/src/main/resources/assets/poweradvantage/lang/pt_BR.lang
deleted file mode 100644
index 7dcb668..0000000
--- a/src/main/resources/assets/poweradvantage/lang/pt_BR.lang
+++ /dev/null
@@ -1,54 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-nei.poweradvantage.recipehandler.shapelessfurnace.name=Forno Grande (no forma)
-nei.poweradvantage.recipehandler.shapedfurnace.name=Forno Grande (em forma)
-
-tooltip.poweradvantage.empty=vazio
-tooltip.poweradvantage.buckets_of=%x baldes de %y
-
-itemGroup.poweradvantage=Vantagem de Poder
-
-tile.poweradvantage.fluid_drain.name=Dreno
-tile.poweradvantage.fluid_discharge.name=Grate Discharge
-tile.poweradvantage.fluid_storage_tank.name=Tanque de armazenamento
-item.poweradvantage.fluid_storage_tank_item.name=Tanque de armazenamento
-tile.poweradvantage.fluid_pipe.name=Tubulação
-
-tile.poweradvantage.item_conveyor.name=Transportador
-tile.poweradvantage.item_filter_block.name=Bloquear filtro transportador
-tile.poweradvantage.item_filter_food.name=Transportador Filtro de Alimentos
-tile.poweradvantage.item_filter_fuel.name=Filtro de combustível Transportador
-tile.poweradvantage.item_filter_inventory.name=Transportador Filtro
-tile.poweradvantage.item_filter_ore.name=Ore Transportadora Filtro
-tile.poweradvantage.item_filter_plant.name=Plantable Transportadora Filtro
-tile.poweradvantage.item_filter_smelt.name=Fornalha Filtro Transportador
-tile.poweradvantage.item_filter_overflow.name=Transbordamento Transportador Filtro
-tile.poweradvantage.steel_frame.name=Armação de Aço
-
-
-item.poweradvantage.starch.name=Amido
-item.poweradvantage.bioplastic_ingot.name=Bioplastic lingote
-item.poweradvantage.sprocket.name=Roda Dentada
-
-
-tile.poweradvantage.fluid_metal_tank.name=Tanque de Armazenamento de Aço
-item.poweradvantage.rotator_tool.name=Ferramenta de Rotação
-
-tile.poweradvantage.infinite_steam.name=Energia a Vapor Infinito
-tile.poweradvantage.infinite_electricity.name=Energia Elétrica Infinito
-tile.poweradvantage.infinite_quantum.name=Energia Quantum Infinito
-
-tile.poweradvantage.crude_oil.name=Óleo Cru
-fluid.poweradvantage.crude_oil=Óleo Cru
-item.bucket.crude_oil.name=Balde de Óleo Cru
-
-
-tile.poweradvantage.still.name=Destilaria
-tile.poweradvantage.refined_oil.name=Óleo Refinado
-fluid.poweradvantage.refined_oil=Óleo Refinado
-item.bucket.refined_oil.name=Balde de Óleo Refinado
-tile.poweradvantage.fluid_switch.name=Válvula
-
-tile.poweradvantage.converter_rf_steam.name=Vapor-RF Transformador
-tile.poweradvantage.converter_rf_electricity.name=Electricidade-RF Transformador
-tile.poweradvantage.converter_rf_quantum.name=Quantidade-RF Transformador
-tile.poweradvantage.converter_tr_electricity.name=Electricidade-EU Transformador
diff --git a/src/main/resources/assets/poweradvantage/lang/zh_CN.lang b/src/main/resources/assets/poweradvantage/lang/zh_CN.lang
deleted file mode 100644
index bbe2b0d..0000000
--- a/src/main/resources/assets/poweradvantage/lang/zh_CN.lang
+++ /dev/null
@@ -1,57 +0,0 @@
-language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR)
-
-nei.poweradvantage.recipehandler.shapelessfurnace.name=大熔炉(无形的)
-nei.poweradvantage.recipehandler.shapedfurnace.name=大熔炉(有形的)
-
-tooltip.poweradvantage.empty=空
-tooltip.poweradvantage.buckets_of=%x水桶的%y
-
-itemGroup.poweradvantage=能量优势
-
-tile.poweradvantage.fluid_drain.name=抽水机
-tile.poweradvantage.fluid_discharge.name=排液器
-tile.poweradvantage.fluid_storage_tank.name=便携式液体储罐
-item.poweradvantage.fluid_storage_tank_item.name=便携式液体储罐
-tile.poweradvantage.fluid_pipe.name=液体管
-
-tile.poweradvantage.item_conveyor.name=输送机
-tile.poweradvantage.item_filter_block.name=方块过滤输送机
-tile.poweradvantage.item_filter_food.name=食品过滤输送机
-tile.poweradvantage.item_filter_fuel.name=燃料过滤输送机
-tile.poweradvantage.item_filter_inventory.name=选择过滤输送机
-tile.poweradvantage.item_filter_ore.name=矿物过滤输送机
-tile.poweradvantage.item_filter_plant.name=种子过滤输送机
-tile.poweradvantage.item_filter_smelt.name=熔炉过滤输送机
-tile.poweradvantage.item_filter_overflow.name=溢出过滤输送机
-tile.poweradvantage.steel_frame.name=钢框架
-
-
-item.poweradvantage.starch.name=淀粉
-item.poweradvantage.bioplastic_ingot.name=生物塑料锭
-item.poweradvantage.sprocket.name=链轮
-
-
-tile.poweradvantage.fluid_metal_tank.name=金属液罐
-item.poweradvantage.rotator_tool.name=旋转扳手
-
-tile.poweradvantage.infinite_steam.name=无限蒸汽动力
-tile.poweradvantage.infinite_electricity.name=无限电力
-tile.poweradvantage.infinite_quantum.name=无限量子动力
-
-tile.poweradvantage.crude_oil.name=原油
-fluid.poweradvantage.crude_oil=原油
-item.bucket.crude_oil.name=原油桶
-
-
-tile.poweradvantage.still.name=酒廠
-
-tile.poweradvantage.refined_oil.name=成品油
-fluid.poweradvantage.refined_oil=成品油
-item.bucket.refined_oil.name=成品油的桶
-tile.poweradvantage.fluid_switch.name=閥
-
-
-tile.poweradvantage.converter_rf_steam.name=蒸汽-RF 變壓器
-tile.poweradvantage.converter_rf_electricity.name=電力-RF 變壓器
-tile.poweradvantage.converter_rf_quantum.name=量子-RF 變壓器
-tile.poweradvantage.converter_tr_electricity.name=電力-EU 變壓器
diff --git a/src/main/resources/assets/poweradvantage/models/block/converter_tr_electricity.json b/src/main/resources/assets/poweradvantage/models/block/converter_tr_electricity.json
deleted file mode 100644
index 7dff7e5..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/converter_tr_electricity.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "parent": "block/cube_all",
- "textures": {
- "all": "poweradvantage:blocks/techreborn_converter"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_discharge.json b/src/main/resources/assets/poweradvantage/models/block/fluid_discharge.json
deleted file mode 100644
index df0fc23..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_discharge.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/cube_bottom_top",
- "textures": {
- "top": "poweradvantage:blocks/fluid_discharge_side",
- "bottom": "poweradvantage:blocks/fluid_discharge_face",
- "side": "poweradvantage:blocks/fluid_discharge_side"
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_drain.json b/src/main/resources/assets/poweradvantage/models/block/fluid_drain.json
deleted file mode 100644
index 93445c1..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_drain.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/cube_bottom_top",
- "textures": {
- "top": "poweradvantage:blocks/fluid_drain_face",
- "bottom": "poweradvantage:blocks/fluid_drain_side",
- "side": "poweradvantage:blocks/fluid_drain_side"
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_0.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_0.json
deleted file mode 100644
index 51edd2d..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_0.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_0",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_densuw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_densuw.json
deleted file mode 100644
index c5e1f92..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_densuw.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_densuw",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_desuw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_desuw.json
deleted file mode 100644
index f6e67de..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_desuw.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_desuw",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_dnu.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_dnu.json
deleted file mode 100644
index 5ba85dc..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_dnu.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_dnu",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ensw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ensw.json
deleted file mode 100644
index b334234..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ensw.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_ensw",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_n.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_n.json
deleted file mode 100644
index da4dd3c..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_n.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_n",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ns.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ns.json
deleted file mode 100644
index c02fff4..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ns.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_ns",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsuw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsuw.json
deleted file mode 100644
index b5778cc..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsuw.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_nsuw",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsw.json
deleted file mode 100644
index 1e3e253..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsw.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_nsw",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nuw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nuw.json
deleted file mode 100644
index 9506607..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nuw.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_nuw",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nw.json
deleted file mode 100644
index 3f87031..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nw.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "parent": "block/block",
- "parent": "poweradvantage:block/pipe4_nw",
- "textures": {
- "texture": "poweradvantage:blocks/fluid_pipe",
- "particle": "poweradvantage:materials/iron"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_switch_off.json b/src/main/resources/assets/poweradvantage/models/block/fluid_switch_off.json
deleted file mode 100644
index 99376fe..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_switch_off.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "parent": "block/cube_all",
- "textures": {
- "all": "poweradvantage:blocks/fluid_switch_off",
- "particle": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_switch_on.json b/src/main/resources/assets/poweradvantage/models/block/fluid_switch_on.json
deleted file mode 100644
index a09edb7..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_switch_on.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "parent": "block/cube_all",
- "textures": {
- "all": "poweradvantage:blocks/fluid_switch_on",
- "particle": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/item_conveyor.json b/src/main/resources/assets/poweradvantage/models/block/item_conveyor.json
deleted file mode 100644
index f176d90..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/item_conveyor.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "parent": "poweradvantage:block/conveyor_base",
- "textures": {
- "top": "poweradvantage:blocks/item_conveyor_top",
- "bottom": "poweradvantage:blocks/item_conveyor_top",
- "side": "poweradvantage:blocks/item_conveyor_side",
- "end": "poweradvantage:blocks/item_conveyor_end",
- "rim": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_block.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_block.json
deleted file mode 100644
index 0d2c3a6..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/item_filter_block.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "parent": "poweradvantage:block/conveyor_base",
- "textures": {
- "top": "poweradvantage:blocks/item_conveyor_top",
- "bottom": "poweradvantage:blocks/filter_bottom",
- "side": "poweradvantage:blocks/filter_side_block",
- "end": "poweradvantage:blocks/item_conveyor_end",
- "rim": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_food.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_food.json
deleted file mode 100644
index 2c1f658..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/item_filter_food.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "parent": "poweradvantage:block/conveyor_base",
- "textures": {
- "top": "poweradvantage:blocks/item_conveyor_top",
- "bottom": "poweradvantage:blocks/filter_bottom",
- "side": "poweradvantage:blocks/filter_side_food",
- "end": "poweradvantage:blocks/item_conveyor_end",
- "rim": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_fuel.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_fuel.json
deleted file mode 100644
index d12bdef..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/item_filter_fuel.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "parent": "poweradvantage:block/conveyor_base",
- "textures": {
- "top": "poweradvantage:blocks/item_conveyor_top",
- "bottom": "poweradvantage:blocks/filter_bottom",
- "side": "poweradvantage:blocks/filter_side_fuel",
- "end": "poweradvantage:blocks/item_conveyor_end",
- "rim": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_inventory.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_inventory.json
deleted file mode 100644
index 45200ce..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/item_filter_inventory.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "parent": "poweradvantage:block/conveyor_base",
- "textures": {
- "top": "poweradvantage:blocks/item_conveyor_top",
- "bottom": "poweradvantage:blocks/filter_bottom",
- "side": "poweradvantage:blocks/filter_side_inventory",
- "end": "poweradvantage:blocks/item_conveyor_end",
- "rim": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_ore.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_ore.json
deleted file mode 100644
index 26dbe01..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/item_filter_ore.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "parent": "poweradvantage:block/conveyor_base",
- "textures": {
- "top": "poweradvantage:blocks/item_conveyor_top",
- "bottom": "poweradvantage:blocks/filter_bottom",
- "side": "poweradvantage:blocks/filter_side_ore",
- "end": "poweradvantage:blocks/item_conveyor_end",
- "rim": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_overflow.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_overflow.json
deleted file mode 100644
index 8abd3a4..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/item_filter_overflow.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "parent": "poweradvantage:block/conveyor_base",
- "textures": {
- "top": "poweradvantage:blocks/item_conveyor_top",
- "bottom": "poweradvantage:blocks/filter_bottom",
- "side": "poweradvantage:blocks/filter_side_overflow",
- "end": "poweradvantage:blocks/item_conveyor_end",
- "rim": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_plant.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_plant.json
deleted file mode 100644
index 4d16d31..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/item_filter_plant.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "parent": "poweradvantage:block/conveyor_base",
- "textures": {
- "top": "poweradvantage:blocks/item_conveyor_top",
- "bottom": "poweradvantage:blocks/filter_bottom",
- "side": "poweradvantage:blocks/filter_side_plantable",
- "end": "poweradvantage:blocks/item_conveyor_end",
- "rim": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_smelt.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_smelt.json
deleted file mode 100644
index 49deac1..0000000
--- a/src/main/resources/assets/poweradvantage/models/block/item_filter_smelt.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "parent": "poweradvantage:block/conveyor_base",
- "textures": {
- "top": "poweradvantage:blocks/item_conveyor_top",
- "bottom": "poweradvantage:blocks/filter_bottom",
- "side": "poweradvantage:blocks/filter_side_smeltable",
- "end": "poweradvantage:blocks/item_conveyor_end",
- "rim": "poweradvantage:materials/steel"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/item/bioplastic_ingot.json b/src/main/resources/assets/poweradvantage/models/item/bioplastic_ingot.json
deleted file mode 100644
index 8c08c41..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/bioplastic_ingot.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "parent": "item/generated",
- "textures": {
- "layer0": "poweradvantage:items/bioplastic_ingot"
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/bucket_crude_oil.json b/src/main/resources/assets/poweradvantage/models/item/bucket_crude_oil.json
deleted file mode 100644
index 2d78353..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/bucket_crude_oil.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "parent": "item/generated",
- "textures": {
- "layer0": "poweradvantage:items/bucket_crude_oil"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/item/bucket_refined_oil.json b/src/main/resources/assets/poweradvantage/models/item/bucket_refined_oil.json
deleted file mode 100644
index eb64682..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/bucket_refined_oil.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "parent": "item/generated",
- "textures": {
- "layer0": "poweradvantage:items/bucket_refined_oil"
- }
-}
diff --git a/src/main/resources/assets/poweradvantage/models/item/converter_rf_electricity.json b/src/main/resources/assets/poweradvantage/models/item/converter_rf_electricity.json
deleted file mode 100644
index b9b0429..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/converter_rf_electricity.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/converter_rf_electricity"
-}
diff --git a/src/main/resources/assets/poweradvantage/models/item/converter_rf_quantum.json b/src/main/resources/assets/poweradvantage/models/item/converter_rf_quantum.json
deleted file mode 100644
index ca2c0b8..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/converter_rf_quantum.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/converter_rf_quantum"
-}
diff --git a/src/main/resources/assets/poweradvantage/models/item/converter_rf_steam.json b/src/main/resources/assets/poweradvantage/models/item/converter_rf_steam.json
deleted file mode 100644
index 1ca73e4..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/converter_rf_steam.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/converter_rf_steam"
-}
diff --git a/src/main/resources/assets/poweradvantage/models/item/converter_tr_electricity.json b/src/main/resources/assets/poweradvantage/models/item/converter_tr_electricity.json
deleted file mode 100644
index 9a7a15f..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/converter_tr_electricity.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/converter_tr_electricity"
-}
diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_discharge.json b/src/main/resources/assets/poweradvantage/models/item/fluid_discharge.json
deleted file mode 100644
index e0bcaee..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/fluid_discharge.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/fluid_discharge"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_drain.json b/src/main/resources/assets/poweradvantage/models/item/fluid_drain.json
deleted file mode 100644
index fc98745..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/fluid_drain.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/fluid_drain"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_metal_tank.json b/src/main/resources/assets/poweradvantage/models/item/fluid_metal_tank.json
deleted file mode 100644
index 97ecaa9..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/fluid_metal_tank.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/fluid_metal_tank"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_pipe.json b/src/main/resources/assets/poweradvantage/models/item/fluid_pipe.json
deleted file mode 100644
index 097b735..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/fluid_pipe.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "parent": "poweradvantage:block/fluid_pipe_ns",
- "ambientocclusion": false
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_pipe_terminal.json b/src/main/resources/assets/poweradvantage/models/item/fluid_pipe_terminal.json
deleted file mode 100644
index 097b735..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/fluid_pipe_terminal.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "parent": "poweradvantage:block/fluid_pipe_ns",
- "ambientocclusion": false
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_storage_tank.json b/src/main/resources/assets/poweradvantage/models/item/fluid_storage_tank.json
deleted file mode 100644
index a337b20..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/fluid_storage_tank.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "parent": "poweradvantage:block/fluid_storage_tank",
- "ambientocclusion": false
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_switch.json b/src/main/resources/assets/poweradvantage/models/item/fluid_switch.json
deleted file mode 100644
index f00c542..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/fluid_switch.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/fluid_switch_on"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/infinite_electricity.json b/src/main/resources/assets/poweradvantage/models/item/infinite_electricity.json
deleted file mode 100644
index 5b216c8..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/infinite_electricity.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/infinite_electricity"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/infinite_quantum.json b/src/main/resources/assets/poweradvantage/models/item/infinite_quantum.json
deleted file mode 100644
index 03aab32..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/infinite_quantum.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/infinite_quantum"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/infinite_steam.json b/src/main/resources/assets/poweradvantage/models/item/infinite_steam.json
deleted file mode 100644
index 231eb2c..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/infinite_steam.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/infinite_steam"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/item_conveyor.json b/src/main/resources/assets/poweradvantage/models/item/item_conveyor.json
deleted file mode 100644
index 4fa32a5..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/item_conveyor.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/item_conveyor"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_block.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_block.json
deleted file mode 100644
index 0e5aca2..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/item_filter_block.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/item_filter_block"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_food.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_food.json
deleted file mode 100644
index f238e13..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/item_filter_food.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/item_filter_food"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_fuel.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_fuel.json
deleted file mode 100644
index 4fb288b..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/item_filter_fuel.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/item_filter_fuel"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_inventory.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_inventory.json
deleted file mode 100644
index 1e3a770..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/item_filter_inventory.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/item_filter_inventory"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_ore.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_ore.json
deleted file mode 100644
index ba5c859..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/item_filter_ore.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/item_filter_ore"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_overflow.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_overflow.json
deleted file mode 100644
index 92ae073..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/item_filter_overflow.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/item_filter_overflow"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_plant.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_plant.json
deleted file mode 100644
index 74d9811..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/item_filter_plant.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/item_filter_plant"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_smelt.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_smelt.json
deleted file mode 100644
index d4f0bc2..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/item_filter_smelt.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/item_filter_smelt"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/poweradvantage/models/item/steel_frame.json b/src/main/resources/assets/poweradvantage/models/item/steel_frame.json
deleted file mode 100644
index e87a33b..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/steel_frame.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/steel_frame"
-}
diff --git a/src/main/resources/assets/poweradvantage/models/item/still.json b/src/main/resources/assets/poweradvantage/models/item/still.json
deleted file mode 100644
index e70ea2a..0000000
--- a/src/main/resources/assets/poweradvantage/models/item/still.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "parent": "poweradvantage:block/still_off"
-}
\ No newline at end of file
diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info
index a78e751..611a5e3 100644
--- a/src/main/resources/mcmod.info
+++ b/src/main/resources/mcmod.info
@@ -1,11 +1,11 @@
[
{
- "modid": "poweradvantage",
- "name": "Power Advantage",
+ "modid": "basepower",
+ "name": "basePower",
"description": "API for power DrCyano's power systems mods.",
"version": "${version}",
"mcversion": "${mcversion}",
- "url": "https://github.com/MinecraftModDevelopmentMods/PowerAdvantage",
+ "url": "https://github.com/MinecraftModDevelopmentMods/basePower",
"updateUrl": "",
"authorList": ["DrCyano (aka Cyanobacterium)"],
"credits": "The Forge and FML guys, for making the Forge modding API (you guys are awesome), engineers everywhere, and the mod author DrCyano (aka Cyanobacterium)",
diff --git a/src/test/java/zone/moddev/mc/poweradvantage/UniversalBucketStartupTest.java b/src/test/java/zone/moddev/mc/basepower/UniversalBucketStartupTest.java
similarity index 97%
rename from src/test/java/zone/moddev/mc/poweradvantage/UniversalBucketStartupTest.java
rename to src/test/java/zone/moddev/mc/basepower/UniversalBucketStartupTest.java
index f52f34a..a7096ab 100644
--- a/src/test/java/zone/moddev/mc/poweradvantage/UniversalBucketStartupTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/UniversalBucketStartupTest.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage;
+package zone.moddev.mc.basepower;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
diff --git a/src/test/java/zone/moddev/mc/basepower/compat/LegacyIdentityTest.java b/src/test/java/zone/moddev/mc/basepower/compat/LegacyIdentityTest.java
new file mode 100644
index 0000000..708a540
--- /dev/null
+++ b/src/test/java/zone/moddev/mc/basepower/compat/LegacyIdentityTest.java
@@ -0,0 +1,124 @@
+package zone.moddev.mc.basepower.compat;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ListMultimap;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import net.minecraft.init.Bootstrap;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fml.common.event.FMLMissingMappingsEvent;
+import net.minecraftforge.fml.common.registry.GameRegistry;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import static org.junit.Assert.*;
+
+public class LegacyIdentityTest {
+ @Rule public final TemporaryFolder temporary = new TemporaryFolder();
+ @BeforeClass public static void bootstrap() { Bootstrap.register(); }
+
+ @Test public void originalConfigIsCopiedOnceAndNewConfigWins() throws Exception {
+ Path config = temporary.newFolder().toPath();
+ Path old = config.resolve("poweradvantage.cfg"), current = config.resolve("basepower.cfg");
+ byte[] original = "options { S:recipe_mode=APOCALYPTIC }".getBytes(StandardCharsets.UTF_8);
+ Files.write(old, original);
+ LegacyIdentity.migrateConfiguration(current.toFile(), "poweradvantage");
+ assertArrayEquals(original, Files.readAllBytes(current));
+ byte[] edited = "new user authority".getBytes(StandardCharsets.UTF_8);
+ Files.write(current, edited);
+ LegacyIdentity.migrateConfiguration(current.toFile(), "poweradvantage");
+ assertArrayEquals(edited, Files.readAllBytes(current));
+ assertArrayEquals(original, Files.readAllBytes(old));
+ }
+
+ @Test public void originalTileLoadsAndSavesUnderTheNewCanonicalIdentity() {
+ LegacyIdentity.registerTileEntity(MigrationTile.class, "basepower.test_migration_tile");
+ NBTTagCompound source = new NBTTagCompound();
+ source.setString("id", "poweradvantage.test_migration_tile");
+ source.setInteger("x", 7); source.setInteger("y", 64); source.setInteger("z", -11);
+ TileEntity loaded = TileEntity.create(null, source);
+ assertTrue(loaded instanceof MigrationTile);
+ NBTTagCompound saved = loaded.writeToNBT(new NBTTagCompound());
+ assertEquals("basepower.test_migration_tile", saved.getString("id"));
+ assertEquals(7, saved.getInteger("x"));
+ assertEquals(-11, saved.getInteger("z"));
+ assertTrue(TileEntity.create(null, saved) instanceof MigrationTile);
+ }
+
+ @Test public void unknownOwnedMappingsFailInsteadOfBeingDiscarded() {
+ ListMultimap missing = ArrayListMultimap.create();
+ FMLMissingMappingsEvent.MissingMapping owned = new FMLMissingMappingsEvent.MissingMapping(
+ GameRegistry.Type.ITEM, new ResourceLocation("poweradvantage", "not_a_real_component"), 30000);
+ FMLMissingMappingsEvent.MissingMapping foreign = new FMLMissingMappingsEvent.MissingMapping(
+ GameRegistry.Type.ITEM, new ResourceLocation("unrelated", "not_a_real_component"), 30001);
+ missing.put("poweradvantage", owned); missing.put("unrelated", foreign);
+ LegacyIdentity.remapMissingMappings(new FMLMissingMappingsEvent(missing), "poweradvantage", "basepower");
+ assertEquals(FMLMissingMappingsEvent.Action.FAIL, owned.getAction());
+ assertEquals(FMLMissingMappingsEvent.Action.DEFAULT, foreign.getAction());
+ }
+
+ @Test public void bothBlockAndItemMappingsResolveTheExactRegisteredObject() {
+ ListMultimap missing = ArrayListMultimap.create();
+ FMLMissingMappingsEvent.MissingMapping block = new FMLMissingMappingsEvent.MissingMapping(
+ GameRegistry.Type.BLOCK, new ResourceLocation("legacy_minecraft", "stone"), 2000);
+ FMLMissingMappingsEvent.MissingMapping item = new FMLMissingMappingsEvent.MissingMapping(
+ GameRegistry.Type.ITEM, new ResourceLocation("legacy_minecraft", "diamond"), 2001);
+ missing.put("legacy_minecraft", block); missing.put("legacy_minecraft", item);
+ LegacyIdentity.remapMissingMappings(new FMLMissingMappingsEvent(missing), "legacy_minecraft", "minecraft");
+ assertEquals(FMLMissingMappingsEvent.Action.REMAP, block.getAction());
+ assertEquals(FMLMissingMappingsEvent.Action.REMAP, item.getAction());
+ assertSame(net.minecraft.init.Blocks.STONE, block.getTarget());
+ assertSame(net.minecraft.init.Items.DIAMOND, item.getTarget());
+ }
+
+ @Test public void lootMigrationPreservesCustomValuesAndDoesNotActivateTwoCopies() throws Exception {
+ Path config = temporary.newFolder().toPath();
+ Path old = config.resolve("additional-loot-tables/poweradvantage/chests/custom.json");
+ Files.createDirectories(old.getParent());
+ byte[] original = "{\"name\":\"poweradvantage:sprocket\",\"weight\":17,\"foreign\":\"basemetals:steel_ingot\"}"
+ .getBytes(StandardCharsets.UTF_8);
+ Files.write(old, original);
+ LegacyIdentity.migrateAdditionalLootTables(config, "poweradvantage", "basepower");
+ Path current = config.resolve("additional-loot-tables/basepower/chests/custom.json");
+ String migrated = new String(Files.readAllBytes(current), StandardCharsets.UTF_8);
+ assertTrue(migrated.contains("basepower:sprocket"));
+ assertTrue(migrated.contains("17")); assertTrue(migrated.contains("basemetals:steel_ingot"));
+ assertFalse(Files.exists(old));
+ assertArrayEquals(original, Files.readAllBytes(old.resolveSibling("custom.json.before-basepower")));
+ LegacyIdentity.migrateAdditionalLootTables(config, "poweradvantage", "basepower");
+ assertEquals(migrated, new String(Files.readAllBytes(current), StandardCharsets.UTF_8));
+ }
+
+ @Test public void onlyExactNamespacePrefixesAreRewritten() {
+ assertEquals("basepower:sprocket", LegacyIdentity.remapIdentifier("poweradvantage:sprocket", "poweradvantage", "basepower"));
+ assertEquals("otherpoweradvantage:sprocket", LegacyIdentity.remapIdentifier("otherpoweradvantage:sprocket", "poweradvantage", "basepower"));
+ }
+
+ @Test public void oldAndNewJarsCannotBeLoadedTogether() {
+ LegacyIdentity.requireReplacementsOnly(id -> false);
+ for (String name : new String[] { "poweradvantage", "steamadvantage", "electricadvantage" }) {
+ try {
+ LegacyIdentity.requireReplacementsOnly(name::equals);
+ fail("Mixed old/new mod sets must stop before configuration or world migration");
+ } catch (IllegalStateException expected) {
+ assertTrue(expected.getMessage().contains(name));
+ assertTrue(expected.getMessage().contains("Remove"));
+ }
+ }
+ }
+
+ @Test public void steamLootKeepsTheFourPersistedEnchantmentKeysButRenamesItems() {
+ for (String name : new String[] { "rapid_reload", "powderless", "high_explosive", "recoil" }) {
+ assertEquals("steamadvantage:" + name,
+ LegacyIdentity.remapIdentifier("steamadvantage:" + name, "steamadvantage", "basesteam"));
+ }
+ assertEquals("basesteam:musket", LegacyIdentity.remapIdentifier("steamadvantage:musket", "steamadvantage", "basesteam"));
+ }
+
+ public static class MigrationTile extends TileEntity { }
+}
diff --git a/src/test/java/zone/moddev/mc/basepower/compat/LegacyLevelDataTest.java b/src/test/java/zone/moddev/mc/basepower/compat/LegacyLevelDataTest.java
new file mode 100644
index 0000000..97d9608
--- /dev/null
+++ b/src/test/java/zone/moddev/mc/basepower/compat/LegacyLevelDataTest.java
@@ -0,0 +1,120 @@
+package zone.moddev.mc.basepower.compat;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.io.OutputStream;
+import net.minecraft.nbt.CompressedStreamTools;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import static org.junit.Assert.*;
+
+public class LegacyLevelDataTest {
+ @Rule public final TemporaryFolder temporary = new TemporaryFolder();
+
+ private NBTTagCompound original() {
+ NBTTagCompound root = new NBTTagCompound(), forge = new NBTTagCompound();
+ NBTTagList fluids = new NBTTagList();
+ for (String id : new String[] { "poweradvantage:crude_oil", "minecraft:water", "basemetals:mercury",
+ "poweradvantage:refined_oil", "othermod:crude_oil" }) fluids.appendTag(new NBTTagString(id));
+ forge.setTag("DefaultFluidList", fluids);
+ forge.setInteger("Unrelated", 12345);
+ root.setTag("Forge", forge);
+ root.setString("PlayerCustomText", "poweradvantage:crude_oil");
+ root.setIntArray("Energy", new int[] { 0x3f800001, 0x44a00000 });
+ return root;
+ }
+
+ @Test public void onlyTheTwoOwnedFluidOwnerNamesChange() {
+ NBTTagCompound root = original();
+ assertTrue(LegacyLevelData.remapFluidDefaults(root));
+ NBTTagList fluids = root.getCompoundTag("Forge").getTagList("DefaultFluidList", 8);
+ assertEquals(5, fluids.tagCount());
+ assertEquals("basepower:crude_oil", fluids.getStringTagAt(0));
+ assertEquals("minecraft:water", fluids.getStringTagAt(1));
+ assertEquals("basemetals:mercury", fluids.getStringTagAt(2));
+ assertEquals("basepower:refined_oil", fluids.getStringTagAt(3));
+ assertEquals("othermod:crude_oil", fluids.getStringTagAt(4));
+ assertEquals("poweradvantage:crude_oil", root.getString("PlayerCustomText"));
+ assertEquals(12345, root.getCompoundTag("Forge").getInteger("Unrelated"));
+ assertArrayEquals(new int[] {0x3f800001, 0x44a00000}, root.getIntArray("Energy"));
+ assertFalse(LegacyLevelData.remapFluidDefaults(root));
+ }
+
+ @Test public void bothHeadersHaveExactBackupsAndAByteStableSecondPass() throws Exception {
+ Path world = temporary.newFolder().toPath();
+ for (String name : new String[] { "level.dat", "level.dat_old" }) {
+ try (OutputStream output = Files.newOutputStream(world.resolve(name))) {
+ CompressedStreamTools.writeCompressed(original(), output);
+ }
+ }
+ byte[] before = Files.readAllBytes(world.resolve("level.dat"));
+ LegacyLevelData.migrateWorld(world);
+ byte[] migrated = Files.readAllBytes(world.resolve("level.dat"));
+ assertFalse(java.util.Arrays.equals(before, migrated));
+ try (java.util.stream.Stream backups = Files.list(world.resolve("basepower-migration-backups"))) {
+ Path[] files = backups.toArray(Path[]::new);
+ assertEquals(2, files.length);
+ for (Path backup : files) assertArrayEquals(before, Files.readAllBytes(backup));
+ }
+ LegacyLevelData.migrateWorld(world);
+ assertArrayEquals(migrated, Files.readAllBytes(world.resolve("level.dat")));
+ assertArrayEquals(migrated, Files.readAllBytes(world.resolve("level.dat_old")));
+ }
+
+ @Test public void aWorldWithoutOwnedDefaultsIsNotRewritten() throws Exception {
+ Path world = temporary.newFolder().toPath();
+ NBTTagCompound root = new NBTTagCompound(); root.setString("Untouched", "value");
+ try (OutputStream output = Files.newOutputStream(world.resolve("level.dat"))) {
+ CompressedStreamTools.writeCompressed(root, output);
+ }
+ byte[] before = Files.readAllBytes(world.resolve("level.dat"));
+ LegacyLevelData.migrateWorld(world);
+ assertArrayEquals(before, Files.readAllBytes(world.resolve("level.dat")));
+ assertFalse(Files.exists(world.resolve("basepower-migration-backups")));
+ }
+
+ @Test public void savedModOwnersChangeOnlyForInstalledReplacements() {
+ NBTTagCompound root = new NBTTagCompound(), fml = new NBTTagCompound();
+ NBTTagList mods = new NBTTagList();
+ for (String name : new String[] { "poweradvantage", "steamadvantage", "electricadvantage", "basemetals" }) {
+ NBTTagCompound mod = new NBTTagCompound(); mod.setString("ModId", name); mod.setString("ModVersion", "old-version");
+ mods.appendTag(mod);
+ }
+ fml.setTag("ModList", mods); root.setTag("FML", fml);
+ java.util.Set installed = new java.util.HashSet<>(java.util.Arrays.asList("basepower", "basesteam"));
+ assertTrue(LegacyLevelData.remapModList(root, installed));
+ assertEquals("basepower", mods.getCompoundTagAt(0).getString("ModId"));
+ assertEquals("basesteam", mods.getCompoundTagAt(1).getString("ModId"));
+ assertEquals("electricadvantage", mods.getCompoundTagAt(2).getString("ModId"));
+ assertEquals("basemetals", mods.getCompoundTagAt(3).getString("ModId"));
+ for (int index = 0; index < 4; index++) assertEquals("old-version", mods.getCompoundTagAt(index).getString("ModVersion"));
+ assertFalse(LegacyLevelData.remapModList(root, installed));
+ }
+
+ @Test public void ambiguousOldAndNewOwnersFailBeforeChangingTheHeader() throws Exception {
+ Path world = temporary.newFolder().toPath();
+ NBTTagCompound root = original(), fml = new NBTTagCompound();
+ NBTTagList mods = new NBTTagList();
+ for (String name : new String[] { "poweradvantage", "basepower" }) {
+ NBTTagCompound mod = new NBTTagCompound(); mod.setString("ModId", name); mods.appendTag(mod);
+ }
+ fml.setTag("ModList", mods); root.setTag("FML", fml);
+ Path header = world.resolve("level.dat");
+ try (OutputStream output = Files.newOutputStream(header)) {
+ CompressedStreamTools.writeCompressed(root, output);
+ }
+ byte[] before = Files.readAllBytes(header);
+ try {
+ LegacyLevelData.migrateWorld(world);
+ fail("An ambiguous old/new installation must not be silently accepted");
+ } catch (IllegalStateException expected) {
+ assertTrue(expected.getMessage().contains("both poweradvantage and basepower"));
+ }
+ assertArrayEquals(before, Files.readAllBytes(header));
+ assertFalse(Files.exists(world.resolve("basepower-migration-backups")));
+ }
+}
diff --git a/src/test/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentityTest.java b/src/test/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentityTest.java
new file mode 100644
index 0000000..4445015
--- /dev/null
+++ b/src/test/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentityTest.java
@@ -0,0 +1,440 @@
+package zone.moddev.mc.basepower.compat;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import static org.junit.Assert.*;
+
+public class LegacyWorldgenIdentityTest {
+ @Rule public final TemporaryFolder temporary = new TemporaryFolder();
+
+ private Path root() throws IOException { return temporary.newFolder().toPath(); }
+ private Path put(Path root, String relative, String json) throws IOException {
+ Path path = root.resolve(relative);
+ Files.createDirectories(path.getParent());
+ Files.write(path, json.getBytes(StandardCharsets.UTF_8));
+ return path;
+ }
+ private JsonObject read(Path path) throws IOException {
+ return new JsonParser().parse(new String(Files.readAllBytes(path), StandardCharsets.UTF_8)).getAsJsonObject();
+ }
+ private String os1(String owner) {
+ return "{\"dimensions\":[{\"dimension\":0,\"ores\":[{\"blockID\":\"" + owner
+ + ":crude_oil\",\"frequency\":0.25,\"minHeight\":16,\"maxHeight\":64}]}]}";
+ }
+ private String provider(String owner, String block) {
+ return "{\"schema_version\":3,\"provider_revision\":1,\"provider_modid\":\"" + owner
+ + "\",\"fluid_deposits\":{\"" + owner + ":fluid_deposit/desert_crude_oil\":{\"block\":\""
+ + block + "\",\"enabled\":false}}}";
+ }
+ private List backups(Path root) throws IOException {
+ try (Stream walk = Files.walk(root)) {
+ return walk.filter(path -> path.getFileName().toString().endsWith(".bak")).collect(Collectors.toList());
+ }
+ }
+ private void fails(Path root) throws Exception {
+ try {
+ LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower");
+ fail("Expected fail-closed migration");
+ } catch (IOException expected) { assertFalse(expected.getMessage().isEmpty()); }
+ }
+
+ @Test public void oldOs1FilenameIsRetiredAndParametersAreUnchanged() throws Exception {
+ Path root = root();
+ String original = os1("poweradvantage");
+ Path old = put(root, "orespawn/poweradvantage.json", original);
+ assertEquals(2, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower"));
+ assertFalse(Files.exists(old));
+ JsonObject ore = read(root.resolve("orespawn/basepower.json")).getAsJsonArray("dimensions")
+ .get(0).getAsJsonObject().getAsJsonArray("ores").get(0).getAsJsonObject();
+ assertEquals("basepower:crude_oil", ore.get("blockID").getAsString());
+ assertEquals(0.25, ore.get("frequency").getAsDouble(), 0);
+ assertEquals(64, ore.get("maxHeight").getAsInt());
+ assertEquals(original, new String(Files.readAllBytes(backups(root).get(0)), StandardCharsets.UTF_8));
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower"));
+ assertEquals(1, backups(root).size());
+ }
+
+ @Test public void explicitProviderPreventsBridgeOverwritingItFromEitherLegacyFilename() throws Exception {
+ Path root = root();
+ Path explicit = put(root, "basepower-orespawn.json", provider("basepower", "othermod:oil"));
+ byte[] authority = Files.readAllBytes(explicit);
+ put(root, "orespawn/poweradvantage.json", os1("poweradvantage"));
+ put(root, "orespawn/basepower.json", os1("basepower"));
+ assertEquals(2, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower"));
+ assertArrayEquals(authority, Files.readAllBytes(explicit));
+ assertFalse(Files.exists(root.resolve("orespawn/poweradvantage.json")));
+ assertFalse(Files.exists(root.resolve("orespawn/basepower.json")));
+ assertEquals(2, backups(root).size());
+ }
+
+ @Test public void oldProviderBecomesLoadedOwnerWithoutEnablingUserDisabledRule() throws Exception {
+ Path root = root();
+ put(root, "poweradvantage-orespawn.json", provider("poweradvantage", "poweradvantage:crude_oil"));
+ assertEquals(2, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower"));
+ JsonObject migrated = read(root.resolve("basepower-orespawn.json"));
+ assertEquals("basepower", migrated.get("provider_modid").getAsString());
+ JsonObject rule = migrated.getAsJsonObject("fluid_deposits")
+ .getAsJsonObject("basepower:fluid_deposit/desert_crude_oil");
+ assertEquals("basepower:crude_oil", rule.get("block").getAsString());
+ assertFalse(rule.get("enabled").getAsBoolean());
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower"));
+ }
+
+ @Test public void conflictingAuthoritiesFailBeforeAnyWriteOrBackup() throws Exception {
+ Path root = root();
+ Path old = put(root, "poweradvantage-orespawn.json", provider("poweradvantage", "poweradvantage:crude_oil"));
+ put(root, "basepower-orespawn.json", provider("basepower", "othermod:oil"));
+ byte[] before = Files.readAllBytes(old);
+ fails(root);
+ assertArrayEquals(before, Files.readAllBytes(old));
+ assertTrue(backups(root).isEmpty());
+ }
+
+ @Test public void savedWorldRewritesIdsManifestsAndSelectorsButNotTagsOrText() throws Exception {
+ Path world = root();
+ Path profile = put(world, "serverconfig/orespawn-worldgen.json", "{\"schema_version\":5,"
+ + "\"ores\":{\"electricadvantage:ore/lithium\":{\"block\":\"electricadvantage:li_ore\","
+ + "\"enabled\":false,\"source_provider\":\"electricadvantage\",\"host_tags\":[\"electricadvantage:stone\"],"
+ + "\"host_blocks\":[\"electricadvantage:steel_frame\",{\"block\":\"other:stone\"}],"
+ + "\"notes\":\"electricadvantage:li_ore\"}},\"providers\":{\"electricadvantage\":{"
+ + "\"profile_defaults_applied\":true,\"known_ores\":[\"electricadvantage:ore/lithium\"]}},"
+ + "\"resource_sources\":{\"lithium\":\"electricadvantage\",\"sulfur\":\"none\"},"
+ + "\"description\":\"electricadvantage:li_ore\"}");
+ Path unrelated = put(world, "another/serverconfig/orespawn-worldgen.json", "not JSON");
+ assertEquals(1, LegacyWorldgenIdentity.migrateWorld(world, "electricadvantage", "baseelectric"));
+ JsonObject migrated = read(profile);
+ JsonObject rule = migrated.getAsJsonObject("ores").getAsJsonObject("baseelectric:ore/lithium");
+ assertEquals("baseelectric:li_ore", rule.get("block").getAsString());
+ assertEquals("baseelectric", rule.get("source_provider").getAsString());
+ assertEquals("electricadvantage:stone", rule.getAsJsonArray("host_tags").get(0).getAsString());
+ assertEquals("baseelectric:steel_frame", rule.getAsJsonArray("host_blocks").get(0).getAsString());
+ assertEquals("electricadvantage:li_ore", rule.get("notes").getAsString());
+ assertEquals("baseelectric", migrated.getAsJsonObject("resource_sources").get("lithium").getAsString());
+ assertEquals("none", migrated.getAsJsonObject("resource_sources").get("sulfur").getAsString());
+ assertFalse(migrated.getAsJsonObject("providers").has("electricadvantage"));
+ assertEquals("not JSON", new String(Files.readAllBytes(unrelated), StandardCharsets.UTF_8));
+ assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, "electricadvantage", "baseelectric"));
+ }
+
+ @Test public void legacyWorldRulesRememberModernDefaultsSoTheyCannotBeAddedAlongside() throws Exception {
+ Path world = root();
+ Path profile = put(world, "serverconfig/orespawn-worldgen.json", "{\"schema_version\":5,\"ores\":{"
+ + "\"poweradvantage:legacy/poweradvantage_crude_oil_0\":{\"block\":\"poweradvantage:crude_oil\","
+ + "\"enabled\":false}}}");
+ LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower");
+ JsonObject migrated = read(profile);
+ assertTrue(migrated.getAsJsonObject("ores").has("basepower:legacy/basepower_crude_oil_0"));
+ JsonObject manifest = migrated.getAsJsonObject("providers").getAsJsonObject("basepower");
+ assertTrue(manifest.get("profile_defaults_applied").getAsBoolean());
+ assertEquals("basepower:fluid_deposit/desert_crude_oil", manifest.getAsJsonArray("known_fluid_deposits")
+ .get(0).getAsString());
+ assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"));
+ }
+
+ @Test public void malformedOrDuplicateOwnedJsonFailsWithoutImportingDefaults() throws Exception {
+ for (String invalid : new String[] { "[]", "{unquoted:true}", "{\"dimensions\":[],\"dimensions\":[]}",
+ "{\"dimensions\":[]} {}", "{\"dimensions\":[{\"dimension\":null,\"ores\":[]}]}",
+ "{\"dimensions\":[{\"dimension\":0,\"ores\":[{\"blockID\":null}]}]}" }) {
+ Path root = root();
+ Path old = put(root, "orespawn/poweradvantage.json", invalid);
+ fails(root);
+ assertEquals(invalid, new String(Files.readAllBytes(old), StandardCharsets.UTF_8));
+ assertFalse(Files.exists(root.resolve("orespawn/basepower.json")));
+ assertTrue(backups(root).isEmpty());
+ }
+ }
+
+ @Test public void keyCollisionsInWorldAreNotSilentlyMerged() throws Exception {
+ Path world = root();
+ Path profile = put(world, "serverconfig/orespawn-worldgen.json", "{\"ores\":{"
+ + "\"poweradvantage:ore/custom\":{\"block\":\"poweradvantage:crude_oil\",\"enabled\":false},"
+ + "\"basepower:ore/custom\":{\"block\":\"basepower:crude_oil\",\"enabled\":true}}}");
+ byte[] before = Files.readAllBytes(profile);
+ try { LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"); fail(); }
+ catch (IOException expected) { assertTrue(expected.getMessage().contains("Conflicting")); }
+ assertArrayEquals(before, Files.readAllBytes(profile));
+ assertTrue(backups(world).isEmpty());
+ }
+
+ @Test public void existingBridgeMarkerCannotSilentlySkipLegacyAuthority() throws Exception {
+ Path root = root();
+ put(root, "orespawn/poweradvantage.json", os1("poweradvantage"));
+ put(root, ".orespawn-legacy-bridge-migrated", "provider_schema=4");
+ fails(root);
+ assertTrue(backups(root).isEmpty());
+ }
+
+ @Test public void standaloneOldImportsRequireReconciliationInsteadOfDuplicatingNewProvider() throws Exception {
+ Path root = root();
+ put(root, "orespawn/poweradvantage.json", os1("poweradvantage"));
+ put(root, "orespawn-orespawn.json", "{\"ores\":{\"orespawn:legacy/poweradvantage/poweradvantage_crude_oil_0\":{"
+ + "\"block\":\"poweradvantage:crude_oil\"}}}");
+ fails(root);
+ assertTrue(Files.exists(root.resolve("orespawn/poweradvantage.json")));
+ assertTrue(backups(root).isEmpty());
+ }
+
+ @Test public void originalBackupSurvivesFurtherUserEditsAndSecondMigration() throws Exception {
+ Path world = root();
+ Path profile = put(world, "serverconfig/orespawn-worldgen.json", "{\"ores\":{\"poweradvantage:ore/custom\":{"
+ + "\"block\":\"poweradvantage:crude_oil\",\"enabled\":false}}}");
+ byte[] original = Files.readAllBytes(profile);
+ LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower");
+ Path backup = backups(world).get(0);
+ put(world, "serverconfig/orespawn-worldgen.json", "{\"ores\":{\"poweradvantage:ore/custom\":{"
+ + "\"block\":\"poweradvantage:crude_oil\",\"enabled\":true}}}");
+ LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower");
+ assertArrayEquals(original, Files.readAllBytes(backup));
+ assertEquals(2, backups(world).size());
+ assertTrue(read(profile).getAsJsonObject("ores").getAsJsonObject("basepower:ore/custom")
+ .get("enabled").getAsBoolean());
+ }
+
+ @Test public void unsupportedPairsCannotBecomePathsAndMissingFilesAreNoOps() throws Exception {
+ Path root = root();
+ try { LegacyWorldgenIdentity.migrateConfig(root, "../escape", "basepower"); fail(); }
+ catch (IllegalArgumentException expected) { assertTrue(backups(root).isEmpty()); }
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower"));
+ assertEquals(0, LegacyWorldgenIdentity.migrateWorld(root, "poweradvantage", "basepower"));
+ assertEquals("baseelectric", LegacyWorldgenIdentity.migrateSelectorValue("electricadvantage",
+ "electricadvantage", "baseelectric"));
+ assertEquals("other", LegacyWorldgenIdentity.migrateSelectorValue("other", "electricadvantage", "baseelectric"));
+ }
+
+ @Test public void invalidLegacyNumbersAndUnsupportedDisableFailClosed() throws Exception {
+ for (String extra : new String[] { "\"frequency\":\"oops\"", "\"frequency\":-1", "\"size\":1.5",
+ "\"minHeight\":-1", "\"maxHeight\":257", "\"blockMeta\":16", "\"enabled\":false" }) {
+ Path root = root();
+ put(root, "orespawn/poweradvantage.json", "{\"dimensions\":[{\"dimension\":0,\"ores\":[{"
+ + "\"blockID\":\"poweradvantage:crude_oil\"," + extra + "}]}]}");
+ fails(root);
+ assertTrue(backups(root).isEmpty());
+ }
+ }
+
+ @Test public void os3BlockNamesAreScopedAndCustomGeneratorNamesAreNotRewritten() throws Exception {
+ Path root = root();
+ put(root, "orespawn3/poweradvantage.json", "{\"version\":\"1.0\",\"spawns\":{\"custom\":{"
+ + "\"feature\":\"poweradvantage:generator\",\"blocks\":[{\"name\":\"poweradvantage:crude_oil\","
+ + "\"chance\":100,\"metadata\":0}]}}}");
+ assertEquals(2, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower"));
+ JsonObject spawn = read(root.resolve("orespawn3/basepower.json")).getAsJsonObject("spawns").getAsJsonObject("custom");
+ assertEquals("basepower:crude_oil", spawn.getAsJsonArray("blocks").get(0).getAsJsonObject().get("name").getAsString());
+ assertEquals("poweradvantage:generator", spawn.get("feature").getAsString());
+ }
+
+ @Test public void preexistingCorruptBackupIsNeverOverwritten() throws Exception {
+ Path world = root();
+ String json = "{\"ores\":{\"poweradvantage:ore/custom\":{\"block\":\"poweradvantage:crude_oil\"}}}";
+ Path profile = put(world, "serverconfig/orespawn-worldgen.json", json);
+ LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower");
+ Path backup = backups(world).get(0);
+ Files.write(backup, "corrupt".getBytes(StandardCharsets.UTF_8));
+ Files.write(profile, json.getBytes(StandardCharsets.UTF_8));
+ try { LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"); fail(); }
+ catch (IOException expected) { assertTrue(expected.getMessage().contains("backup conflict")); }
+ assertEquals("corrupt", new String(Files.readAllBytes(backup), StandardCharsets.UTF_8));
+ assertEquals(json, new String(Files.readAllBytes(profile), StandardCharsets.UTF_8));
+ }
+
+ @Test public void wrongProviderFilenameAndPendingImportBesideSavedRulesAreRejected() throws Exception {
+ Path root = root();
+ put(root, "poweradvantage-orespawn.json", provider("basepower", "basepower:crude_oil"));
+ fails(root);
+ assertTrue(backups(root).isEmpty());
+ Path other = root();
+ put(other, "orespawn/poweradvantage.json", os1("poweradvantage"));
+ put(other, "orespawn-worldgen.json", "{\"fluid_deposits\":{\"poweradvantage:fluid_deposit/desert_crude_oil\":{"
+ + "\"block\":\"poweradvantage:crude_oil\"}}}");
+ fails(other);
+ assertTrue(backups(other).isEmpty());
+ }
+
+ @Test public void linkedAncestorCannotRedirectWorldMigration() throws Exception {
+ Path world = root();
+ Path outside = root();
+ Path original = put(outside, "orespawn-worldgen.json", "{\"block\":\"poweradvantage:crude_oil\"}");
+ try { Files.createSymbolicLink(world.resolve("serverconfig"), outside); }
+ catch (IOException | UnsupportedOperationException | SecurityException unavailable) {
+ org.junit.Assume.assumeNoException(unavailable);
+ }
+ byte[] before = Files.readAllBytes(original);
+ try { LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"); fail(); }
+ catch (IOException expected) { assertTrue(expected.getMessage().contains("linked/reparse")); }
+ assertArrayEquals(before, Files.readAllBytes(original));
+ }
+
+ @Test public void bothOwnedPairsMigrateOneGlobalProfileWithoutLosingEitherAuthority() throws Exception {
+ Path config = root();
+ Path global = put(config, "orespawn-worldgen.json", "{\"schema_version\":6,"
+ + "\"fluid_deposits\":{\"poweradvantage:fluid_deposit/desert_crude_oil\":{"
+ + "\"block\":\"poweradvantage:crude_oil\",\"enabled\":false,\"source_provider\":\"poweradvantage\"}},"
+ + "\"ores\":{\"electricadvantage:ore/lithium\":{\"block\":\"electricadvantage:li_ore\","
+ + "\"enabled\":false,\"source_mod\":\"electricadvantage\"},\"electricadvantage:ore/sulfur\":{"
+ + "\"block\":\"othermod:sulfur\",\"enabled\":true}},\"providers\":{"
+ + "\"poweradvantage\":{\"provider_revision\":3,\"profile_defaults_applied\":true,"
+ + "\"known_fluid_deposits\":[\"poweradvantage:fluid_deposit/desert_crude_oil\"]},"
+ + "\"electricadvantage\":{\"provider_revision\":7,\"profile_defaults_applied\":true,"
+ + "\"known_ores\":[\"electricadvantage:ore/lithium\",\"electricadvantage:ore/sulfur\"]}},"
+ + "\"ore_providers\":{\"electricadvantage\":{\"provider_revision\":7,"
+ + "\"known_ores\":[\"electricadvantage:ore/lithium\"]}},"
+ + "\"resource_sources\":{\"crude_oil\":\"poweradvantage\",\"lithium\":\"electricadvantage\",\"sulfur\":\"none\"},"
+ + "\"retrogen\":{\"enabled\":false,\"force\":false,\"revision\":17},\"notes\":null}");
+ assertEquals(1, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower"));
+ assertEquals(1, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric"));
+ JsonObject migrated = read(global);
+ JsonObject oil = migrated.getAsJsonObject("fluid_deposits").getAsJsonObject("basepower:fluid_deposit/desert_crude_oil");
+ assertEquals("basepower:crude_oil", oil.get("block").getAsString());
+ assertFalse(oil.get("enabled").getAsBoolean());
+ JsonObject lithium = migrated.getAsJsonObject("ores").getAsJsonObject("baseelectric:ore/lithium");
+ assertEquals("baseelectric:li_ore", lithium.get("block").getAsString());
+ assertFalse(lithium.get("enabled").getAsBoolean());
+ assertEquals("othermod:sulfur", migrated.getAsJsonObject("ores").getAsJsonObject("baseelectric:ore/sulfur")
+ .get("block").getAsString());
+ assertEquals(3, migrated.getAsJsonObject("providers").getAsJsonObject("basepower").get("provider_revision").getAsInt());
+ assertEquals(7, migrated.getAsJsonObject("providers").getAsJsonObject("baseelectric").get("provider_revision").getAsInt());
+ assertTrue(migrated.getAsJsonObject("ore_providers").has("baseelectric"));
+ assertEquals("basepower", migrated.getAsJsonObject("resource_sources").get("crude_oil").getAsString());
+ assertEquals("baseelectric", migrated.getAsJsonObject("resource_sources").get("lithium").getAsString());
+ assertEquals("none", migrated.getAsJsonObject("resource_sources").get("sulfur").getAsString());
+ assertEquals(17, migrated.getAsJsonObject("retrogen").get("revision").getAsInt());
+ assertFalse(migrated.getAsJsonObject("retrogen").get("force").getAsBoolean());
+ assertTrue(migrated.get("notes").isJsonNull());
+ byte[] firstPass = Files.readAllBytes(global);
+ List beforeBackups = backups(config);
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower"));
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric"));
+ assertArrayEquals(firstPass, Files.readAllBytes(global));
+ assertEquals(beforeBackups, backups(config));
+ }
+
+ @Test public void maintainedGlobalProfileIsAnExactNoOpOnRestart() throws Exception {
+ Path config = root();
+ Path profile = put(config, "orespawn-worldgen.json", currentProfile(8, "basepower"));
+ byte[] before = Files.readAllBytes(profile);
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower"));
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric"));
+ assertArrayEquals(before, Files.readAllBytes(profile));
+ assertTrue(backups(config).isEmpty());
+ }
+
+ @Test public void maintainedWorldProfileIsAnExactNoOpOnRestart() throws Exception {
+ Path world = root();
+ Path profile = put(world, "serverconfig/orespawn-worldgen.json", currentProfile(7, "basepower"));
+ byte[] before = Files.readAllBytes(profile);
+ assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"));
+ assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, "electricadvantage", "baseelectric"));
+ assertArrayEquals(before, Files.readAllBytes(profile));
+ assertTrue(backups(world).isEmpty());
+ }
+
+ @Test public void maintainedProfilesMigrateIdentityWithoutChangingGenerationChoices() throws Exception {
+ Path config = root();
+ Path world = root();
+ Path global = put(config, "orespawn-worldgen.json", currentProfile(8, "poweradvantage"));
+ Path saved = put(world, "serverconfig/orespawn-worldgen.json", currentProfile(7, "poweradvantage"));
+ byte[] globalBefore = Files.readAllBytes(global), worldBefore = Files.readAllBytes(saved);
+ assertEquals(1, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower"));
+ assertEquals(1, LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"));
+ for (Path path : new Path[] { global, saved }) {
+ JsonObject expected = new JsonParser().parse(currentProfile(path.equals(global) ? 8 : 7, "basepower")).getAsJsonObject();
+ assertEquals(expected, read(path));
+ }
+ assertArrayEquals(globalBefore, Files.readAllBytes(backups(config).get(0)));
+ assertArrayEquals(worldBefore, Files.readAllBytes(backups(world).get(0)));
+ byte[] globalAfter = Files.readAllBytes(global), worldAfter = Files.readAllBytes(saved);
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower"));
+ assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"));
+ assertArrayEquals(globalAfter, Files.readAllBytes(global));
+ assertArrayEquals(worldAfter, Files.readAllBytes(saved));
+ assertEquals(1, backups(config).size());
+ assertEquals(1, backups(world).size());
+ }
+
+ @Test public void unknownGlobalAndWorldSchemasStillFailBeforeAnyWrite() throws Exception {
+ for (boolean global : new boolean[] { true, false }) {
+ Path root = root();
+ Path profile = put(root, global ? "orespawn-worldgen.json" : "serverconfig/orespawn-worldgen.json",
+ currentProfile(global ? 9 : 8, "poweradvantage"));
+ byte[] before = Files.readAllBytes(profile);
+ try {
+ if (global) LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower");
+ else LegacyWorldgenIdentity.migrateWorld(root, "poweradvantage", "basepower");
+ fail("Unknown schema must not be rewritten or downgraded");
+ } catch (IOException expected) { assertTrue(expected.getMessage().contains("Unsupported worldgen profile schema")); }
+ assertArrayEquals(before, Files.readAllBytes(profile));
+ assertTrue(backups(root).isEmpty());
+ }
+ }
+
+ private String currentProfile(int schema, String owner) {
+ return "{\"schema_version\":" + schema + ",\"biome_defaults_revision\":3,\"ore_defaults_revision\":10,"
+ + "\"geology_mode\":\"legacy\",\"manage_vanilla_ores\":false,\"suppress_all_ore_features\":true,"
+ + "\"fluid_deposits\":{\"" + owner + ":fluid_deposit/desert_crude_oil\":{"
+ + "\"block\":\"" + owner + ":crude_oil\",\"enabled\":false,\"source_provider\":\"" + owner + "\"}},"
+ + "\"providers\":{\"" + owner + "\":{\"provider_revision\":3,\"profile_defaults_applied\":true,"
+ + "\"known_fluid_deposits\":[\"" + owner + ":fluid_deposit/desert_crude_oil\"]}},"
+ + "\"resource_sources\":{\"crude_oil\":\"" + owner + "\",\"sulfur\":\"mineralogy\"},"
+ + "\"retrogen\":{\"enabled\":false,\"force\":false,\"revision\":17},"
+ + "\"worldgen_aliases\":{\"example:stone\":\"minecraft:stone\"},"
+ + "\"formations\":{\"algorithm\":\"stable_layers\",\"custom\":{\"waviness_amplitude\":60}},"
+ + "\"notes\":\"poweradvantage:crude_oil\"}\n";
+ }
+
+ @Test public void bothLegacyAuthoritiesShareGlobalAndWorldProfilesWithNoFreshDefaultReinsertion() throws Exception {
+ Path config = root();
+ Path world = root();
+ String json = "{\"schema_version\":5,\"ores\":{"
+ + "\"poweradvantage:legacy/poweradvantage_crude_oil_0\":{\"block\":\"poweradvantage:crude_oil\",\"enabled\":false},"
+ + "\"electricadvantage:legacy/electricadvantage_li_ore_0\":{\"block\":\"electricadvantage:li_ore\",\"enabled\":true},"
+ + "\"electricadvantage:legacy/electricadvantage_sulfur_ore_1\":{\"block\":\"electricadvantage:sulfur_ore\",\"enabled\":false}}}";
+ Path global = put(config, "orespawn-worldgen.json", json);
+ Path saved = put(world, "serverconfig/orespawn-worldgen.json", json);
+ for (String[] pair : new String[][] { { "poweradvantage", "basepower" }, { "electricadvantage", "baseelectric" } }) {
+ assertEquals(1, LegacyWorldgenIdentity.migrateConfig(config, pair[0], pair[1]));
+ assertEquals(1, LegacyWorldgenIdentity.migrateWorld(world, pair[0], pair[1]));
+ }
+ assertEquals(read(global), read(saved));
+ JsonObject profile = read(saved);
+ assertEquals(3, profile.getAsJsonObject("ores").entrySet().size());
+ assertFalse(profile.has("fluid_deposits"));
+ JsonObject manifests = profile.getAsJsonObject("providers");
+ assertEquals("basepower:fluid_deposit/desert_crude_oil", manifests.getAsJsonObject("basepower")
+ .getAsJsonArray("known_fluid_deposits").get(0).getAsString());
+ assertEquals(2, manifests.getAsJsonObject("baseelectric").getAsJsonArray("known_ores").size());
+ byte[] globalBefore = Files.readAllBytes(global);
+ byte[] worldBefore = Files.readAllBytes(saved);
+ for (String[] pair : new String[][] { { "poweradvantage", "basepower" }, { "electricadvantage", "baseelectric" } }) {
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, pair[0], pair[1]));
+ assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, pair[0], pair[1]));
+ }
+ assertArrayEquals(globalBefore, Files.readAllBytes(global));
+ assertArrayEquals(worldBefore, Files.readAllBytes(saved));
+ assertEquals(2, backups(config).size());
+ assertEquals(2, backups(world).size());
+ }
+
+ @Test public void electricOs1PlusDimensionsAndTwoOutputsSurviveFilenameMigration() throws Exception {
+ Path config = root();
+ put(config, "orespawn/electricadvantage.json", "{\"dimensions\":[{\"dimension\":\"+\",\"ores\":["
+ + "{\"blockID\":\"electricadvantage:li_ore\",\"size\":8,\"variation\":2,\"frequency\":0.125,\"minHeight\":1,\"maxHeight\":32},"
+ + "{\"blockID\":\"electricadvantage:sulfur_ore\",\"size\":16,\"variation\":8,\"frequency\":1,\"minHeight\":1,\"maxHeight\":32}]}]}");
+ assertEquals(2, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric"));
+ JsonObject dimension = read(config.resolve("orespawn/baseelectric.json")).getAsJsonArray("dimensions").get(0).getAsJsonObject();
+ assertEquals("+", dimension.get("dimension").getAsString());
+ assertEquals(2, dimension.getAsJsonArray("ores").size());
+ assertEquals("baseelectric:li_ore", dimension.getAsJsonArray("ores").get(0).getAsJsonObject().get("blockID").getAsString());
+ assertEquals("baseelectric:sulfur_ore", dimension.getAsJsonArray("ores").get(1).getAsJsonObject().get("blockID").getAsString());
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric"));
+ }
+}
diff --git a/src/test/java/zone/moddev/mc/poweradvantage/compat/OreDictionaryFallbackTest.java b/src/test/java/zone/moddev/mc/basepower/compat/OreDictionaryFallbackTest.java
similarity index 95%
rename from src/test/java/zone/moddev/mc/poweradvantage/compat/OreDictionaryFallbackTest.java
rename to src/test/java/zone/moddev/mc/basepower/compat/OreDictionaryFallbackTest.java
index abccd97..1aec96a 100644
--- a/src/test/java/zone/moddev/mc/poweradvantage/compat/OreDictionaryFallbackTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/compat/OreDictionaryFallbackTest.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.compat;
+package zone.moddev.mc.basepower.compat;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
@@ -126,8 +126,8 @@ private static ItemBlock steelBlock(String itemName, String blockName) {
Item plain = new Item();
plain.setRegistryName(new ResourceLocation("basemetals", "steel_block"));
for (Item candidate : new Item[]{plain,
- steelBlock("poweradvantage:steel_frame", "poweradvantage:steel_frame"),
- steelBlock("basemetals:steel_block", "poweradvantage:steel_frame"),
+ steelBlock("basepower:steel_frame", "basepower:steel_frame"),
+ steelBlock("basemetals:steel_block", "basepower:steel_frame"),
steelBlock("basemetals:steel", "basemetals:steel")}) {
Registry registry = new Registry();
registry.steel = candidate;
@@ -173,13 +173,14 @@ private static ItemBlock steelBlock(String itemName, String blockName) {
}
@Test public void lifecycleHookPrecedesFuelAndRecipeInitialization() throws Exception {
- String source = new String(Files.readAllBytes(Paths.get("src/main/java/zone/moddev/mc/poweradvantage/PowerAdvantage.java")), StandardCharsets.UTF_8);
+ String source = new String(Files.readAllBytes(Paths.get("src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java")), StandardCharsets.UTF_8);
String init = source.substring(source.indexOf("public void init(FMLInitializationEvent event)"), source.indexOf("private void clientInit"));
String hook = "BaseMetalsCompat.registerOreDictionaryFallbacks();";
assertTrue(init.indexOf(hook) >= 0);
assertEquals(init.indexOf(hook), init.lastIndexOf(hook));
assertTrue(init.indexOf(hook) < init.indexOf("init.Fuels.init();"));
assertTrue(init.indexOf(hook) < init.indexOf("init.Recipes.init();"));
- assertTrue(source.contains("after:basemetals"));
+ assertTrue("Saved generation settings must migrate before OreSpawn reads them",
+ source.contains("required-before:orespawn@[4.0.6,5.0.0)"));
}
}
diff --git a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManagerTest.java b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManagerTest.java
similarity index 96%
rename from src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManagerTest.java
rename to src/test/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManagerTest.java
index 89633b9..a034120 100644
--- a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManagerTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManagerTest.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.conduitnetwork;
+package zone.moddev.mc.basepower.conduitnetwork;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -7,7 +7,7 @@
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import org.junit.Test;
-import zone.moddev.mc.poweradvantage.math.BlockPos4D;
+import zone.moddev.mc.basepower.math.BlockPos4D;
public class ConduitNetworkManagerTest {
private final ConduitNetworkManager manager = new ConduitNetworkManager(new ConduitType("test"));
diff --git a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/LoadedConduitNetworkTest.java b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/LoadedConduitNetworkTest.java
similarity index 99%
rename from src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/LoadedConduitNetworkTest.java
rename to src/test/java/zone/moddev/mc/basepower/conduitnetwork/LoadedConduitNetworkTest.java
index 06ee70f..ba5baad 100644
--- a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/LoadedConduitNetworkTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/LoadedConduitNetworkTest.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.conduitnetwork;
+package zone.moddev.mc.basepower.conduitnetwork;
import static org.junit.Assert.*;
@@ -29,7 +29,7 @@
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.junit.BeforeClass;
import org.junit.Test;
-import zone.moddev.mc.poweradvantage.math.BlockPos4D;
+import zone.moddev.mc.basepower.math.BlockPos4D;
public class LoadedConduitNetworkTest {
private static final ConduitType TYPE = new ConduitType("test-chunk-boundary");
diff --git a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/PowerTransferAccountingTest.java b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/PowerTransferAccountingTest.java
similarity index 97%
rename from src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/PowerTransferAccountingTest.java
rename to src/test/java/zone/moddev/mc/basepower/conduitnetwork/PowerTransferAccountingTest.java
index 070739c..709e594 100644
--- a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/PowerTransferAccountingTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/PowerTransferAccountingTest.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.conduitnetwork;
+package zone.moddev.mc.basepower.conduitnetwork;
import cyano.poweradvantage.api.*;
import java.util.Arrays;
diff --git a/src/test/java/zone/moddev/mc/poweradvantage/init/LegacyOreSpawnMigrationTest.java b/src/test/java/zone/moddev/mc/basepower/init/LegacyOreSpawnMigrationTest.java
similarity index 92%
rename from src/test/java/zone/moddev/mc/poweradvantage/init/LegacyOreSpawnMigrationTest.java
rename to src/test/java/zone/moddev/mc/basepower/init/LegacyOreSpawnMigrationTest.java
index 6cf56ff..a902bda 100644
--- a/src/test/java/zone/moddev/mc/poweradvantage/init/LegacyOreSpawnMigrationTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/init/LegacyOreSpawnMigrationTest.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
@@ -30,7 +30,7 @@ public void legacyOilIsOneRetainedRuleAndOverridesFreshApiDefaults() throws Exce
Class> bridge = Class.forName("com.mcmoddev.orespawn.compat.LegacyOs3Bridge");
Method translate = bridge.getDeclaredMethod("translateOs1ForTests", String.class, JsonObject.class);
translate.setAccessible(true);
- JsonObject converted = (JsonObject) translate.invoke(null, "poweradvantage", legacy);
+ JsonObject converted = (JsonObject) translate.invoke(null, "basepower", legacy);
assertEquals(1, converted.getAsJsonObject("spawns").entrySet().size());
assertEquals(1, OreSpawnWorldGen.createProvider().toJson()
.getAsJsonObject("fluid_deposits").entrySet().size());
@@ -38,7 +38,7 @@ public void legacyOilIsOneRetainedRuleAndOverridesFreshApiDefaults() throws Exce
Path config = temporary.newFolder("config").toPath();
Path legacyDirectory = Files.createDirectories(config.resolve("orespawn"));
Files.copy(getClass().getResourceAsStream("/orespawn-legacy/poweradvantage.json"),
- legacyDirectory.resolve("poweradvantage.json"));
+ legacyDirectory.resolve("basepower.json"));
assertTrue(OreSpawnWorldGen.describeOverride(config).contains("legacy importer authority"));
}
}
\ No newline at end of file
diff --git a/src/test/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGenTest.java b/src/test/java/zone/moddev/mc/basepower/init/OreSpawnWorldGenTest.java
similarity index 83%
rename from src/test/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGenTest.java
rename to src/test/java/zone/moddev/mc/basepower/init/OreSpawnWorldGenTest.java
index 45eff7a..a53fb95 100644
--- a/src/test/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGenTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/init/OreSpawnWorldGenTest.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
import com.google.gson.JsonObject;
import org.junit.Test;
@@ -11,12 +11,12 @@ public class OreSpawnWorldGenTest {
public void desertOilProviderUsesStableIdentityAndCoveredLakeGeometry() {
JsonObject root = OreSpawnWorldGen.createProvider().toJson();
assertEquals(4, root.get("schema_version").getAsInt());
- assertEquals("poweradvantage", root.get("provider_modid").getAsString());
+ assertEquals("basepower", root.get("provider_modid").getAsString());
JsonObject deposits = root.getAsJsonObject("fluid_deposits");
assertEquals(1, deposits.entrySet().size());
JsonObject deposit = deposits.getAsJsonObject(
- "poweradvantage:fluid_deposit/desert_crude_oil");
- assertEquals("poweradvantage:crude_oil", deposit.get("block").getAsString());
+ "basepower:fluid_deposit/desert_crude_oil");
+ assertEquals("basepower:crude_oil", deposit.get("block").getAsString());
assertTrue(deposit.get("enabled").getAsBoolean());
JsonObject overworld = deposit.getAsJsonObject("dimensions")
.getAsJsonObject("minecraft:overworld");
diff --git a/src/test/java/zone/moddev/mc/poweradvantage/machines/conveyors/ConveyorTransferTest.java b/src/test/java/zone/moddev/mc/basepower/machines/conveyors/ConveyorTransferTest.java
similarity index 95%
rename from src/test/java/zone/moddev/mc/poweradvantage/machines/conveyors/ConveyorTransferTest.java
rename to src/test/java/zone/moddev/mc/basepower/machines/conveyors/ConveyorTransferTest.java
index f0b4d91..0632749 100644
--- a/src/test/java/zone/moddev/mc/poweradvantage/machines/conveyors/ConveyorTransferTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/machines/conveyors/ConveyorTransferTest.java
@@ -1,4 +1,4 @@
-package zone.moddev.mc.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.inventory.InventoryBasic;
import net.minecraft.item.ItemStack;
@@ -6,7 +6,7 @@
import net.minecraft.util.EnumFacing;
import org.junit.BeforeClass;
import org.junit.Test;
-import zone.moddev.mc.poweradvantage.util.InventoryWrapper;
+import zone.moddev.mc.basepower.util.InventoryWrapper;
import static org.junit.Assert.*;
public class ConveyorTransferTest {
diff --git a/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidCapabilityRoutingTest.java b/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidCapabilityRoutingTest.java
new file mode 100644
index 0000000..95a15ba
--- /dev/null
+++ b/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidCapabilityRoutingTest.java
@@ -0,0 +1,78 @@
+package zone.moddev.mc.basepower.machines.fluidmachines;
+
+import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine;
+import cyano.poweradvantage.api.fluid.FluidRequest;
+import java.lang.reflect.Constructor;
+import java.util.concurrent.Callable;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumFacing;
+import net.minecraftforge.common.capabilities.Capability;
+import net.minecraftforge.fluids.*;
+import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
+import net.minecraftforge.fluids.capability.IFluidHandler;
+import org.junit.*;
+import static org.junit.Assert.*;
+
+public class FluidCapabilityRoutingTest {
+ private static Capability original;
+
+ @BeforeClass public static void bootstrap() throws Exception {
+ net.minecraft.init.Bootstrap.register();
+ original=CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY;
+ if(original==null) {
+ // Unit tests do not run FML's capability-field injection.
+ Constructor constructor=Capability.class.getDeclaredConstructor(String.class,Capability.IStorage.class,Callable.class);
+ constructor.setAccessible(true);
+ CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY=constructor.newInstance("fluid-routing-test",null,null);
+ }
+ }
+ @AfterClass public static void restore() { CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY=original; }
+
+ private static final class TwoTank extends TileEntitySimpleFluidMachine {
+ final FluidTank input=new FluidTank(1000);
+ TwoTank() { super(1000,"test"); }
+ @Override protected ItemStack[] getInventory() { return new ItemStack[0]; }
+ @Override public void tickUpdate(boolean server) {}
+ @Override public FluidTank getTank() { return tank; }
+ @Override public boolean isFluidSource() { return true; }
+ @Override public boolean isFluidSink() { return true; }
+ @Override public FluidRequest getFluidRequest(Fluid offer) { return FluidRequest.REQUEST_NOTHING; }
+ @Override public boolean canAccept(Fluid offer) { return offer==FluidRegistry.WATER; }
+ @Override public int fill(EnumFacing face,FluidStack packet,boolean execute) {
+ return packet!=null && canFill(face,packet.getFluid()) ? input.fill(packet,execute) : 0;
+ }
+ @Override public boolean canFill(EnumFacing face,Fluid fluid) { return face==EnumFacing.UP && fluid==FluidRegistry.WATER; }
+ @Override public FluidTankInfo[] getTankInfo(EnumFacing face) { return new FluidTankInfo[]{input.getInfo(),tank.getInfo()}; }
+ }
+
+ @Test public void capabilityFillsTheOverriddenInputRatherThanExposingOutputTank() {
+ TwoTank tile=new TwoTank();
+ IFluidHandler port=tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,EnumFacing.UP);
+ assertEquals(1000,port.fill(new FluidStack(FluidRegistry.WATER,1000),true));
+ assertEquals(1000,tile.input.getFluidAmount());
+ assertEquals(0,tile.getTank().getFluidAmount());
+ }
+ @Test public void capabilityHonorsFluidAndSideRestrictions() {
+ TwoTank tile=new TwoTank();
+ assertEquals(0,tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,EnumFacing.UP).fill(new FluidStack(FluidRegistry.LAVA,1000),true));
+ assertEquals(0,tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,EnumFacing.DOWN).fill(new FluidStack(FluidRegistry.WATER,1000),true));
+ assertEquals(0,tile.input.getFluidAmount());assertEquals(0,tile.getTank().getFluidAmount());
+ }
+ @Test public void simulationCapacityAndBothTankPropertiesRemainAccurate() {
+ TwoTank tile=new TwoTank();IFluidHandler port=tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,EnumFacing.UP);
+ assertEquals(1000,port.fill(new FluidStack(FluidRegistry.WATER,1000),false));
+ assertEquals(0,tile.input.getFluidAmount());assertEquals(0,tile.getTank().getFluidAmount());
+ tile.input.fill(new FluidStack(FluidRegistry.WATER,999),true);
+ assertEquals(1,port.fill(new FluidStack(FluidRegistry.WATER,10),true));
+ assertEquals(0,port.fill(new FluidStack(FluidRegistry.WATER,1),true));
+ assertEquals(2,port.getTankProperties().length);
+ }
+ @Test public void drainStillReturnsOnlyOutputAndNeverTheInputReserve() {
+ TwoTank tile=new TwoTank();tile.input.fill(new FluidStack(FluidRegistry.WATER,1000),true);
+ tile.getTank().fill(new FluidStack(FluidRegistry.LAVA,500),true);
+ IFluidHandler port=tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,EnumFacing.UP);
+ assertEquals(250,port.drain(250,false).amount);assertEquals(500,tile.getTank().getFluidAmount());
+ assertEquals(500,port.drain(600,true).amount);assertNull(port.drain(1,true));
+ assertEquals(1000,tile.input.getFluidAmount());
+ }
+}
diff --git a/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankDescriptionTest.java b/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankDescriptionTest.java
new file mode 100644
index 0000000..61f425e
--- /dev/null
+++ b/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankDescriptionTest.java
@@ -0,0 +1,40 @@
+package zone.moddev.mc.basepower.machines.fluidmachines;
+
+import java.io.InputStream;
+import net.minecraft.init.Bootstrap;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.text.translation.LanguageMap;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/** Actual item-description generation, not just the presence of language keys. */
+public class StorageTankDescriptionTest {
+ @BeforeClass public static void bootstrap() throws Exception {
+ Bootstrap.register();
+ try (InputStream input = StorageTankDescriptionTest.class.getResourceAsStream("/assets/basepower/lang/en_US.lang")) {
+ assertNotNull(input);
+ LanguageMap.inject(input);
+ }
+ }
+
+ @Test public void anEmptyTankItemActuallyRetainsItsTranslatedDescription() {
+ ItemStack item = new ItemStack(Items.PAPER);
+ new StorageTankBlock().displayInformation(item);
+ assertNotNull("Generated description must be attached to the item", item.getTagCompound());
+ assertEquals("Empty", item.getTagCompound().getCompoundTag("display").getTagList("Lore", 8).getStringTagAt(0));
+ }
+
+ @Test public void aFilledTankUsesTheNewTranslationWithoutChangingItsContents() {
+ ItemStack item = new ItemStack(Items.PAPER);
+ NBTTagCompound tag = new NBTTagCompound(); tag.setInteger("Volume", 2500); tag.setString("FluidID", "water");
+ item.setTagCompound(tag);
+ new StorageTankBlock().displayInformation(item);
+ assertEquals("2.5 buckets of water", tag.getCompoundTag("display").getTagList("Lore", 8).getStringTagAt(0));
+ assertEquals(2500, tag.getInteger("Volume"));
+ assertEquals("water", tag.getString("FluidID"));
+ assertEquals(1, item.stackSize);
+ }
+}
diff --git a/src/test/java/zone/moddev/mc/poweradvantage/registry/MachineGuiTitleTest.java b/src/test/java/zone/moddev/mc/basepower/registry/MachineGuiTitleTest.java
similarity index 82%
rename from src/test/java/zone/moddev/mc/poweradvantage/registry/MachineGuiTitleTest.java
rename to src/test/java/zone/moddev/mc/basepower/registry/MachineGuiTitleTest.java
index d56b772..697e441 100644
--- a/src/test/java/zone/moddev/mc/poweradvantage/registry/MachineGuiTitleTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/registry/MachineGuiTitleTest.java
@@ -1,7 +1,7 @@
-package zone.moddev.mc.poweradvantage.registry;
+package zone.moddev.mc.basepower.registry;
-import zone.moddev.mc.poweradvantage.machines.fluidmachines.MetalTankTileEntity;
-import zone.moddev.mc.poweradvantage.machines.fluidmachines.StorageTankTileEntity;
+import zone.moddev.mc.basepower.machines.fluidmachines.MetalTankTileEntity;
+import zone.moddev.mc.basepower.machines.fluidmachines.StorageTankTileEntity;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
@@ -21,9 +21,9 @@ public class MachineGuiTitleTest {
}
@Test public void tankNamesUseTheirPublishedTranslationsRatherThanJavaClassNames() throws Exception {
- assertCaption(new StorageTankTileEntity(), "tile.poweradvantage.fluid_storage_tank.name",
+ assertCaption(new StorageTankTileEntity(), "tile.basepower.fluid_storage_tank.name",
"Portable Fluid Tank");
- assertCaption(new MetalTankTileEntity(), "tile.poweradvantage.fluid_metal_tank.name",
+ assertCaption(new MetalTankTileEntity(), "tile.basepower.fluid_metal_tank.name",
"Metal Fluid Tank");
}
@@ -46,7 +46,7 @@ private static void assertCaption(IInventory tank, String key, String literal) t
assertEquals(key, ((TextComponentTranslation) caption).getKey());
Properties english = new Properties();
try (InputStream stream = MachineGuiTitleTest.class.getResourceAsStream(
- "/assets/poweradvantage/lang/en_US.lang")) {
+ "/assets/basepower/lang/en_US.lang")) {
assertNotNull("Published Power Advantage English language resource", stream);
english.load(new InputStreamReader(stream, StandardCharsets.UTF_8));
}
diff --git a/src/test/resources/orespawn-legacy/poweradvantage.json b/src/test/resources/orespawn-legacy/poweradvantage.json
index 70899f3..861b8d1 100644
--- a/src/test/resources/orespawn-legacy/poweradvantage.json
+++ b/src/test/resources/orespawn-legacy/poweradvantage.json
@@ -15,4 +15,4 @@
]
}
]
-}
\ No newline at end of file
+}
diff --git a/test-rig/README.md b/test-rig/README.md
index 64a1952..b93cf61 100644
--- a/test-rig/README.md
+++ b/test-rig/README.md
@@ -1,6 +1,10 @@
# Advantage Works 1.10.2 Test Rig
-> **Commissioning notice:** This harness builds disposable works. It is not a gameplay mod, registers no content, and must never be shipped inside a PowerAdvantage jar.
+The current targets are basePower, baseSteam and baseElectric. Station IDs and operator commands stay unchanged. Original-release Advantage fixtures are read-only migration sources, not interchangeable runtime dependencies. See [Moving From Advantage To basePower](../docs/1.10/base-migration.md) before testing an existing world.
+
+See [Recipe Progression Checks](../docs/1.10/recipe-progression-checks.md) for finite-material native crafting, hammer and merchant transactions, and the connected oil/plastic and steam starter plant. This is separate from the older recipe-registration audit, whose partial results are retained.
+
+> **Commissioning notice:** This harness builds disposable works. It is not a gameplay mod, registers no content, and must never be shipped inside a basePower jar.
The rig turns the 20 cards in the [Advantage Works handbook](../docs/1.10/README.md) plus a public-API fixture into one walkable superflat server world. Power Works lies west of the central concourse, Steam Works north, Electric Works east, and the drill, lift, turbine, pumping, musket, and turret proving grounds south.
@@ -67,7 +71,7 @@ gradlew.bat -p test-rig verifyWorksPackagedCurrent -PworksStations=E-01 -PworksS
Every machinery profile still builds and checks the complete works; the selection controls which stations are started, stopped, and checkpointed around the full process restart. Normal-world generation profiles deliberately skip station construction. The configured run duration is also used as a post-restart settle interval before assertions, allowing an eight-tick distribution cycle to complete. Use `worksServerPort` when another local server occupies the profile's default port. The effective station list, duration, and port are recorded in `run-manifest.json`.
-The development profile uses current PowerAdvantage source plus the sibling SteamAdvantage and ElectricAdvantage deobf jars. PowerAdvantage supplies the pinned OreSpawn 4 development runtime; BaseMetals and Mineralogy remain absent so their integrations are visibly skipped.
+The development profile uses current basePower source plus the sibling baseSteam and baseElectric deobf jars. basePower supplies the pinned OreSpawn 4 development runtime; BaseMetals and Mineralogy remain absent so their integrations are visibly skipped.
## Run matrix
@@ -127,4 +131,14 @@ The sampler records block counts, sampled biome centers, any deposit-producing c
## Release isolation
-`verifyHarnessIsolation` opens the PowerAdvantage release jar and rejects any `zone/moddev/mc/advantageworks` class or `assets/advantageworkstest` resource. The normal PowerAdvantage build never includes the nested `test-rig` source set.
+`verifyHarnessIsolation` opens the basePower release jar and rejects any `zone/moddev/mc/advantageworks` class or `assets/advantageworkstest` resource. The normal basePower build never includes the nested `test-rig` source set.
+
+## Migration Evidence
+
+The native migration runners distinguish three kinds of evidence:
+
+- Connected original-release worlds prove saved-state preservation and paid work without replacing machines, followed by a full server restart.
+- The larger passive original-release fixture checks saved blocks, metadata, inventories and typed NBT before machinery can tick.
+- Newly constructed nested inventory and entity fixtures test additional migration cases. They are synthetic tests, not evidence that a historical player used that exact arrangement.
+
+Each run pins the candidate jars, server code, fixture and test protocol. Failed receipts remain available. A known dependency warning may only be classified after a fresh, hash-bound dependency-only control and candidate behaviour check; it is not a blanket permission to ignore startup errors. Endurance means a measured 30-minute finite-resource operating run, not a shortened smoke run.
diff --git a/test-rig/build.gradle b/test-rig/build.gradle
index 04d5bb0..61dd764 100644
--- a/test-rig/build.gradle
+++ b/test-rig/build.gradle
@@ -59,7 +59,7 @@ dependencies {
runnerImplementation 'com.google.code.gson:gson:2.8.0'
testImplementation 'junit:junit:4.13.2'
compileOnly files(project.findProperty('powerAdvantageDeobfJar')
- ?: '../build/libs-dev/PowerAdvantage-2.4.3.110021-deobf.jar')
+ ?: '../build/libs-dev/basePower-2.4.4.110021-deobf.jar')
}
tasks.named('processResources', ProcessResources) {
@@ -160,7 +160,7 @@ tasks.register('verifyHarnessIsolation') {
group = 'verification'
description = 'Confirms the PowerAdvantage release contains no test-harness content.'
doLast {
- File powerJar = file('../build/libs/PowerAdvantage-2.4.3.110021.jar')
+ File powerJar = file('../build/libs/basePower-2.4.4.110021.jar')
if (!powerJar.isFile()) {
throw new GradleException("Build PowerAdvantage first: ${powerJar}")
}
@@ -180,3 +180,8 @@ tasks.register('verifyHarnessIsolation') {
tasks.named('check') {
dependsOn tasks.named('verifyHarnessIsolation')
}
+
+tasks.named('test', Test) {
+ inputs.dir('profiles')
+ inputs.file('src/main/java/zone/moddev/mc/advantageworks/NativeSurvivalProgressionProbe.java')
+}
diff --git a/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/ClientResourceProbe.java b/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/ClientResourceProbe.java
index f39effa..53f5575 100644
--- a/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/ClientResourceProbe.java
+++ b/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/ClientResourceProbe.java
@@ -19,7 +19,7 @@
/** Native, worldless GUI capture only; no operating or migration claims. */
@Mod(modid = ClientResourceProbe.MODID, name = "Advantage GUI Capture", version = "1.0.0.110021",
clientSideOnly = true, acceptedMinecraftVersions = "[1.10.2]",
- dependencies = "required-after:poweradvantage;required-after:steamadvantage;required-after:electricadvantage")
+ dependencies = "required-after:basepower;required-after:basesteam;required-after:baseelectric")
@Mod.EventBusSubscriber(value = Side.CLIENT)
public final class ClientResourceProbe {
static final String MODID = "advantageclientresources";
@@ -44,7 +44,7 @@ public final class ClientResourceProbe {
&& Boolean.getBoolean("advantageworks.machineGuiLayouts"), "All three mods and the GUI audit are required");
JsonArray mods = new JsonArray();
JsonObject versions = new JsonObject();
- for (String id : new String[]{"poweradvantage", "steamadvantage", "electricadvantage"}) {
+ for (String id : new String[]{"basepower", "basesteam", "baseelectric"}) {
ModContainer mod = Loader.instance().getIndexedModList().get(id);
require(mod != null, "Combined launch omitted " + id);
String expected = System.getProperty("advantageworks.expectedVersion." + id);
diff --git a/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/MachineGuiLayoutProbe.java b/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/MachineGuiLayoutProbe.java
index c8a901e..e7e760b 100644
--- a/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/MachineGuiLayoutProbe.java
+++ b/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/MachineGuiLayoutProbe.java
@@ -36,7 +36,7 @@
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
-import zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry;
+import zone.moddev.mc.basepower.registry.MachineGUIRegistry;
/** Renders every registered machine screen, not just its detached decorations. */
final class MachineGuiLayoutProbe {
@@ -161,11 +161,11 @@ static void verify(Minecraft minecraft, JsonObject result) {
require(screen.hovered() == menu.inventorySlots.get(menu.inventorySlots.size() - 9), "Inventory hitbox is misaligned");
ImageIO.write(tooltip, "png", new File("machine-gui-layouts/" + id.replace(':', '-') + "-tooltip.png"));
inventory.setInventorySlotContents(0, null);
- if (block == zone.moddev.mc.poweradvantage.init.Blocks.metal_storage_tank) {
+ if (block == zone.moddev.mc.basepower.init.Blocks.metal_storage_tank) {
negativeControls += verifyMissingLabelControls(minecraft, screen);
verifyLongName(minecraft, (SimpleMachineGUI) definition, menu, inventory);
}
- if (block == zone.moddev.mc.poweradvantage.init.Blocks.metal_storage_tank) {
+ if (block == zone.moddev.mc.basepower.init.Blocks.metal_storage_tank) {
verifyHelperLimits(screen);
}
row.addProperty("renders", renders);
@@ -387,10 +387,10 @@ private static void require(boolean value, String message) {
}
private static void verifyHelperLimits(RecordingScreen screen) throws Exception {
- for (String name : new String[]{"zone.moddev.mc.electricadvantage.gui.GUIHelper",
- "zone.moddev.mc.steamadvantage.gui.GUIHelper"}) {
- if (!net.minecraftforge.fml.common.Loader.isModLoaded(name.contains("electricadvantage") ? "electricadvantage" : "steamadvantage")) continue;
- String[] methods = name.contains("electricadvantage") ? new String[]{"drawProgressBar"}
+ for (String name : new String[]{"zone.moddev.mc.baseelectric.gui.GUIHelper",
+ "zone.moddev.mc.basesteam.gui.GUIHelper"}) {
+ if (!net.minecraftforge.fml.common.Loader.isModLoaded(name.contains("baseelectric") ? "baseelectric" : "basesteam")) continue;
+ String[] methods = name.contains("baseelectric") ? new String[]{"drawProgressBar"}
: new String[]{"drawDownArrowProgress", "drawFlameProgress"};
for (String method : methods) {
Method draw = Class.forName(name).getMethod(method, int.class, int.class, float.class, SimpleMachineGUI.GUIContainer.class);
diff --git a/test-rig/client-resources/resources/gui-label-expectations.json b/test-rig/client-resources/resources/gui-label-expectations.json
index 2f82b82..bdbb23d 100644
--- a/test-rig/client-resources/resources/gui-label-expectations.json
+++ b/test-rig/client-resources/resources/gui-label-expectations.json
@@ -3,44 +3,44 @@
"inventory": "Inventory",
"layout": { "height": 240, "machineTop": 12, "machineHeight": 128, "inventoryTop": 150, "titleY": 1, "inventoryLabelY": 140, "inventoryRows": [158, 176, 194, 216] },
"machines": {
- "poweradvantage:fluid_drain": "Drain",
- "poweradvantage:fluid_discharge": "Discharge Grate",
- "poweradvantage:fluid_storage_tank": "Portable Fluid Tank",
- "poweradvantage:fluid_metal_tank": "Metal Fluid Tank",
- "poweradvantage:still": "Distillation Furnace",
- "poweradvantage:item_conveyor": "Conveyor",
- "poweradvantage:item_filter_block": "Block Filter Conveyor",
- "poweradvantage:item_filter_food": "Food Filter Conveyor",
- "poweradvantage:item_filter_fuel": "Fuel Filter Conveyor",
- "poweradvantage:item_filter_inventory": "Filter Conveyor",
- "poweradvantage:item_filter_ore": "Ore Filter Conveyor",
- "poweradvantage:item_filter_plant": "Plantable Filter Conveyor",
- "poweradvantage:item_filter_smelt": "Furnace Filter Conveyor",
- "poweradvantage:item_filter_overflow": "Overflow Filter Conveyor",
- "steamadvantage:steam_boiler_coal": "Coal-Fired Steam Boiler",
- "steamadvantage:steam_boiler_electric": "Electric Steam Boiler",
- "steamadvantage:steam_boiler_geothermal": "Geothermal Steam Boiler",
- "steamadvantage:steam_boiler_oil": "Oil-Burning Steam Boiler",
- "steamadvantage:steam_tank": "Steam Boiler Tank",
- "steamadvantage:steam_furnace": "Steam-Powered Furnace",
- "steamadvantage:steam_crusher": "Steam-Powered Rock Crusher",
- "steamadvantage:steam_drill": "Steam-Powered Drill",
- "steamadvantage:steam_still": "Steam-Powered Still",
- "steamadvantage:steam_pump": "Steam-Powered Pump",
- "electricadvantage:electric_battery_array": "Battery Array",
- "electricadvantage:electric_crusher": "Electric Rock Crusher",
- "electricadvantage:electric_drill": "Electric Mining Drill",
- "electricadvantage:electric_fabricator": "Automated Assembler",
- "electricadvantage:electric_furnace": "Electric Arc Furnace",
- "electricadvantage:electric_oven": "Electric Oven",
- "electricadvantage:electric_pump": "Electric Pump",
- "electricadvantage:electric_still": "Electric Distiller",
- "electricadvantage:growth_chamber": "Growth Chamber",
- "electricadvantage:growth_chamber_controller": "Growth Chamber Control Unit",
- "electricadvantage:hydroelectric_generator": "Hydroelectric Generator",
- "electricadvantage:laser_turret": "Laser Turret",
- "electricadvantage:photovoltaic_generator": "Photovoltaic Generator",
- "electricadvantage:plastic_refinery": "Petro-Plastic Refinery",
- "electricadvantage:steam_powered_generator": "Steam-Powered Electric Generator"
+ "basepower:fluid_drain": "Drain",
+ "basepower:fluid_discharge": "Discharge Grate",
+ "basepower:fluid_storage_tank": "Portable Fluid Tank",
+ "basepower:fluid_metal_tank": "Metal Fluid Tank",
+ "basepower:still": "Distillation Furnace",
+ "basepower:item_conveyor": "Conveyor",
+ "basepower:item_filter_block": "Block Filter Conveyor",
+ "basepower:item_filter_food": "Food Filter Conveyor",
+ "basepower:item_filter_fuel": "Fuel Filter Conveyor",
+ "basepower:item_filter_inventory": "Filter Conveyor",
+ "basepower:item_filter_ore": "Ore Filter Conveyor",
+ "basepower:item_filter_plant": "Plantable Filter Conveyor",
+ "basepower:item_filter_smelt": "Furnace Filter Conveyor",
+ "basepower:item_filter_overflow": "Overflow Filter Conveyor",
+ "basesteam:steam_boiler_coal": "Coal-Fired Steam Boiler",
+ "basesteam:steam_boiler_electric": "Electric Steam Boiler",
+ "basesteam:steam_boiler_geothermal": "Geothermal Steam Boiler",
+ "basesteam:steam_boiler_oil": "Oil-Burning Steam Boiler",
+ "basesteam:steam_tank": "Steam Boiler Tank",
+ "basesteam:steam_furnace": "Steam-Powered Furnace",
+ "basesteam:steam_crusher": "Steam-Powered Rock Crusher",
+ "basesteam:steam_drill": "Steam-Powered Drill",
+ "basesteam:steam_still": "Steam-Powered Still",
+ "basesteam:steam_pump": "Steam-Powered Pump",
+ "baseelectric:electric_battery_array": "Battery Array",
+ "baseelectric:electric_crusher": "Electric Rock Crusher",
+ "baseelectric:electric_drill": "Electric Mining Drill",
+ "baseelectric:electric_fabricator": "Automated Assembler",
+ "baseelectric:electric_furnace": "Electric Arc Furnace",
+ "baseelectric:electric_oven": "Electric Oven",
+ "baseelectric:electric_pump": "Electric Pump",
+ "baseelectric:electric_still": "Electric Distiller",
+ "baseelectric:growth_chamber": "Growth Chamber",
+ "baseelectric:growth_chamber_controller": "Growth Chamber Control Unit",
+ "baseelectric:hydroelectric_generator": "Hydroelectric Generator",
+ "baseelectric:laser_turret": "Laser Turret",
+ "baseelectric:photovoltaic_generator": "Photovoltaic Generator",
+ "baseelectric:plastic_refinery": "Petro-Plastic Refinery",
+ "baseelectric:steam_powered_generator": "Steam-Powered Electric Generator"
}
}
diff --git a/test-rig/client-resources/resources/mcmod.info b/test-rig/client-resources/resources/mcmod.info
index f74821d..b3d9aa2 100644
--- a/test-rig/client-resources/resources/mcmod.info
+++ b/test-rig/client-resources/resources/mcmod.info
@@ -6,6 +6,6 @@
"version": "1.0.0.110021",
"mcversion": "1.10.2",
"authorList": ["Advantage Works"],
- "dependencies": ["poweradvantage", "steamadvantage", "electricadvantage"]
+ "dependencies": ["basepower", "basesteam", "baseelectric"]
}
]
diff --git a/test-rig/client-resources/run.ps1 b/test-rig/client-resources/run.ps1
index 34add1a..6618ec8 100644
--- a/test-rig/client-resources/run.ps1
+++ b/test-rig/client-resources/run.ps1
@@ -101,7 +101,7 @@ try {
$inputReport.runner = Get-Record $PSCommandPath
$inputReport.expectations = Get-Record (Join-Path $PSScriptRoot 'resources/gui-label-expectations.json')
New-Item -ItemType Directory -Path (Join-Path $runtime 'mods') | Out-Null
- $candidates = @{ poweradvantage = $PowerJar; steamadvantage = $SteamJar; electricadvantage = $ElectricJar; advantageclientresources = $ProbeJar }
+ $candidates = @{ basepower = $PowerJar; basesteam = $SteamJar; baseelectric = $ElectricJar; advantageclientresources = $ProbeJar }
$candidateRecords = [ordered]@{}
$versions = @{}
foreach ($id in $candidates.Keys) {
@@ -143,7 +143,7 @@ try {
$arguments = @([regex]::Matches($attributes['org.eclipse.jdt.launching.PROGRAM_ARGUMENTS'], '"[^"]*"|\S+') | ForEach-Object { $_.Value.Trim('"') })
$vmArguments = @([regex]::Matches($attributes['org.eclipse.jdt.launching.VM_ARGUMENTS'], '"[^"]*"|\S+') | ForEach-Object { $_.Value.Trim('"') })
$vmArguments += '-Dadvantageworks.clientResources=true','-Dadvantageworks.requireExtensions=true','-Dadvantageworks.machineGuiLayouts=true','-Xmx2G'
- foreach ($id in 'poweradvantage','steamadvantage','electricadvantage') { $vmArguments += "-Dadvantageworks.expectedVersion.$id=$($versions[$id])" }
+ foreach ($id in 'basepower','basesteam','baseelectric') { $vmArguments += "-Dadvantageworks.expectedVersion.$id=$($versions[$id])" }
$inputReport.environment = $environment
$inputReport.program_arguments = $arguments
$inputReport.vm_arguments = $vmArguments
@@ -172,7 +172,7 @@ try {
$phase = 'native-report'
$report = Get-Content -LiteralPath (Join-Path $runtime 'client-resources.json') -Raw | ConvertFrom-Json
Assert-GuiReport $report (Join-Path $runtime 'machine-gui-layouts')
- foreach ($id in 'poweradvantage','steamadvantage','electricadvantage') {
+ foreach ($id in 'basepower','basesteam','baseelectric') {
if ($report.mod_versions.$id -cne $versions[$id]) { throw "Native loaded version mismatch: $id" }
}
foreach ($record in $candidateRecords.Values) {
diff --git a/test-rig/migration/audit_survival110.py b/test-rig/migration/audit_survival110.py
new file mode 100644
index 0000000..f312d08
--- /dev/null
+++ b/test-rig/migration/audit_survival110.py
@@ -0,0 +1,93 @@
+"""Independent checks on recorded native progression evidence, not a recipe planner."""
+import argparse
+from collections import Counter, defaultdict
+import io
+import base64
+import json
+from pathlib import Path
+import nbtlib
+from rig_transport import digest, write_json
+
+
+def require(value, reason):
+ if not value: raise AssertionError(reason)
+
+
+def hammer_witness(stock, uses, crafted, durability):
+ tools=defaultdict(list)
+ for encoded in stock:
+ item=nbtlib.File.parse(io.BytesIO(base64.b64decode(encoded,validate=True)))
+ identifier=str(item["id"])+"@0"
+ if identifier in durability:
+ require(isinstance(item["Damage"],nbtlib.Short) and isinstance(item["Count"],nbtlib.Byte),"Untyped tool damage/count")
+ tools[identifier].extend([int(item["Damage"])]*int(item["Count"]))
+ for identifier, count in crafted.items():
+ capacity=durability[identifier]+1
+ broken, damage=divmod(uses[identifier],capacity)
+ expected=[0]*(count-broken)
+ require(bool(expected) or damage==0,"Missing replacement hammer")
+ if damage: expected[0]=damage
+ require(sorted(tools[identifier])==sorted(expected),"Recorded native hammer damage disagrees with actual crush count")
+
+
+def audit_case(case):
+ phases=case["phaseReports"]
+ require(case["status"]=="PASS" and phases["resume"]["status"]=="PASS" and phases["inspect"]["status"]=="PASS","Incomplete native case")
+ first=phases["first"]["actions"];later=phases["continue"]["actions"]
+ require(len(first)+len(later)==case["actions"],"Action coverage mismatch")
+ uses=Counter();crushes=Counter();crafted=Counter();boundaries=[];trades=0
+ durability=case["economy"]["toolDurability"]
+ offers={row["id"]:row for row in case["economy"]["trades"]}
+ for receipts in (first,later):
+ for row in receipts:
+ require(row["status"]=="PASS","Failed native action")
+ if row["kind"]=="craft" and row["output"] in durability:
+ delta=row["after"].get(row["output"],0)-row["before"].get(row["output"],0)
+ require(delta>0,"No real hammer crafted");crafted[row["output"]]+=delta
+ if row["kind"]=="crush":
+ # Tool selection is retained in the pinned plan; native receipts expose its actual stock/damage.
+ candidates=[tool for tool in durability if row["before"].get(tool,0)>0]
+ require(len(candidates)==1,"Ambiguous tool witness; extend the independent auditor")
+ crushes[candidates[0]]+=1
+ if row["kind"]=="trade":
+ trades+=1;uses[row["offer"]]+=1
+ require(row["usesAfter"]==uses[row["offer"]]<=offers[row["offer"]]["maxUses"],"Merchant uses reset, duplicated or exceeded native offer stock")
+ boundaries.append((dict(crushes),dict(crafted)))
+ hammer_witness(phases["first"]["stockTyped"],Counter(boundaries[0][0]),Counter(boundaries[0][1]),durability)
+ hammer_witness(phases["continue"]["stockTyped"],crushes,crafted,durability)
+ require(phases["first"]["stockTyped"]==phases["continue"]["resumedStockTyped"],"Cold tool/item state changed")
+ require(phases["resume"]["stockTyped"]==phases["inspect"]["stockTyped"],"Final cold item state changed")
+ roots=set(phases["first"]["initialStock"])
+ obtained=roots|{row["output"] for row in first+later}|{"baseelectric:petrolplastic_ingot@0"}
+ gaps=[]
+ for item,row in case["coverage"].items():
+ if row["status"] in ("NATIVE_OBTAINED_FINITE_STOCK","LIVE_PRODUCED"):
+ require(item in obtained,"Registry item was credited without any production or resource witness")
+ elif row["status"]=="NO_FINITE_ROUTE":gaps.append(item)
+ else:require(row["status"]=="EXCLUDED" and bool(row.get("reason")),"Unclassified target")
+ require(set(gaps)<={"baseelectric:li_nugget@0"},"New progression gap cannot be hidden as a known unused item")
+ return dict(status="PASS",actions=case["actions"],trades=trades,hammerCrushes=sum(crushes.values()),
+ merchantOffersUsed=len(uses),registryTargets=len(case["coverage"]),unprovenItems=gaps,
+ maximumSteamTemperature=phases["resume"]["maximumSteamFurnaceTemperature"])
+
+
+def audit(report):
+ require(report["status"]=="PASS" and report["protocolUnchanged"] is True and report["manifestUnchanged"] is True,"Unsealed or failed native run")
+ expected={mode+suffix for mode in ("normal","tech_progression","apocalyptic") for suffix in ("-rubber","-no-rubber")}
+ require(set(report["cases"])==expected,"All six mode/configuration cases required")
+ result={name:audit_case(case) for name,case in report["cases"].items()}
+ for name in ("apocalyptic-rubber","apocalyptic-no-rubber"):
+ require(result[name]["trades"]>0,"Apocalyptic bootstrap has no paid native trading evidence")
+ economy=report["cases"][name]["economy"]
+ require(economy["physicalChestsSampled"]==448 and economy["nonemptyPhysicalChests"]>0,"Missing actual-chest positive control")
+ return dict(status="PASS",cases=result,scope="Recorded native hammer damage, trade stock, coverage and restart checks")
+
+
+if __name__=="__main__":
+ parser=argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("receipt",type=Path);parser.add_argument("--output",type=Path,required=True)
+ args=parser.parse_args()
+ if args.output.exists():raise FileExistsError(args.output)
+ result=audit(json.loads(args.receipt.read_text(encoding="utf-8")))
+ result.update(receipt=str(args.receipt.resolve()),receiptSha256=digest(args.receipt),auditorSha256=digest(Path(__file__)))
+ write_json(args.output,result);print(json.dumps(result,indent=2))
diff --git a/test-rig/migration/native110.py b/test-rig/migration/native110.py
index 2c4734a..9e8a54b 100644
--- a/test-rig/migration/native110.py
+++ b/test-rig/migration/native110.py
@@ -66,7 +66,13 @@ def pinned_profile(manifest_path, key):
raise ValueError("Wrong Advantage platform version")
if jar["id"] in ids: raise ValueError("Duplicate mod identity")
ids.add(jar["id"]); jars.append(path)
- if key != "target110" or target["launcher"] != LAUNCHER or not {"poweradvantage", "advantageworkstest"} <= ids:
+ legacy = {"poweradvantage", "steamadvantage", "electricadvantage"}
+ current = {"basepower", "basesteam", "baseelectric"}
+ if ids & legacy and ids & current:
+ raise ValueError("Mixed historical and renamed target identities")
+ if any(not jar["version"].endswith(".110021") for jar in target["jars"] if jar["id"] in current):
+ raise ValueError("Wrong renamed Advantage platform version")
+ if key != "target110" or target["launcher"] != LAUNCHER or "advantageworkstest" not in ids or not ids & {"poweradvantage", "basepower"}:
raise ValueError("Incomplete/wrong native110 input profile")
if digest(seed / LAUNCHER) != target["launcher_sha256"].upper() or not (seed / "libraries").is_dir():
raise AssertionError("Native Forge 25 seed changed")
diff --git a/test-rig/migration/native110_harvest.py b/test-rig/migration/native110_harvest.py
index a539598..7ae137b 100644
--- a/test-rig/migration/native110_harvest.py
+++ b/test-rig/migration/native110_harvest.py
@@ -41,20 +41,20 @@
NA_REASON = f"Minecraft {MINECRAFT} has no waterlogged blockstate/fluid API"
# Historical GUIBlock explicitly sets light opacity to zero, independent of
# PhotovoltaicGeneratorBlock's full-cube/opaque overrides. Preserve both facts.
-PROPERTIES = {"solar/native-solidity": ("electricadvantage:photovoltaic_generator", True, 0),
- "frame/native-opacity": ("poweradvantage:steel_frame", False, 0)}
+PROPERTIES = {"solar/native-solidity": ("baseelectric:photovoltaic_generator", True, 0),
+ "frame/native-opacity": ("basepower:steel_frame", False, 0)}
def block_identity(name):
- if name.startswith("sulfur/"): return "electricadvantage:sulfur_ore"
- if name.startswith("lithium/"): return "electricadvantage:li_ore"
- if name.startswith("frame/"): return "poweradvantage:steel_frame"
- return "electricadvantage:" + ("electric_conduit" if name.startswith("wire/") else "electric_track")
+ if name.startswith("sulfur/"): return "baseelectric:sulfur_ore"
+ if name.startswith("lithium/"): return "baseelectric:li_ore"
+ if name.startswith("frame/"): return "basepower:steel_frame"
+ return "baseelectric:" + ("electric_conduit" if name.startswith("wire/") else "electric_track")
def drop_identity(name):
if not EXPECTED[name][3]: return ""
- if name in ("sulfur/wood", "sulfur/stone"): return "electricadvantage:sulfur_powder"
+ if name in ("sulfur/wood", "sulfur/stone"): return "baseelectric:sulfur_powder"
return block_identity(name)
@@ -163,7 +163,7 @@ def run(args):
require_disjoint(output, args.target_manifest)
target = pinned_profile(args.target_manifest.resolve(), "target110")
for protected in (target[0], *target[2]): require_disjoint(output, protected)
- if not {"poweradvantage","steamadvantage","electricadvantage","advantageworkstest"} <= {identity(jar)[0] for jar in target[2]}:
+ if not {"basepower","basesteam","baseelectric","advantageworkstest"} <= {identity(jar)[0] for jar in target[2]}:
raise AssertionError("Harvest requires all three Advantage mods and the native harness")
expected_code = read_json(args.target_manifest)["target110"].get("serverCode")
if not expected_code: raise AssertionError("Harvest requires an exact sealed server-code inventory")
diff --git a/test-rig/migration/native110_machine_operations.py b/test-rig/migration/native110_machine_operations.py
index 31c4ccd..3694eb1 100644
--- a/test-rig/migration/native110_machine_operations.py
+++ b/test-rig/migration/native110_machine_operations.py
@@ -15,7 +15,7 @@
import nbtlib
from rig_transport import digest, write_json
-from native110 import RIG, LAUNCHER, output_path, pinned_profile, require_disjoint
+from native110 import RIG, LAUNCHER, identity, output_path, pinned_profile, require_disjoint
from native110_code import Server, code_files, verify_code, INVENTORY
from native110_lifecycle import prepare, read_json, require_native_boot, verify_staged
@@ -25,7 +25,7 @@
"conveyor/blocked", "conveyor/item-entity", "conveyor/nbt-preserved", "filter/block", "filter/food", "filter/fuel", "filter/ore",
"filter/plant", "filter/smelt", "filter/inventory-0", "filter/inventory-1", "filter/inventory-2",
"filter/inventory-3", "filter/overflow-0", "filter/overflow-1", "filter/overflow-2", "filter/overflow-3",
- "drain/minecraft_water", "drain/poweradvantage_crude_oil", "drain/poweradvantage_refined_oil",
+ "drain/minecraft_water", "drain/basepower_crude_oil", "drain/basepower_refined_oil",
"drain/non-source", "tank/filter-true", "tank/filter-false", "tank/full", "fluid-switch/true",
"fluid-switch/false", "discharge/true", "discharge/false", "conveyor/locked-source", "conveyor/locked-destination",
"still/production", "still/no-fuel", "still/invalid", "still/full", "still/one-space", "still/redstone"},
@@ -168,21 +168,26 @@ def actors(case):
def pin(args):
+ pinned_profile(args.base.resolve(), "target110")
base = read_json(args.base)
destination = args.output.resolve()
if destination.exists(): raise FileExistsError(destination)
destination.mkdir(parents=True)
replacements = {
- "poweradvantage": RIG.parent / "build/libs/PowerAdvantage-2.4.3.110021.jar",
- "steamadvantage": RIG.parent.parent / "SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar",
- "electricadvantage": RIG.parent.parent / "ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar",
+ "basepower": RIG.parent / "build/libs/basePower-2.4.4.110021.jar",
+ "basesteam": RIG.parent.parent / "SteamAdvantage/SteamAdvantage/build/libs/baseSteam-2.2.6.110021.jar",
+ "baseelectric": RIG.parent.parent / "ElectricAdvantage/ElectricAdvantage/build/libs/baseElectric-2.2.6.110021.jar",
"advantageworkstest": RIG / "build/gradle/libs/AdvantageWorksTestHarness-1.1.0.110021.jar",
}
if getattr(args, "original_production", False):
replacements = {key: value for key, value in replacements.items() if key == "advantageworkstest"}
target = copy.deepcopy(base["target110"])
+ renamed = {"poweradvantage": "basepower", "steamadvantage": "basesteam", "electricadvantage": "baseelectric"}
for jar in target["jars"]:
- source = replacements.get(jar["id"], Path(jar["path"]))
+ wanted = jar["id"] if getattr(args, "original_production", False) else renamed.get(jar["id"], jar["id"])
+ source = replacements.get(wanted, (args.base.resolve().parent / jar["path"]).resolve())
+ actual_id, version = identity(source)
+ if actual_id != wanted: raise AssertionError("Wrong candidate mod identity: " + str(source))
checksum = digest(source)
folder = destination / "artifacts" / checksum
folder.mkdir(parents=True, exist_ok=True)
@@ -190,8 +195,8 @@ def pin(args):
if path.exists(): raise FileExistsError(path)
shutil.copy2(source, path)
if digest(path) != checksum: raise AssertionError("Archive copy differs")
- jar.update(path=str(path), originPath=str(source), sha256=checksum)
- if jar["id"] in replacements: jar["sourceRef"] = "LOCAL_OPERATING_CANDIDATE_" + args.label
+ jar.update(id=actual_id, version=version, path=str(path), originPath=str(source), sha256=checksum)
+ if wanted in replacements: jar["sourceRef"] = "LOCAL_OPERATING_CANDIDATE_" + args.label
target["qualificationStatus"] = "UNQUALIFIED_OPERATING_CANDIDATE"
target["scope"] = args.label
target["serverCode"] = {"files": code_files(Path(target["seed"]))}
diff --git a/test-rig/migration/native110_rebrand_bucket_proof.py b/test-rig/migration/native110_rebrand_bucket_proof.py
new file mode 100644
index 0000000..3b71df3
--- /dev/null
+++ b/test-rig/migration/native110_rebrand_bucket_proof.py
@@ -0,0 +1,390 @@
+"""Fresh Base24 dependency-only baseline + full renamed candidate, exactly four boots.
+
+Only this helper's process-local callbacks hold the single exact diagnostic.
+Ordinary auditors and frozen helpers are never edited. A failed strict receipt
+is mandatory before a separately recorded proof-bound migration rerun.
+"""
+import argparse
+from datetime import datetime, timezone
+import importlib
+import os
+from pathlib import Path
+import re
+import shutil
+import socket
+import traceback
+from unittest.mock import patch
+import uuid
+
+import nbtlib
+
+import legacy_bucket_proof as legacy
+import native110_machine_operations as operating
+from native110 import identity, output_path, require_disjoint
+from native110_code import INVENTORY, Server, verify_code
+from native110_lifecycle import verify_staged
+from native110_rebrand_connected import TARGET_IDS, bind_target
+from rig_transport import WORLD, digest, stage, write_json
+
+KIND = "REBRAND_BASE24_FRESH_FOUR_BOOT_V1"
+BOOT_LABELS = {"baseline-first", "baseline-restart", "candidate-operate", "candidate-restart"}
+BOOTSTRAP = {"minecraft", "mcp", "FML", "Forge"}
+PROBE_SHA = "B9F756681593B508A8E3222BD592A3DFCB474303532B154045893B3C585EF1D3"
+PASSIVE_PROBE_SHA = "79157E31FFAF5D66CCDC8030EB7B8C37D0E0D33FD6A601D119F59904A461AAD4"
+MODS_LOADED = re.compile(r"^\[\d\d:\d\d:\d\d\] \[Server thread/INFO\] \[FML\]: Forge Mod Loader has successfully loaded \d+ mods\s*$")
+
+
+def require(value, message):
+ if not value: raise AssertionError(message)
+
+
+def protocol_files():
+ return [Path(__file__), *[Path(__file__).with_name(name) for name in
+ ("legacy_bucket_proof.py", "native110_machine_operations.py", "native110_rebrand_connected.py",
+ "native110_rebrand_passive.py", "native110_connected.py", "legacy_connected_oracle.py", "semantic_machine_audit.py",
+ "native110.py", "native110_code.py", "native110_lifecycle.py", "native110_diagnostics.py", "rig_transport.py")]]
+
+
+def pins(path):
+ profile, _ = bind_target(path)
+ bound = legacy.pins(path)
+ require({m["id"] for m in bound["mods"]} == TARGET_IDS and len(bound["mods"]) == 6, "Full six-mod candidate required")
+ for mod in bound["mods"]:
+ require(identity(Path(mod["path"])) == (mod["id"], mod["version"]), "Candidate metadata changed")
+ return profile, bound
+
+
+def bind_candidate(document, candidate):
+ require(document.get("kind") == KIND and document.get("status") == "PASS", "Not a fresh completed renamed-candidate proof")
+ require(document.get("candidate") == candidate, "Proof does not bind the entire exact candidate, manifest and Forge inventory")
+
+
+def require_four_boots(boots, role):
+ require(len(boots) == 4 and {r.get("label") for r in boots} == BOOT_LABELS, "Exactly four distinct physical boots required")
+ for boot in boots:
+ diagnostic = boot.get("diagnostic", {})
+ require(boot.get("status") == "PASS_BOOT" and type(boot.get("exitCode")) is int and boot["exitCode"] == 0,
+ "Every physical process must exit cleanly")
+ require(diagnostic.get("originalSeverity") == "ERROR" and legacy.LATE_BUCKET.fullmatch(diagnostic.get("message", "")),
+ "Only the exact one Base Metals diagnostic is eligible")
+ require(role.get("status") == "PASS" and role.get("operationCases") == 3 and role.get("exactColdCases") == 3
+ and set(role.get("startupFlags", {})) == {"operate", "restart"}, "All three native bucket/oil cases and cold comparisons are mandatory")
+
+
+def require_baseline_mods(actual, expected):
+ require(set(expected) == {"basemetals", "orespawn"}, "Baseline declares only Base24 and the same OreSpawn")
+ require({k: v for k, v in actual.items() if k not in BOOTSTRAP} == expected, "Baseline loaded a harness, Power or another undeclared mod")
+
+
+def observer_sha(mode):
+ require(mode in ("connected", "passive-source355", "synthetic-nested"), "Unknown source observer mode")
+ return PROBE_SHA if mode == "connected" else PASSIVE_PROBE_SHA
+
+
+def require_destination_inventory(actual, candidate, mode):
+ expected = {Path(m["path"]).name: m["sha256"] for m in candidate["mods"]}
+ extra = {k: v for k, v in actual.items() if k not in expected}
+ require(len(extra) == 1 and next(iter(extra.values())) == observer_sha(mode),
+ "Only this mode's exact authentic source observer may supplement the full candidate")
+ expected.update(extra)
+ require(actual == expected, "Destination differs from the complete proven candidate")
+
+
+def mod_list(path):
+ rows = nbtlib.load(path)["FML"]["ModList"]
+ actual = {str(row["ModId"]): str(row["ModVersion"]) for row in rows}
+ require(len(actual) == len(rows), "Duplicate saved loaded-mod identity")
+ return actual
+
+
+def audit_boot(path):
+ path = Path(path)
+ return legacy.held_diagnostics(path.read_text(encoding="utf-8", errors="replace").splitlines(),
+ legacy.BASE_SHA, digest(path.parent / legacy.LAUNCHER))
+
+
+def seal_sources(output):
+ seals = {str(p): digest(p) for p in protocol_files()}
+ for path in protocol_files():
+ dest = output / "protocol-sources" / path.name
+ dest.parent.mkdir(exist_ok=True)
+ shutil.copy2(path, dest)
+ return seals
+
+
+def collect(args):
+ output = output_path(args.output)
+ candidate_profile, candidate = pins(args.candidate_manifest.resolve())
+ dependencies = [m for m in candidate["mods"] if m["id"] in {"basemetals", "orespawn"}]
+ baseline_profile = candidate_profile[:2] + ([Path(m["path"]) for m in dependencies],)
+ for protected in (args.candidate_manifest, candidate_profile[0], *candidate_profile[2]): require_disjoint(output, protected)
+ for port in (args.port, args.port + 1):
+ with socket.socket() as listener: listener.bind(("127.0.0.1", port))
+ output.mkdir(parents=True, exist_ok=False)
+ token = uuid.uuid4().hex
+ report = dict(kind=KIND, status=legacy.PENDING, token=token, candidate=candidate,
+ baseline=dict(mods=dependencies, codeInventory=candidate["codeInventory"]), boots=[], candidateRole={}, classification=None,
+ scope="Two dependency-only baseline boots without harness/Power, then full six-mod candidate oil/bucket operation and cold restart",
+ startedAtUtc=datetime.now(timezone.utc).isoformat(), protocolSha256=seal_sources(output))
+ receipt = output / "native110-rebrand-bucket-proof.json"
+ write_json(receipt, report)
+ server = None
+ try:
+ root = output / "baseline"
+ launcher = stage(root, baseline_profile)
+ props = root / "server.properties"
+ props.write_text(props.read_text().replace("server-port=25584", "server-port=" + str(args.port)))
+ write_json(root / INVENTORY, candidate["codeInventory"])
+ write_json(output / "baseline-inputs.json", report["baseline"])
+ expected = {m["id"]: m["runtimeVersion"] for m in dependencies}
+ for phase in ("first", "restart"):
+ verify_staged(root, baseline_profile)
+ verify_code(root, candidate["codeInventory"])
+ server = Server(root, args.java8, launcher, phase)
+ server.send("save-all flush")
+ server.wait("Saved the world", 120)
+ server.close(); server = None
+ diagnostic = audit_boot(root / ("console-" + phase + ".log"))
+ saved = output / ("baseline-level-" + phase + ".dat")
+ shutil.copy2(root / WORLD / "level.dat", saved)
+ loaded = mod_list(saved)
+ require_baseline_mods(loaded, expected)
+ report["boots"].append(dict(label="baseline-" + phase, status="PASS_BOOT", exitCode=0,
+ log="baseline/console-" + phase + ".log", diagnostic=diagnostic, savedModList=loaded,
+ savedLevel=saved.name))
+ write_json(receipt, report)
+
+ def pending_candidate_boot(path):
+ path = Path(path)
+ require(path.parent.resolve() == (output / "candidate").resolve(), "Unexpected candidate runtime")
+ phase = {"console-operate.log": "operate", "console-restart.log": "restart"}.get(path.name)
+ require(phase is not None, "Unexpected candidate boot phase")
+ verify_staged(path.parent, candidate_profile)
+ verify_code(path.parent, candidate["codeInventory"])
+ diagnostic = audit_boot(path)
+ write_json(path.with_suffix(".diagnostics.json"), diagnostic)
+ report["boots"].append(dict(label="candidate-" + phase, status="PASS_BOOT", exitCode=0,
+ log="candidate/" + path.name, diagnostic=diagnostic))
+ write_json(receipt, report)
+
+ with patch.dict(os.environ, {"ADVWORKS_BUCKET_PROOF": token}), \
+ patch.object(operating, "require_native_boot", pending_candidate_boot):
+ code = operating.run(argparse.Namespace(manifest=args.candidate_manifest, output=output / "candidate",
+ java8=args.java8, port=args.port + 1, group="power/bucket"))
+ require(code == 0, "Full renamed candidate bucket operation/cold campaign failed")
+ report["candidateRole"] = legacy.validate_role(operating, output / "candidate", token, candidate)
+ require_four_boots(report["boots"], report["candidateRole"])
+ require(pins(args.candidate_manifest)[1] == candidate, "Candidate inputs changed")
+ require(report["protocolSha256"] == {str(p): digest(p) for p in protocol_files()}, "Proof protocol changed")
+ report.update(status="PASS", classification=dict(severity="NOTICE", originalSeverity="ERROR",
+ exactDiagnostic="REDUNDANT_BASE24_ENABLE_UNIVERSAL_BUCKET_AFTER_INIT",
+ candidateManifestSha256=candidate["manifestSha256"], baseSha256=legacy.BASE_SHA, forgeSha256=legacy.PUBLIC_FORGE_SHA))
+ except BaseException as error:
+ report.update(status="FAIL", classification=None, failure=str(error), traceback=traceback.format_exc())
+ finally:
+ if server:
+ try: server.close()
+ except BaseException as error: report.update(status="FAIL", classification=None, shutdownError=str(error))
+ report["completedAtUtc"] = datetime.now(timezone.utc).isoformat()
+ report["filesSha256"] = {p.relative_to(output).as_posix(): digest(p) for p in output.rglob("*") if p.is_file() and p != receipt}
+ write_json(receipt, report)
+ return int(report["status"] != "PASS")
+
+
+def verify_proof(path, checksum):
+ path = path.resolve()
+ require(digest(path) == checksum.upper(), "Explicit fresh proof receipt hash changed")
+ document = legacy.read(path)
+ _, candidate = pins(Path(document["candidate"]["manifest"]))
+ bind_candidate(document, candidate)
+ classification = document.get("classification") or {}
+ require(classification == dict(severity="NOTICE", originalSeverity="ERROR",
+ exactDiagnostic="REDUNDANT_BASE24_ENABLE_UNIVERSAL_BUCKET_AFTER_INIT",
+ candidateManifestSha256=candidate["manifestSha256"], baseSha256=legacy.BASE_SHA, forgeSha256=legacy.PUBLIC_FORGE_SHA),
+ "Incomplete or broadened classification")
+ actual = {}
+ for file in path.parent.rglob("*"):
+ if file.is_file() and file != path:
+ require(file.resolve().is_relative_to(path.parent), "Sealed evidence escapes the proof root")
+ actual[file.relative_to(path.parent).as_posix()] = digest(file)
+ require(actual and actual == document.get("filesSha256"), "Fresh proof raw evidence changed, disappeared or was added")
+ require(document["protocolSha256"] == {str(p): digest(p) for p in protocol_files()}, "Proof is bound to another protocol")
+ baseline = document["baseline"]
+ require(baseline["codeInventory"] == candidate["codeInventory"] and baseline["mods"] ==
+ [m for m in candidate["mods"] if m["id"] in {"basemetals", "orespawn"}], "Baseline dependencies/Forge differ from candidate")
+ for boot in document["boots"]:
+ diagnostic = audit_boot(path.parent / boot["log"])
+ require(diagnostic == boot["diagnostic"], "Original boot diagnostic changed")
+ if boot["label"].startswith("baseline-"):
+ loaded = mod_list(path.parent / boot["savedLevel"])
+ require_baseline_mods(loaded, {m["id"]: m["runtimeVersion"] for m in baseline["mods"]})
+ require(loaded == boot["savedModList"], "Baseline saved loaded-mod evidence changed")
+ role = legacy.validate_role(operating, path.parent / "candidate", document["token"], candidate)
+ require(role == document["candidateRole"], "Candidate bucket/cold evidence changed")
+ require_four_boots(document["boots"], role)
+ for name in ("baseline", "candidate"):
+ verify_code(path.parent / name, candidate["codeInventory"])
+ expected = {Path(m["path"]).name: m["sha256"] for m in (baseline["mods"] if name == "baseline" else candidate["mods"])}
+ require({p.name: digest(p) for p in (path.parent / name / "mods").glob("*.jar")} == expected, "Proof staged mod inventory changed")
+ return document
+
+
+def require_strict_failure(path, checksum, candidate):
+ require(digest(path) == checksum.upper(), "Retained strict failure receipt changed")
+ failed = legacy.read(path)
+ require(failed.get("status") == "FAIL" and failed.get("targetManifestSha256") == candidate["manifestSha256"],
+ "Retained strict failure belongs to another target or is not FAIL")
+ message = failed.get("failure", "")
+ prefix = re.match(r"^Native runtime diagnostic at line \d+: (.*)$", message)
+ require(prefix and legacy.LATE_BUCKET.fullmatch(prefix.group(1)), "Strict primary failure is not solely the exact known Base24 diagnostic")
+ return failed
+
+
+def rerun(args):
+ document = verify_proof(args.proof, args.proof_sha256)
+ _, candidate = pins(args.target_manifest)
+ bind_candidate(document, candidate)
+ require_strict_failure(args.strict_failure, args.strict_failure_sha256, candidate)
+ module = importlib.import_module("native110_rebrand_connected" if args.mode == "connected" else "native110_rebrand_passive")
+ output = output_path(args.output)
+ for protected in (args.proof.parent, args.strict_failure.parent): require_disjoint(output, protected)
+ receipt = output.parent / (output.name + "-fresh-bucket-permit.json")
+ require(not receipt.exists(), "Refusing to overwrite a permit receipt")
+ report = dict(status=legacy.PENDING, kind=KIND, mode=args.mode, proof=str(args.proof.resolve()), proofSha256=args.proof_sha256.upper(),
+ strictFailure=str(args.strict_failure.resolve()), strictFailureSha256=args.strict_failure_sha256.upper(),
+ candidate=candidate, boots={}, classification=None, protocolSha256={str(p): digest(p) for p in protocol_files()},
+ sourceObserver=dict(modid="advantagemigrationprobe", version="1.0.0", sha256=observer_sha(args.mode)),
+ startedAtUtc=datetime.now(timezone.utc).isoformat())
+ write_json(receipt, report)
+ expected_versions = {m["id"]: m["runtimeVersion"] for m in candidate["mods"]}
+ original_class = module.NativeServer if args.mode == "connected" else module.PassiveServer
+
+ def destination(root):
+ require(root.resolve() == output, "Unexpected proof-bound destination")
+ actual = {p.name: digest(p) for p in (root / "mods").glob("*.jar")}
+ require_destination_inventory(actual, candidate, args.mode)
+ verify_code(root, candidate["codeInventory"])
+
+ class BoundServer(original_class):
+ def read(self):
+ for line in self.process.stdout:
+ if MODS_LOADED.fullmatch(line):
+ try:
+ self.bucket_marker.touch(exist_ok=False)
+ self.bucket_armed = True
+ except OSError as error: self.arm_error = str(error)
+ self.log.write(line); self.log.flush(); self.lines.put(line)
+
+ def __init__(self, runtime, java, launcher, label):
+ self.root = Path(runtime).resolve()
+ destination(self.root)
+ require(label in ("converted", "restarted") and label not in report["boots"], "Unexpected/duplicate destination boot")
+ self.record = dict(status=legacy.PENDING, label=label, token=uuid.uuid4().hex)
+ report["boots"][label] = self.record
+ self.bucket_marker = self.root / "advantage-machine-operation.allow"
+ require(not self.bucket_marker.exists(), "Machine operating authority leaked into pre-init")
+ self.bucket_armed = False; self.arm_error = None
+ phase = "operate" if label == "converted" else "restart"
+ self.flags_path = self.root / ("bucket-startup-" + phase + ".json")
+ require(not self.flags_path.exists(), "Fresh per-process bucket flags are required")
+ try:
+ with patch.dict(os.environ, {"ADVWORKS_BUCKET_PROOF": self.record["token"]}):
+ super().__init__(runtime, java, launcher, label)
+ require(self.bucket_armed and self.arm_error is None, "Post-mod-loading bucket witness was not armed")
+ self.flags_sha = digest(self.flags_path)
+ versions = dict(expected_versions)
+ versions["advantagemigrationprobe"] = "1.0.0"
+ legacy.startup_flags(legacy.read(self.flags_path), self.record["token"], versions)
+ except BaseException:
+ if getattr(self, "process", None) is not None and self.process.poll() is None:
+ try: self.close()
+ except BaseException: pass
+ raise
+ finally:
+ if self.bucket_armed: self.bucket_marker.unlink(missing_ok=True)
+
+ def close(self):
+ try:
+ # Preserve the inherited command restriction, clean exit and code custody;
+ # replace only this explicitly proven runtime's diagnostic decision.
+ try:
+ Server.close(self)
+ finally:
+ if args.mode == "connected":
+ write_json(Path(self.log.name).with_suffix(".commands.json"), self.commands)
+ destination(self.root)
+ require(digest(args.proof) == args.proof_sha256.upper(), "Protected proof receipt changed")
+ require(not hasattr(self, "flags_sha") or digest(self.flags_path) == self.flags_sha, "Fresh startup flags changed")
+ versions = dict(expected_versions)
+ versions["advantagemigrationprobe"] = "1.0.0"
+ flags = legacy.read(self.flags_path)
+ legacy.startup_flags(flags, self.record["token"], versions)
+ diagnostic = audit_boot(Path(self.log.name))
+ self.record.update(status="PASS_BOOT", exitCode=self.process.returncode, startupFlags=flags,
+ startupSha256=digest(self.flags_path), logSha256=digest(Path(self.log.name)), diagnostic=diagnostic)
+ write_json(receipt, report)
+ except BaseException as error:
+ self.record.update(status="FAIL", failure=str(error)); write_json(receipt, report)
+ raise
+
+ try:
+ arguments = argparse.Namespace(target_manifest=args.target_manifest, output=args.output, java8=args.java8, port=args.port)
+ if args.mode == "connected":
+ arguments.source_report = args.source_report; arguments.source_report_sha256 = args.source_report_sha256
+ else:
+ arguments.mode = args.mode; arguments.source_fixture = args.source_fixture; arguments.source_profile = args.source_profile
+ with patch.object(module, "NativeServer" if args.mode == "connected" else "PassiveServer", BoundServer):
+ code = module.run(arguments)
+ name = "native110-rebrand-connected-results.json" if args.mode == "connected" else (
+ "native110-rebrand-passive-results.json" if args.mode == "passive-source355" else "native110-rebrand-synthetic-nested-results.json")
+ primary = legacy.read(output / name)
+ require(code == 0 and primary.get("status") == "PASS" and primary.get("sourceUnchanged") is True,
+ "Unchanged primary migration/work/preservation protocol did not pass")
+ require(set(report["boots"]) == {"converted", "restarted"} and all(b.get("status") == "PASS_BOOT"
+ and type(b.get("exitCode")) is int and b["exitCode"] == 0 for b in report["boots"].values()), "Two fresh validated rerun boots required")
+ report.update(status="PASS", classification="FRESH_FOUR_BOOT_PROOF_BOUND_EXACT_BASE24_NOTICE_ONLY", primaryReceiptSha256=digest(output / name))
+ except BaseException as error:
+ report.update(status="FAIL", classification=None, failure=str(error), traceback=traceback.format_exc())
+ finally:
+ try:
+ verify_proof(args.proof, args.proof_sha256)
+ require_strict_failure(args.strict_failure, args.strict_failure_sha256, candidate)
+ require(pins(args.target_manifest)[1] == candidate, "Candidate changed")
+ require(report["protocolSha256"] == {str(p): digest(p) for p in protocol_files()}, "Rerun protocol changed")
+ report["protectedEvidenceUnchanged"] = True
+ except BaseException as error:
+ report.update(status="FAIL", classification=None, protectedEvidenceUnchanged=False, custodyFailure=str(error))
+ report["completedAtUtc"] = datetime.now(timezone.utc).isoformat()
+ report["filesSha256"] = {p.relative_to(output).as_posix(): digest(p) for p in output.rglob("*") if p.is_file()} if output.exists() else {}
+ write_json(receipt, report)
+ return int(report["status"] != "PASS")
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+ commands = parser.add_subparsers(dest="command", required=True)
+ collect_parser = commands.add_parser("collect")
+ collect_parser.add_argument("--candidate-manifest", type=Path, required=True)
+ rerun_parser = commands.add_parser("rerun")
+ rerun_parser.add_argument("--proof", type=Path, required=True)
+ rerun_parser.add_argument("--proof-sha256", required=True)
+ rerun_parser.add_argument("--strict-failure", type=Path, required=True)
+ rerun_parser.add_argument("--strict-failure-sha256", required=True)
+ rerun_parser.add_argument("--target-manifest", type=Path, required=True)
+ rerun_parser.add_argument("--mode", choices=("connected", "passive-source355", "synthetic-nested"), required=True)
+ rerun_parser.add_argument("--source-report", type=Path)
+ rerun_parser.add_argument("--source-report-sha256")
+ rerun_parser.add_argument("--source-fixture", type=Path)
+ rerun_parser.add_argument("--source-profile", type=Path)
+ for command in (collect_parser, rerun_parser):
+ command.add_argument("--output", type=Path, required=True)
+ command.add_argument("--java8", type=Path, required=True)
+ command.add_argument("--port", type=int, required=True)
+ args = parser.parse_args()
+ if args.command == "rerun":
+ if args.mode == "connected" and (not args.source_report or not args.source_report_sha256): parser.error("Connected requires its sealed original source report")
+ if args.mode != "connected" and (not args.source_fixture or not args.source_profile): parser.error("Passive/synthetic mode requires the authentic source fixture and profile")
+ return collect(args) if args.command == "collect" else rerun(args)
+
+
+if __name__ == "__main__": raise SystemExit(main())
diff --git a/test-rig/migration/native110_rebrand_connected.py b/test-rig/migration/native110_rebrand_connected.py
new file mode 100644
index 0000000..87dc3a2
--- /dev/null
+++ b/test-rig/migration/native110_rebrand_connected.py
@@ -0,0 +1,270 @@
+"""Original released Cyano 1.10 -> renamed 1.10, on copies and strict diagnostics.
+
+No historical diagnostic permit is imported. New warnings/errors need new proof.
+Only expected identity fields are translated; raw fixtures and snapshots stay intact.
+"""
+import argparse
+import base64
+import copy
+from datetime import datetime, timezone
+import gzip
+import io
+from pathlib import Path
+import shutil
+import socket
+import traceback
+
+import nbtlib
+
+import legacy_connected_oracle as oracle
+import semantic_machine_audit
+from native110 import output_path, pinned_profile, require_disjoint
+from native110_code import INVENTORY, verify_code
+from native110_connected import NativeServer
+from native110_lifecycle import read_json, verify_staged
+from rig_transport import WORLD, digest, fingerprint, write_json
+
+NAMESPACES = {"poweradvantage": "basepower", "steamadvantage": "basesteam", "electricadvantage": "baseelectric"}
+TARGET_IDS = {"basepower", "basesteam", "baseelectric", "basemetals", "orespawn", "advantageworkstest"}
+ORIGINAL_JARS = {
+ "PowerAdvantage_1.10.2-2.3.0.jar": "47CD509C1141095BFE1C8C7DD689C2ECD3F99C89195E34A88CC9E0B5FC12413E",
+ "SteamAdvantage_1.10.2-2.2.0.jar": "34A0C46C7B36DEF313F35720BD788539BDEECAD3C30880D30D82BC84E35AD9A5",
+ "ElectricAdvantage_1.10.2-2.2.0.jar": "61AE5343A79F518F54F1717D508EA3F6DA7209EE69B0C4433E0B7A9722213EE0",
+ "BaseMetals_1.10.2-2.4.0.11.jar": "A225D3E24CD37C377A9D843861FC13BDDB0B88F799D3D3AEDBC8B1DC636BB5E5",
+ "OreSpawn_1.10.2-1.1.0.jar": "91345E4B825AA06E05F470066F467AABA0C7A2804A8DBCA4D3CD1905ED53607C",
+ "AdvantageMigrationProbe-110-1.0.0.jar": "B9F756681593B508A8E3222BD592A3DFCB474303532B154045893B3C585EF1D3",
+}
+TANKS = {"Tank", "InputTank", "TankIn", "TankOut", "FuelTank", "WaterTank"}
+
+
+def mapped_id(value, namespaces):
+ domain, separator, path = value.partition(":")
+ return namespaces.get(domain, domain) + separator + path if separator else value
+
+
+def target_id(value):
+ return mapped_id(value, NAMESPACES)
+
+
+def tile_alias(value):
+ if value == "Chest": return "minecraft:chest"
+ for namespace in (*NAMESPACES, *NAMESPACES.values()):
+ for prefix in (namespace + ".", "minecraft:" + namespace + "."):
+ if value.startswith(prefix): return namespace + ":" + value[len(prefix):]
+ return value
+
+
+def binary_nbt(row):
+ return nbtlib.File.parse(io.BytesIO(gzip.decompress(base64.b64decode(row["nbtBase64"], validate=True))))
+
+
+def encode_nbt(tag):
+ output = io.BytesIO()
+ tag.write(output)
+ return base64.b64encode(gzip.compress(output.getvalue())).decode("ascii")
+
+
+def identity_nbt(tag, namespaces):
+ """Translate tile IDs, inventory stack IDs and named tank fluids, never free text."""
+ result = copy.deepcopy(tag)
+ if "id" in result and isinstance(result["id"], nbtlib.String):
+ result["id"] = nbtlib.String(mapped_id(tile_alias(str(result["id"])), namespaces))
+
+ def contents(value):
+ if not isinstance(value, nbtlib.Compound): return
+ for key, child in value.items():
+ if key in ("Items", "Inventory") and isinstance(child, nbtlib.List):
+ for stack in child:
+ if isinstance(stack, nbtlib.Compound) and "Count" in stack and isinstance(stack.get("id"), nbtlib.String):
+ stack["id"] = nbtlib.String(mapped_id(str(stack["id"]), namespaces))
+ if key in TANKS and isinstance(child, nbtlib.Compound) and isinstance(child.get("FluidName"), nbtlib.String):
+ child["FluidName"] = nbtlib.String(mapped_id(str(child["FluidName"]), namespaces))
+ if isinstance(child, nbtlib.Compound): contents(child)
+ elif isinstance(child, nbtlib.List):
+ for entry in child: contents(entry)
+ contents(result)
+ return result
+
+
+def preservation(before, after):
+ def rows(document, expected):
+ result = {}
+ for row in document["snapshot"]:
+ if row["id"] in result: raise AssertionError("Duplicate connected witness")
+ value = {key: row[key] for key in ("station", "kind", "name", "x", "y", "z", "actualName", "properties")}
+ if expected: value["actualName"] = target_id(value["actualName"])
+ if "nbt" in row and "nbtBase64" not in row: raise AssertionError("Missing typed native NBT")
+ if "nbtBase64" in row:
+ tag = identity_nbt(binary_nbt(row), NAMESPACES if expected else {})
+ if expected and row["actualName"] == "steamadvantage:steam_drill" and "Facing" not in tag:
+ facings = ("down", "up", "north", "south", "west", "east")
+ tag["Facing"] = nbtlib.Byte(facings.index(row["properties"]["facing"]))
+ value["nbt"] = oracle.saved_tile_nbt(tag)
+ for field in ("ForgeData", "ForgeCaps"):
+ if value["nbt"].get(field) == {}: value["nbt"].pop(field)
+ result[row["id"]] = value
+ return result
+ left, right = rows(before, True), rows(after, False)
+ changed = sorted(key for key in left.keys() | right.keys() if left.get(key) != right.get(key))
+ return dict(status="FAIL" if changed else "PASS", changed=changed,
+ comparison="Exact witnesses, block states and typed NBT; only expected namespace fields and documented legacy serializer aliases")
+
+
+def require_passive(document):
+ if (document.get("held") is not True or type(document.get("buildCallsThisProcess")) is not int
+ or document["buildCallsThisProcess"] != 0 or type(document.get("advancedTicks")) is not int
+ or document["advancedTicks"] != 0 or type(document.get("requestedTicks")) is not int
+ or document["requestedTicks"] != 0):
+ raise AssertionError("Loaded comparison requires zero ticks, zero construction and held machines")
+
+
+def operation_view(document):
+ # Only an in-memory comparison view for the unchanged finite-work oracles.
+ result = copy.deepcopy(document)
+ reverse = {new: old for old, new in NAMESPACES.items()}
+ for row in result["snapshot"]:
+ row["actualName"] = mapped_id(row["actualName"], reverse)
+ if "nbtBase64" in row: row["nbtBase64"] = encode_nbt(identity_nbt(binary_nbt(row), reverse))
+ return result
+
+
+def sealed_json(path, checksum):
+ path = Path(path).resolve()
+ if digest(path) != checksum.upper(): raise AssertionError("Changed sealed input: " + str(path))
+ return read_json(path)
+
+
+def bind_source(report_path, checksum):
+ history = sealed_json(report_path, checksum)
+ if history.get("sourceKey") != "original110" or history.get("status") != "PASS":
+ raise AssertionError("Only completed original released Cyano 1.10 provenance is eligible")
+ source = Path(history["source"]).resolve()
+ manifest = sealed_json(history["sourceManifest"], history["sourceManifestSha256"])
+ pins = {Path(j["path"]).name: j["sha256"].upper() for j in manifest["original110"]["jars"]}
+ actual = {p.name: digest(p) for p in (source / "mods").glob("*.jar")}
+ if pins != ORIGINAL_JARS or actual != pins: raise AssertionError("Not the exact original release mod inventory")
+ for jar in manifest["original110"]["jars"]:
+ if digest((Path(history["sourceManifest"]).parent / jar["path"]).resolve()) != jar["sha256"].upper():
+ raise AssertionError("Archived original input artifact changed")
+ hashes = sealed_json(history["sourceHashes"], history["sourceHashesSha256"])
+ if fingerprint(source / WORLD) != hashes: raise AssertionError("Protected original world changed")
+ if (not history.get("sourceRuntimeBefore") or history["sourceRuntimeBefore"] != history.get("sourceRuntimeAfter")
+ or fingerprint(source) != history["sourceRuntimeBefore"]):
+ raise AssertionError("Original fixture definition, configuration or runtime custody changed")
+ checkpoint = source / ("connected-" + history["sourceCheckpoint"] + ".json")
+ sealed_json(checkpoint, history["sourceCheckpointSha256"])
+ return source, history
+
+
+def bind_target(manifest_path):
+ target = pinned_profile(manifest_path, "target110")
+ pins = read_json(manifest_path)["target110"]
+ jars = pins["jars"]
+ if len(jars) != len(TARGET_IDS) or {j["id"] for j in jars} != TARGET_IDS:
+ raise AssertionError("Target must contain exactly basePower/baseSteam/baseElectric plus the three pinned support mods")
+ base = next(j for j in jars if j["id"] == "basemetals")
+ if base["sha256"].upper() != ORIGINAL_JARS["BaseMetals_1.10.2-2.4.0.11.jar"]:
+ raise AssertionError("This route upgrades Advantage, not the source Base Metals registry")
+ verify_code(target[0], pins["serverCode"])
+ return target, pins
+
+
+def run(args):
+ output = output_path(args.output)
+ source, history = bind_source(args.source_report, args.source_report_sha256)
+ target, pins = bind_target(args.target_manifest)
+ probe = next(j for j in read_json(Path(history["sourceManifest"]))["original110"]["jars"]
+ if Path(j["path"]).name == "AdvantageMigrationProbe-110-1.0.0.jar")
+ probe_path = (Path(history["sourceManifest"]).parent / probe["path"]).resolve()
+ profile = target[:2] + (target[2] + [probe_path],)
+ for protected in (source, args.source_report, args.target_manifest, target[0], probe_path, *target[2]):
+ require_disjoint(output, protected)
+ with socket.socket() as listener: listener.bind(("127.0.0.1", args.port))
+ source_before = fingerprint(source)
+ helpers = [Path(__file__), Path(oracle.__file__), Path(semantic_machine_audit.__file__),
+ *[Path(__file__).with_name(name) for name in ("native110.py", "native110_code.py", "native110_connected.py",
+ "native110_lifecycle.py", "native110_diagnostics.py", "rig_transport.py")]]
+ report = dict(status="RUNNING", sourceKey="original110", sourceReport=str(args.source_report.resolve()),
+ sourceReportSha256=digest(args.source_report), targetManifest=str(args.target_manifest.resolve()),
+ targetManifestSha256=digest(args.target_manifest), sourceBefore=source_before, phases={},
+ startedAtUtc=datetime.now(timezone.utc).isoformat(), protocolSha256={str(p): digest(p) for p in helpers},
+ scope="Original Cyano 1.10 to renamed 1.10 only; two 2048-tick intervals and full process restart; strict diagnostics, no legacy bucket permit")
+ receipt = output / "native110-rebrand-connected-results.json"
+ server = None
+ try:
+ launcher = oracle.prepare(output, profile, None, args.port, source)
+ for path in helpers:
+ destination = output / "protocol-sources" / path.name
+ destination.parent.mkdir(exist_ok=True)
+ shutil.copy2(path, destination)
+ verify_code(output, pins["serverCode"])
+ write_json(output / INVENTORY, pins["serverCode"])
+ write_json(receipt, report)
+ if (output / "connected-build.allow").exists(): raise AssertionError("Destination construction authority leaked")
+ previous = oracle.read(source, history["sourceCheckpoint"])
+ definition = read_json(output / "connected-fixture.json")
+ if oracle.state(previous)["status"] != "PASS": raise AssertionError("Invalid original finite stocks")
+ for phase in ("converted", "restarted"):
+ bind_source(args.source_report, args.source_report_sha256)
+ if digest(args.target_manifest) != report["targetManifestSha256"]: raise AssertionError("Target manifest changed")
+ verify_staged(output, profile)
+ verify_code(output, pins["serverCode"])
+ server = NativeServer(output, args.java8, launcher, phase)
+ server.observe("snapshot", phase + "-loaded")
+ loaded = oracle.read(output, phase + "-loaded")
+ require_passive(loaded)
+ preserved = preservation(previous, loaded)
+ report["phases"][phase + "-preservation"] = preserved
+ write_json(receipt, report)
+ if preserved["status"] != "PASS": raise AssertionError("Unticked imported state changed: " + str(preserved))
+ server.observe("step", phase + "-worked", 2048)
+ worked = oracle.read(output, phase + "-worked")
+ before_view, after_view = operation_view(loaded), operation_view(worked)
+ operation = oracle.operation(before_view, after_view, 2048)
+ completed = semantic_machine_audit.connected_interval(before_view, after_view, definition, 2048)
+ report["phases"][phase + "-operation"] = operation
+ report["phases"][phase + "-completed-work"] = completed
+ if operation["status"] != "PASS" or completed["status"] != "PASS": raise AssertionError("Imported machines failed finite paid work")
+ server.send("save-all flush")
+ server.wait("Saved the world", 120)
+ server.close(); server = None
+ verify_staged(output, profile)
+ if phase == "converted": shutil.copytree(output / WORLD, output / "pre-restart-save")
+ previous = worked
+ write_json(receipt, report)
+ report["status"] = "PASS"
+ except BaseException as error:
+ report.update(status="FAIL", failure=str(error), traceback=traceback.format_exc())
+ finally:
+ if server:
+ try: server.close()
+ except BaseException as error: report.update(status="FAIL", shutdownError=str(error))
+ report["sourceUnchanged"] = fingerprint(source) == source_before
+ report["protocolUnchanged"] = report["protocolSha256"] == {str(p): digest(p) for p in helpers}
+ report["manifestUnchanged"] = digest(args.target_manifest) == report["targetManifestSha256"]
+ try:
+ bind_source(args.source_report, args.source_report_sha256)
+ report["sourceBindingUnchanged"] = True
+ except BaseException as error:
+ report.update(status="FAIL", sourceBindingUnchanged=False, sourceBindingError=str(error))
+ if not all(report[k] for k in ("sourceUnchanged", "protocolUnchanged", "manifestUnchanged")): report["status"] = "FAIL"
+ report["completedAtUtc"] = datetime.now(timezone.utc).isoformat()
+ output.mkdir(parents=True, exist_ok=True)
+ report["rawSha256"] = {str(p.relative_to(output)): digest(p) for p in output.rglob("*") if p.is_file() and p != receipt}
+ write_json(receipt, report)
+ return int(report["status"] != "PASS")
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--source-report", type=Path, required=True)
+ parser.add_argument("--source-report-sha256", required=True)
+ parser.add_argument("--target-manifest", type=Path, required=True)
+ parser.add_argument("--output", type=Path, required=True)
+ parser.add_argument("--java8", type=Path, required=True)
+ parser.add_argument("--port", type=int, required=True)
+ return run(parser.parse_args())
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/test-rig/migration/native110_rebrand_passive.py b/test-rig/migration/native110_rebrand_passive.py
new file mode 100644
index 0000000..04cbe70
--- /dev/null
+++ b/test-rig/migration/native110_rebrand_passive.py
@@ -0,0 +1,299 @@
+"""Independent authentic Cyano 355-witness passive upgrade, or separate synthetic serializers.
+
+Neither mode edits original files. The passive observer has no NBT load/repair path.
+Synthetic detached-player/item cases are never original-player migration evidence.
+"""
+import argparse
+import base64
+from datetime import datetime, timezone
+import gzip
+import io
+from pathlib import Path
+import shutil
+import socket
+import traceback
+
+import nbtlib
+
+import legacy_connected_oracle as legacy
+from native110 import output_path, require_disjoint
+from native110_code import INVENTORY, Server, verify_code
+from native110_lifecycle import read_json, require_native_boot, verify_staged
+from native110_rebrand_connected import ORIGINAL_JARS, NAMESPACES, binary_nbt, bind_target, identity_nbt, target_id
+from rig_transport import WORLD, copy_fixture, digest, fingerprint, stage, write_json
+
+AUTHENTIC_SCOPE = "AUTHENTIC_ORIGINAL_RELEASE_110_PASSIVE_355"
+SYNTHETIC_SCOPE = "SYNTHETIC_NATIVE_SERIALIZERS_NOT_ORIGINAL_PLAYER_OR_ENTITY_PROOF"
+PROFILE_SHA = "6A6A7C57D674CCD30656098B1D1F3EC3C0AD95B49927511B039BF0F93CF3FE09"
+SOURCE_FILES = {
+ "fixture-hashes.json": "2C9E521E6E813D8822A8B882B0D81D210B8646D11BC978D845621AC124273E41",
+ "migration-fixture.json": "FF1B1E6D0977E12577B1FCABDB5A2410EEBE016DCEB52E1B5004DE99BAB3AD01",
+ "migration-source.json": "C490A49CDFBCA43E01F1179CA035773BB36628727831E84149205EF5260664BA",
+ "input-jars.json": "62E42341F646C0C52C512B74E1F99DAFA7FA0A8AE9BE63DD4D76B989B70202B8",
+}
+SOURCE_JARS = {**ORIGINAL_JARS, "AdvantageMigrationProbe-110-1.0.0.jar":
+ "79157E31FFAF5D66CCDC8030EB7B8C37D0E0D33FD6A601D119F59904A461AAD4"}
+SYNTHETIC_CASES = {"synthetic/player-inventory-ender-armor-offhand", "synthetic/dropped-enchanted-item",
+ "synthetic/nested-container-stack"}
+RETAINED_ENCHANTMENTS = {"steamadvantage:" + name for name in
+ ("rapid_reload", "powderless", "high_explosive", "recoil")}
+
+
+def saved_enchantments(world):
+ level = nbtlib.load(world / "level.dat")
+ entries = level["FML"]["Registries"]["minecraft:enchantments"]["ids"]
+ return registry([(int(row["V"]), str(row["K"])) for row in entries])
+
+
+def registry(rows):
+ result = {}
+ names = set()
+ for numeric_id, name in rows:
+ if type(numeric_id) is not int or numeric_id < 0 or numeric_id in result or name in names:
+ raise AssertionError("Missing/duplicate/malformed enchantment registry identity")
+ result[numeric_id] = name
+ names.add(name)
+ if not result: raise AssertionError("No genuine native enchantment registry")
+ return result
+
+
+def canonical_nbt(row, enchantments, expected):
+ tag = identity_nbt(binary_nbt(row), NAMESPACES if expected else {})
+ if expected and row["actualName"] == "steamadvantage:steam_drill" and "Facing" not in tag:
+ meta = row["metadata"]
+ facings = ("down", "up", "north", "south", "west", "east")
+ if type(meta) is not int or not 0 <= meta < len(facings) or row["properties"].get("facing") != facings[meta]:
+ raise AssertionError("Original Steam drill metadata and facing disagree")
+ tag["Facing"] = nbtlib.Byte(meta)
+ result = legacy.saved_tile_nbt(tag)
+ for field in ("ForgeData", "ForgeCaps"):
+ if result.get(field) == {}: result.pop(field)
+
+ def visit(value):
+ if isinstance(value, dict):
+ for key, child in value.items():
+ if key in ("ench", "StoredEnchantments", "Enchantments"):
+ if not isinstance(child, list) or len(child) != 3 or child[:2] != ["List", 10]:
+ raise AssertionError("Malformed typed enchantment list")
+ for entry in child[2]:
+ kind, numeric_id = entry["id"]
+ if kind not in ("Short", "Int") or type(numeric_id) is not int or numeric_id not in enchantments:
+ raise AssertionError("Unresolved native enchantment ID")
+ name = enchantments[numeric_id]
+ entry["id"] = [kind, target_id(name) if expected and name not in RETAINED_ENCHANTMENTS else name]
+ visit(child)
+ elif isinstance(value, list):
+ for child in value: visit(child)
+ visit(result)
+ return result
+
+
+def compare_rows(before, after, before_enchantments, after_enchantments):
+ def indexed(rows, enchantments, expected):
+ if len(rows) != 355: raise AssertionError("All 355 authentic witnesses are mandatory")
+ result = {}
+ for row in rows:
+ pos = tuple(row[k] for k in ("x", "y", "z"))
+ if any(type(n) is not int for n in pos) or pos in result: raise AssertionError("Duplicate/invalid witness position")
+ value = {key: row[key] for key in ("name", "metadata", "actualName", "properties")}
+ if type(value["metadata"]) is not int: raise AssertionError("Invalid metadata type")
+ if expected: value["actualName"] = target_id(value["actualName"])
+ if "nbt" in row and "nbtBase64" not in row: raise AssertionError("Missing authoritative binary NBT")
+ if "nbtBase64" in row: value["nbt"] = canonical_nbt(row, enchantments, expected)
+ result[pos] = value
+ return result
+ left = indexed(before, before_enchantments, True)
+ right = indexed(after, after_enchantments, False)
+ differences = [dict(position=pos, expected=left.get(pos), actual=right.get(pos))
+ for pos in sorted(left.keys() | right.keys()) if left.get(pos) != right.get(pos)]
+ if differences: raise AssertionError("Passive registry/meta/typed-NBT differences: " + str(differences[:5]))
+ return dict(status="PASS", witnesses=355, tiles=sum("nbtBase64" in row for row in before),
+ comparison="Exact metadata, properties and typed NBT; expected namespace fields only; numeric enchantments resolved against each genuine registry")
+
+
+def coverage(source, rows):
+ stacks, enchantments = [], []
+ def visit(tag):
+ if isinstance(tag, nbtlib.Compound):
+ if "Count" in tag and isinstance(tag.get("id"), nbtlib.String): stacks.append(tag)
+ for key, child in tag.items():
+ if key in ("ench", "StoredEnchantments", "Enchantments"): enchantments.extend(child)
+ visit(child)
+ elif isinstance(tag, nbtlib.List):
+ for child in tag: visit(child)
+ for row in rows:
+ if "nbtBase64" in row: visit(binary_nbt(row))
+ world = source / WORLD
+ return dict(blockStateWitnesses=len(rows), tileWitnesses=sum("nbtBase64" in r for r in rows),
+ distinctBlockNames=len({r["name"] for r in rows}), inventoryStacks=len(stacks),
+ inventoryItems=sum(int(s["Count"]) for s in stacks), distinctItemNames=len({str(s["id"]) for s in stacks}),
+ enchantmentEntries=len(enchantments), playerFiles=len(list((world / "playerdata").glob("*.dat"))),
+ levelPlayer="Player" in nbtlib.load(world / "level.dat").get("Data", {}), declaredEntityWitnesses=0,
+ gaps=["No authentic saved player, ender inventory or armor/offhand fixture",
+ "No declared actor fixture; independent read-only scan found no saved entities",
+ "Synthetic detached serializers are not player-login, entity-spawn or cross-restart player acceptance"])
+
+
+def bind_fixture(source, source_profile):
+ source, source_profile = source.resolve(), source_profile.resolve()
+ if digest(source_profile) != PROFILE_SHA: raise AssertionError("Not the sealed original-Cyano profile manifest")
+ for name, checksum in SOURCE_FILES.items():
+ if digest(source / name) != checksum: raise AssertionError("Changed authentic source receipt: " + name)
+ profile = read_json(source_profile)["original110"]
+ if {Path(j["path"]).name: j["sha256"].upper() for j in profile["jars"]} != SOURCE_JARS:
+ raise AssertionError("Source profile does not describe the original released jars and original passive probe")
+ if {p.name: digest(p) for p in (source / "mods").glob("*.jar")} != SOURCE_JARS:
+ raise AssertionError("Archived source mod bytes differ")
+ if fingerprint(source / WORLD) != read_json(source / "fixture-hashes.json"):
+ raise AssertionError("Protected authentic source world changed")
+ rows = read_json(source / "migration-source.json")
+ if len(rows) != 355 or len(read_json(source / "migration-fixture.json")) != 355:
+ raise AssertionError("Not the complete original 355-witness fixture")
+ return rows, saved_enchantments(source / WORLD)
+
+
+def source_observer(source):
+ path = source / "mods" / "AdvantageMigrationProbe-110-1.0.0.jar"
+ if digest(path) != SOURCE_JARS[path.name]:
+ raise AssertionError("The exact authentic passive source observer is required")
+ return path
+
+
+def validate_passive(document):
+ if (document.get("scope") != AUTHENTIC_SCOPE or document.get("held") is not True
+ or any(type(document.get(k)) is not int or document[k] != 0
+ for k in ("constructionCallsThisProcess", "requestedTicks", "advancedTicks"))
+ or type(document.get("frozenTileObjects")) is not int or document["frozenTileObjects"] < 1):
+ raise AssertionError("Missing frozen, nonconstructing passive native observation")
+ return registry([(r["numericId"], r["name"]) for r in document["enchantments"]])
+
+
+def decoded(value):
+ return nbtlib.File.parse(io.BytesIO(gzip.decompress(base64.b64decode(value, validate=True))))
+
+
+def validate_nested(document):
+ if (document.get("scope") != SYNTHETIC_SCOPE or document.get("status") != "PASS"
+ or type(document.get("worldInsertions")) is not int or document["worldInsertions"] != 0
+ or type(document.get("playerFileWrites")) is not int or document["playerFileWrites"] != 0):
+ raise AssertionError("Not a complete isolated synthetic native serializer regression")
+ cases = document.get("cases", [])
+ if len(cases) != 3 or {r["id"] for r in cases} != SYNTHETIC_CASES:
+ raise AssertionError("All three separate synthetic cases are required")
+ for row in cases:
+ if row.get("status") != "PASS" or row.get("nativeSemantics") is not True:
+ raise AssertionError("Native serializer semantics failed")
+ expected, actual = decoded(row["expectedNbtBase64"]), decoded(row["actualNbtBase64"])
+ if legacy.typed_nbt(expected) != legacy.typed_nbt(actual):
+ raise AssertionError("Synthetic typed native readback changed: " + row["id"])
+ if not decoded(row["inputNbtBase64"]): raise AssertionError("Missing declared synthetic legacy input")
+ return dict(status="PASS", cases=3, scope=SYNTHETIC_SCOPE)
+
+
+class PassiveServer(Server):
+ def send(self, command):
+ if command not in ("stop", "save-all flush") and not command.startswith(("advpassive snapshot ", "advnested run ")):
+ raise AssertionError("Forbidden passive runtime command: " + command)
+ super().send(command)
+
+ def close(self):
+ try: return super().close()
+ finally: require_native_boot(Path(self.log.name))
+
+
+def run(args):
+ output = output_path(args.output)
+ source, source_profile = args.source_fixture.resolve(), args.source_profile.resolve()
+ original, original_enchantments = bind_fixture(source, source_profile)
+ target, pins = bind_target(args.target_manifest)
+ observer = source_observer(source)
+ runtime_profile = target[:2] + (target[2] + [observer],)
+ for protected in (source, source_profile, args.target_manifest, target[0], *target[2]): require_disjoint(output, protected)
+ with socket.socket() as listener: listener.bind(("127.0.0.1", args.port))
+ source_before = fingerprint(source)
+ helpers = [Path(__file__), *[Path(__file__).with_name(name) for name in
+ ("native110_rebrand_connected.py", "native110_connected.py", "legacy_connected_oracle.py", "semantic_machine_audit.py",
+ "native110.py", "native110_code.py", "native110_lifecycle.py", "native110_diagnostics.py", "rig_transport.py")]]
+ report = dict(status="RUNNING", mode=args.mode, scope=AUTHENTIC_SCOPE if args.mode == "passive-source355" else SYNTHETIC_SCOPE,
+ source=str(source), sourceProfile=str(source_profile), sourceProfileSha256=digest(source_profile),
+ targetManifest=str(args.target_manifest.resolve()), targetManifestSha256=digest(args.target_manifest),
+ sourceBefore=source_before, sourceFilesSha256=SOURCE_FILES, coverage=coverage(source, original), phases={},
+ sourceObserver=dict(path=str(observer), sha256=digest(observer), modid="advantagemigrationprobe", version="1.0.0",
+ scope="Exact original fixture dependency; initialization freezes tiles only; legacy build/snapshot commands forbidden"),
+ protocolSha256={str(p): digest(p) for p in helpers}, startedAtUtc=datetime.now(timezone.utc).isoformat())
+ receipt = output / ("native110-rebrand-passive-results.json" if args.mode == "passive-source355" else "native110-rebrand-synthetic-nested-results.json")
+ server = None
+ try:
+ launcher = stage(output, runtime_profile)
+ copy_fixture(source, output)
+ (output / "advantage-passive-migration.allow").touch()
+ if args.mode == "synthetic-nested":
+ (output / "advantage-nested-identity.allow").touch()
+ write_json(output / "source-enchantments.json", {name: numeric_id for numeric_id, name in original_enchantments.items()})
+ props = output / "server.properties"
+ props.write_text(props.read_text().replace("server-port=25584", "server-port=" + str(args.port)))
+ for path in helpers:
+ destination = output / "protocol-sources" / path.name
+ destination.parent.mkdir(exist_ok=True)
+ shutil.copy2(path, destination)
+ write_json(output / INVENTORY, pins["serverCode"])
+ write_json(receipt, report)
+ before, before_enchantments = original, original_enchantments
+ for phase in ("converted", "restarted"):
+ bind_fixture(source, source_profile)
+ if digest(args.target_manifest) != report["targetManifestSha256"]: raise AssertionError("Target manifest changed")
+ if (output / "migration-operate.allow").exists() or (output / "advantage-machine-operation.allow").exists():
+ raise AssertionError("Passive world acquired operating authority")
+ verify_staged(output, runtime_profile)
+ verify_code(output, pins["serverCode"])
+ server = PassiveServer(output, args.java8, launcher, phase)
+ if args.mode == "passive-source355":
+ server.send("advpassive snapshot " + phase)
+ server.wait("ADVPASSIVE COMPLETE " + phase, 180)
+ observed = read_json(output / ("passive-" + phase + ".json"))
+ after_enchantments = validate_passive(observed)
+ report["phases"][phase] = compare_rows(before, observed["snapshot"], before_enchantments, after_enchantments)
+ before, before_enchantments = observed["snapshot"], after_enchantments
+ else:
+ server.send("advnested run " + phase)
+ server.wait("ADVNESTED COMPLETE " + phase, 180)
+ report["phases"][phase] = validate_nested(read_json(output / ("nested-identity-" + phase + ".json")))
+ server.send("save-all flush")
+ server.wait("Saved the world", 120)
+ server.close(); server = None
+ verify_staged(output, runtime_profile)
+ if phase == "converted": shutil.copytree(output / WORLD, output / "pre-restart-save")
+ write_json(receipt, report)
+ report["status"] = "PASS"
+ except BaseException as error:
+ report.update(status="FAIL", failure=str(error), traceback=traceback.format_exc())
+ finally:
+ if server:
+ try: server.close()
+ except BaseException as error: report.update(status="FAIL", shutdownError=str(error))
+ report["sourceUnchanged"] = fingerprint(source) == source_before
+ report["protocolUnchanged"] = report["protocolSha256"] == {str(p): digest(p) for p in helpers}
+ report["manifestUnchanged"] = digest(args.target_manifest) == report["targetManifestSha256"]
+ try: bind_fixture(source, source_profile)
+ except BaseException as error: report.update(status="FAIL", sourceBindingError=str(error))
+ if not all(report[k] for k in ("sourceUnchanged", "protocolUnchanged", "manifestUnchanged")): report["status"] = "FAIL"
+ output.mkdir(parents=True, exist_ok=True)
+ report["completedAtUtc"] = datetime.now(timezone.utc).isoformat()
+ report["rawSha256"] = {str(p.relative_to(output)): digest(p) for p in output.rglob("*") if p.is_file() and p != receipt}
+ write_json(receipt, report)
+ return int(report["status"] != "PASS")
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--mode", choices=("passive-source355", "synthetic-nested"), default="passive-source355")
+ parser.add_argument("--source-fixture", type=Path, required=True)
+ parser.add_argument("--source-profile", type=Path, required=True)
+ parser.add_argument("--target-manifest", type=Path, required=True)
+ parser.add_argument("--java8", type=Path, required=True)
+ parser.add_argument("--port", type=int, required=True)
+ parser.add_argument("--output", type=Path, required=True)
+ return run(parser.parse_args())
+
+
+if __name__ == "__main__": raise SystemExit(main())
diff --git a/test-rig/migration/native110_recipe_progression.py b/test-rig/migration/native110_recipe_progression.py
index 7773ffe..f44eea5 100644
--- a/test-rig/migration/native110_recipe_progression.py
+++ b/test-rig/migration/native110_recipe_progression.py
@@ -20,21 +20,21 @@
"leather","string","feather","blaze_rod","ender_pearl","quartz","bone","cactus","dirt")
ORE_ROOTS=("oreCopper","oreTin","oreZinc","oreLead","oreNickel","oreSilver","oreLithium","oreSulfur")
EXCLUSIONS={
- "poweradvantage:infinite_steam@0":"Creative-only source",
- "poweradvantage:infinite_electricity@0":"Creative-only source",
- "poweradvantage:infinite_quantum@0":"Creative-only source",
- "poweradvantage:crude_oil@0":"World fluid identity; natural collection is outside this audit",
- "poweradvantage:refined_oil@0":"World fluid identity; live distillation is outside this audit",
- "poweradvantage:fluid_pipe_terminal@0":"Hidden ordinary-pipe state",
- "steamadvantage:drillbit@0":"Drill-created helper",
- "steamadvantage:platform@0":"Elevator-created helper",
- "steamadvantage:pump_pipe_steam@0":"Pump-created helper",
- "electricadvantage:pump_pipe_electric@0":"Pump-created helper",
- "electricadvantage:laser_turret_evil@0":"Hidden converted turret state",
+ "basepower:infinite_steam@0":"Creative-only source",
+ "basepower:infinite_electricity@0":"Creative-only source",
+ "basepower:infinite_quantum@0":"Creative-only source",
+ "basepower:crude_oil@0":"World fluid identity; natural collection is outside this audit",
+ "basepower:refined_oil@0":"World fluid identity; live distillation is outside this audit",
+ "basepower:fluid_pipe_terminal@0":"Hidden ordinary-pipe state",
+ "basesteam:drillbit@0":"Drill-created helper",
+ "basesteam:platform@0":"Elevator-created helper",
+ "basesteam:pump_pipe_steam@0":"Pump-created helper",
+ "baseelectric:pump_pipe_electric@0":"Pump-created helper",
+ "baseelectric:laser_turret_evil@0":"Hidden converted turret state",
}
-CORE={"poweradvantage:sprocket@0","poweradvantage:fluid_pipe@0","steamadvantage:steam_governor@0",
- "steamadvantage:steam_pipe@0","electricadvantage:integrated_circuit@0","electricadvantage:psu@0",
- "electricadvantage:electric_conduit@0","electricadvantage:photovoltaic_generator@0"}
+CORE={"basepower:sprocket@0","basepower:fluid_pipe@0","basesteam:steam_governor@0",
+ "basesteam:steam_pipe@0","baseelectric:integrated_circuit@0","baseelectric:psu@0",
+ "baseelectric:electric_conduit@0","baseelectric:photovoltaic_generator@0"}
def mode_checks(doc,mode,rubber):
@@ -48,7 +48,7 @@ def mode_checks(doc,mode,rubber):
ids=[r["id"] for r in crafting]
if len(ids)!=len(set(ids)): raise AssertionError("Duplicate native recipe evidence")
for row in crafting:
- owned=isinstance(row.get("output"),str) and row["output"].startswith(("poweradvantage:","steamadvantage:","electricadvantage:"))
+ owned=isinstance(row.get("output"),str) and row["output"].startswith(("basepower:","basesteam:","baseelectric:"))
if row.get("owned") is not owned: raise AssertionError("Native recipe ownership evidence is missing or inconsistent")
if row.get("status")=="PASS" and (row.get("negativeControlsRejected")!=2
or type(row.get("count")) is not int or row["count"]<=0 or not row.get("output")
@@ -61,17 +61,17 @@ def mode_checks(doc,mode,rubber):
if row.get("status")=="PASS" and row.get("owned") is True and row.get("recipeBookCraftUnlock")!="N/A_NO_1_10_RECIPE_BOOK":
raise AssertionError("Missing native recipe-book result or explicit legacy N/A")
def rows(output): return [r for r in crafting if r.get("output")==output]
- for target in ("poweradvantage:sprocket@0","electricadvantage:integrated_circuit@0","electricadvantage:photovoltaic_generator@0"):
+ for target in ("basepower:sprocket@0","baseelectric:integrated_circuit@0","baseelectric:photovoltaic_generator@0"):
if bool(rows(target)) != (mode!="APOCALYPTIC"): raise AssertionError("Recipe mode restriction changed: "+target)
- for target in ("steamadvantage:steam_governor@0","electricadvantage:psu@0"):
+ for target in ("basesteam:steam_governor@0","baseelectric:psu@0"):
if not rows(target): raise AssertionError("Mode lost a foundational recipe: "+target)
iron=set(doc.get("ores",{}).get("ingotIron",[]))
- pipes=[r for r in rows("poweradvantage:fluid_pipe@0")
+ pipes=[r for r in rows("basepower:fluid_pipe@0")
if len([x for x in r.get("inputs",[]) if x])==6
and all(x in iron for x in r["inputs"] if x)]
if not pipes or any(r["count"]!=(3 if mode=="APOCALYPTIC" else 6) for r in pipes):
raise AssertionError("Native iron-pipe yield changed")
- chips=rows("electricadvantage:integrated_circuit@0")
+ chips=rows("baseelectric:integrated_circuit@0")
# Forge may expand a wildcard ore entry into concrete matching-stack variants.
def matches_provider(value,choices):
return (isinstance(value,str) and "@" in value and isinstance(choices,list)
@@ -125,7 +125,7 @@ def reachability(doc):
blocked=[]; excluded={}
for target in doc["targets"]:
if target in EXCLUSIONS: excluded[target]=EXCLUSIONS[target]
- elif doc["mode"]=="APOCALYPTIC" and target=="electricadvantage:photovoltaic_generator@0":
+ elif doc["mode"]=="APOCALYPTIC" and target=="baseelectric:photovoltaic_generator@0":
excluded[target]="Explicit legacy Apocalyptic restriction"
elif target not in known: blocked.append(target)
return {"reachable":known,"blocked":sorted(blocked),"excluded":excluded,"rounds":rounds,
@@ -174,7 +174,7 @@ def run(args):
launcher=prepare(runtime,target,[],args.port)
verify_code(runtime,code); write_json(runtime/INVENTORY,code)
(runtime/"advantage-legacy-recipes.allow").touch()
- config=runtime/"config/poweradvantage.cfg"; config.parent.mkdir(exist_ok=True)
+ config=runtime/"config/basepower.cfg"; config.parent.mkdir(exist_ok=True)
config.write_text('options {\n S:recipe_mode='+mode+'\n B:plastic_equals_rubber='+str(not args.no_rubber).lower()+'\n}\n',encoding="utf-8")
proofs={}
for phase in ("initial","restart"):
diff --git a/test-rig/migration/native110_survival_progression.py b/test-rig/migration/native110_survival_progression.py
new file mode 100644
index 0000000..fc1217f
--- /dev/null
+++ b/test-rig/migration/native110_survival_progression.py
@@ -0,0 +1,194 @@
+"""Native finite-material crafting/trading and naturally ticking starter-plant checks."""
+import argparse
+from collections import Counter
+from datetime import datetime, timezone
+import json
+from pathlib import Path
+import shutil
+import socket
+import traceback
+
+from rig_transport import digest, write_json
+from native110 import output_path, pinned_profile, require_disjoint
+from native110_code import INVENTORY, Server, verify_code
+from native110_lifecycle import prepare, read_json, require_native_boot, verify_staged
+from native110_recipe_progression import MODES, mode_checks, canonical
+from survival110_plan import plan
+
+
+def validate_replay(proposed, first, continued):
+ rows = first["actions"] + continued["actions"]
+ if len(rows) != len(proposed["actions"]): raise AssertionError("Missing/repeated finite replay step")
+ stock = Counter(proposed["initial"])
+ for index, (action, receipt) in enumerate(zip(proposed["actions"], rows)):
+ if (receipt.get("index") != index or receipt.get("status") != "PASS" or receipt.get("kind") != action["kind"]
+ or receipt.get("output") != action["output"] or receipt.get("before") != +stock):
+ raise AssertionError("Wrong replay step or pre-debit stock at " + str(index))
+ debits = Counter()
+ kind = action["kind"]
+ if kind == "craft":
+ if receipt.get("nativeConsumption") != "SlotCrafting" or receipt.get("negativeControlsRejected") != 2:
+ raise AssertionError("Missing real craft consumption or negative controls")
+ if receipt.get("selectedInputs") != action["inputs"]: raise AssertionError("Substituted ingredient route")
+ debits.update(x for x in action["inputs"] if x)
+ returned = action.get("emptyBucketsReturned", 0)
+ if receipt.get("returnedEmptyBuckets") != returned: raise AssertionError("Missing/duplicated empty bucket")
+ elif kind == "smelt":
+ if not 200 <= receipt.get("nativeUpdates", 0) <= 220 or receipt.get("coalDebited") != 1:
+ raise AssertionError("Registered smelting function is not fuelled processing evidence")
+ debits.update([action["input"], action["fuel"]])
+ elif kind == "crush":
+ if receipt.get("durabilityDebited") != 1 or receipt.get("nativeInteraction") != "Item.onItemUse + EntityItem outputs":
+ raise AssertionError("Crushing lookup is not a real hammer interaction")
+ debits.update([action["input"]])
+ if receipt.get("toolBroke") is not action["toolBreaks"]: raise AssertionError("Wrong tool lifetime")
+ if action["toolBreaks"]: debits[action["tool"]] += 1
+ elif kind == "trade":
+ if receipt.get("nativeConsumption") != "SlotMerchantResult" or receipt.get("offer") != action["trade"]["id"]:
+ raise AssertionError("Registered offer is not a paid native transaction")
+ debits[action["trade"]["input"]] += action["trade"]["price"]
+ if action["trade"].get("secondInput"): debits[action["trade"]["secondInput"]] += action["trade"]["secondPrice"]
+ elif kind == "water": debits["minecraft:bucket@0"] += 1
+ else: raise AssertionError("Unknown action")
+ if any(stock[item] < count for item, count in debits.items()): raise AssertionError("Free intermediate item or overdraft")
+ stock.subtract(debits)
+ stock[action["output"]] += action["count"]
+ if kind == "craft": stock["minecraft:bucket@0"] += action.get("emptyBucketsReturned", 0)
+ if receipt.get("after") != +stock: raise AssertionError("Wrong native material balance at " + str(index))
+ if +stock != proposed["expectedStock"] or continued.get("craftedStock") != +stock:
+ raise AssertionError("Final finite stock disagrees with independent accounting")
+ if first.get("stock") != continued.get("resumedStock"):
+ raise AssertionError("Crafting stock reset across full process restart")
+ if not first.get("stockTyped") or first["stockTyped"]!=continued.get("resumedStockTyped"):
+ raise AssertionError("Typed item/tool state changed across full process restart")
+
+
+def validate_phases(proposed, phases):
+ for name, expected in (("first", "CRAFT_CHECKPOINT"), ("continue", "MACHINE_CHECKPOINT"), ("resume", "PASS"), ("inspect", "PASS")):
+ row = phases[name]
+ if (row.get("status") != expected or row.get("mode") != proposed["mode"]
+ or row.get("rubber") is not proposed["rubber"] or row.get("minecraft") != "1.10.2"):
+ raise AssertionError("Incomplete/wrong native phase " + name)
+ validate_replay(proposed, phases["first"], phases["continue"])
+ for phase in ("resume", "inspect"):
+ if phases[phase].get("coldMachineState") != "EXACT_TYPED_NBT_AND_BLOCK_EQUAL":
+ raise AssertionError("Machine state not checked cold before restart ticks")
+ live = phases["resume"]
+ if (live.get("crudeOilDebited"), live.get("refinedOilProducedAndConsumed"), live.get("plasticProduced"), live.get("steamSmeltProduced")) != (1000,500,5,1):
+ raise AssertionError("Live fluid/product conservation or paid steam work failed")
+ if not 620 <= live.get("naturalMachineTicks", 0) < 2200: raise AssertionError("No bounded natural machine operation")
+ if live.get("steamReceived") is not True or live.get("maximumSteamFurnaceTemperature",0)<=800:
+ raise AssertionError("Coal-only smelting is not proof of network steam heating")
+ if phases["inspect"].get("stock") != live.get("stock"): raise AssertionError("Products lost or duplicated after final restart")
+ if not live.get("stockTyped") or phases["inspect"].get("stockTyped")!=live["stockTyped"]:
+ raise AssertionError("Final typed item state changed across full process restart")
+ operation_stock=Counter(proposed["expectedStock"])
+ for item in ("basepower:still@0","baseelectric:hydroelectric_generator@0","baseelectric:plastic_refinery@0",
+ "basesteam:steam_boiler_coal@0","basesteam:steam_furnace@0","basesteam:steam_pipe@0"):
+ operation_stock[item]-=1
+ operation_stock["minecraft:coal@0"]-=3
+ operation_stock["minecraft:iron_ore@0"]-=1
+ if any(v<0 for v in operation_stock.values()) or phases["continue"]["stock"] != +operation_stock:
+ raise AssertionError("Starter plant did not debit exact crafted machinery, inputs and fuel")
+ operation_stock["baseelectric:petrolplastic_ingot@0"]+=5
+ if live["stock"] != +operation_stock: raise AssertionError("Live production invented or lost stock")
+ water=1000*sum(action["kind"]=="water" for action in proposed["actions"])+2000
+ if live.get("waterSourcesCollectedMb")!=water: raise AssertionError("Missing bucket/source-fluid conservation")
+
+
+def run(args):
+ root = output_path(args.output)
+ manifest = args.target_manifest.resolve()
+ target = pinned_profile(manifest, "target110")
+ for path in (manifest, target[0], *target[2]): require_disjoint(root,path)
+ code = read_json(manifest)["target110"]["serverCode"]
+ verify_code(target[0],code)
+ with socket.socket() as sock: sock.bind(("127.0.0.1",args.port))
+ root.mkdir(parents=True)
+ sources = [Path(__file__), *[Path(__file__).with_name(name) for name in
+ ("survival110_plan.py", "native110_recipe_progression.py", "rig_transport.py", "native110.py", "native110_code.py", "native110_lifecycle.py", "native110_diagnostics.py")],
+ *[Path(__file__).parents[1]/"src/main/java/zone/moddev/mc/advantageworks"/name for name in
+ ("NativeSurvivalProgressionProbe.java", "NativeRecipeProgressionProbe.java", "NativeEntityHold.java", "NativeFluidPort.java")]]
+ seals = {str(path):digest(path) for path in sources}
+ for path in sources:
+ dest=root/"protocol-sources"/path.name; dest.parent.mkdir(exist_ok=True); shutil.copy2(path,dest)
+ report = dict(status="RUNNING", startedAtUtc=datetime.now(timezone.utc).isoformat(), manifest=str(manifest), manifestSha256=digest(manifest),
+ protocolSha256=seals, cases={},
+ scope="FINITE_HARVESTED_INPUTS_NATIVE_CRAFTS_HAMMER_TRADES_BUCKETS_AND_NATURAL_STARTER_PLANT",
+ limitations=["Resource harvesting, villager encounter and career leveling are not simulated",
+ "Vanilla furnaces use bounded native updates with real coal, not wall-clock ticks",
+ "Additional Loot Tables is not in the pinned pack; absent loot remains a reported integration gap",
+ "No 1.10 recipe book or ingredient advancements exist"])
+ server=None
+ try:
+ for mode in ([args.mode] if args.mode else MODES):
+ for rubber in ([args.rubber == "on"] if args.rubber else (True,False)):
+ name=mode.lower()+("-rubber" if rubber else "-no-rubber")
+ runtime=root/name
+ launcher=prepare(runtime,target,[],args.port)
+ verify_code(runtime,code);write_json(runtime/INVENTORY,code)
+ for marker in ("advantage-legacy-recipes.allow","advantage-survival.allow"): (runtime/marker).touch()
+ config=runtime/"config/basepower.cfg";config.parent.mkdir(exist_ok=True)
+ config.write_text('options {\n S:recipe_mode='+mode+'\n B:plastic_equals_rubber='+str(rubber).lower()+'\n}\n',encoding="utf-8")
+ phases={}; exports={}
+ for phase in ("first","continue","resume","inspect"):
+ verify_staged(runtime,target)
+ server=Server(runtime,args.java8,launcher,phase)
+ if phase in ("first","inspect"):
+ server.send("advlegacyrecipes "+phase);server.wait("ADVLEGACYRECIPES COMPLETE "+phase,180)
+ doc=read_json(runtime/"advantage-works-results"/("legacy-recipes-"+phase+".json"))
+ mode_checks(doc,mode,rubber);exports[phase]=doc
+ if phase=="first":
+ proposed=plan(doc)
+ gaps={item for item,row in proposed["coverage"].items() if row["status"]=="NO_FINITE_ROUTE"}
+ if gaps-{"baseelectric:li_nugget@0"}: raise AssertionError("New unclassified progression blockers: "+str(sorted(gaps)))
+ write_json(runtime/"survival-plan.json",proposed)
+ plan_seal=digest(runtime/"survival-plan.json")
+ print(name+" PLAN actions="+str(len(proposed["actions"])),flush=True)
+ if digest(runtime/"survival-plan.json")!=plan_seal: raise AssertionError("Finite plan changed during progression")
+ server.send("advsurvival "+phase+" "+phase)
+ server.wait("ADVSURVIVAL COMPLETE "+phase,240)
+ phases[phase]=read_json(runtime/"advantage-works-results"/("survival-"+phase+".json"))
+ server.send("save-all flush");server.close();server=None
+ require_native_boot(runtime/("console-"+phase+".log"));verify_staged(runtime,target)
+ if phases[phase].get("status")=="FAIL": raise AssertionError(phases[phase].get("failure","Failed native phase"))
+ if canonical(exports["first"])!=canonical(exports["inspect"]): raise AssertionError("Native recipes changed across restart")
+ if exports["first"]["economy"]!=exports["inspect"]["economy"]: raise AssertionError("Native offers/loot/durability changed across restart")
+ if digest(runtime/"survival-plan.json")!=plan_seal: raise AssertionError("Finite plan changed during progression")
+ validate_phases(proposed,phases)
+ coverage=proposed["coverage"]
+ for target_item,row in coverage.items():
+ if row["status"]=="NATIVE_REPLAY_REQUIRED": row["status"]="NATIVE_OBTAINED_FINITE_STOCK"
+ elif row["status"]=="LIVE_MACHINE_REQUIRED": row["status"]="LIVE_PRODUCED"
+ report["cases"][name]=dict(status="PASS",planSha256=digest(runtime/"survival-plan.json"),phaseReports=phases,
+ actions=len(proposed["actions"]),coverage=coverage,
+ uncreditedTrades=proposed["uncreditedTrades"],
+ sampledNativeLoot=exports["first"]["sampledNativeLoot"],economy=exports["first"]["economy"])
+ write_json(root/"survival-results-progress.json",report)
+ print("SURVIVAL110 PASS "+name,flush=True)
+ report["status"]="PASS"
+ report["completeProgression"]="PARTIAL" if any(row["status"]=="NO_FINITE_ROUTE" for case in report["cases"].values() for row in case["coverage"].values()) else "QUALIFIED_WITHIN_DECLARED_SCOPE"
+ except Exception as error:
+ report.update(status="FAIL",failure=str(error),traceback=traceback.format_exc())
+ finally:
+ if server:
+ try:server.close()
+ except Exception as error:report.update(status="FAIL",shutdownError=str(error))
+ report["manifestUnchanged"]=report["manifestSha256"]==digest(manifest)
+ report["protocolUnchanged"]=seals=={str(path):digest(path) for path in sources}
+ if not report["manifestUnchanged"] or not report["protocolUnchanged"]:report["status"]="FAIL"
+ report["completedAtUtc"]=datetime.now(timezone.utc).isoformat()
+ write_json(root/"native110-survival-results.json",report)
+ print("SURVIVAL110 "+report["status"]+" "+report.get("failure",""),flush=True)
+ return 1 if report["status"]=="FAIL" else 0
+
+
+if __name__=="__main__":
+ parser=argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--target-manifest",type=Path,required=True)
+ parser.add_argument("--java8",type=Path,required=True)
+ parser.add_argument("--output",type=Path,required=True)
+ parser.add_argument("--port",type=int,default=25597)
+ parser.add_argument("--mode",choices=MODES)
+ parser.add_argument("--rubber",choices=("on","off"))
+ raise SystemExit(run(parser.parse_args()))
diff --git a/test-rig/migration/requirements.txt b/test-rig/migration/requirements.txt
new file mode 100644
index 0000000..15f86d4
--- /dev/null
+++ b/test-rig/migration/requirements.txt
@@ -0,0 +1,2 @@
+nbtlib==2.0.4
+numpy==2.5.3
diff --git a/test-rig/migration/steam_control_audit.py b/test-rig/migration/steam_control_audit.py
index 2c51321..04ab1fc 100644
--- a/test-rig/migration/steam_control_audit.py
+++ b/test-rig/migration/steam_control_audit.py
@@ -36,6 +36,10 @@
}
+def steam_block(path, line):
+ return ("basesteam:" if line == "110" else "steamadvantage:") + path
+
+
def require(value, message):
if not value:
raise AssertionError(message)
@@ -185,8 +189,8 @@ def at(x, y=4, z=8):
"Tile hold must remove ticking, retain the same tile and leave NBT unchanged")
observed = measured.get(at(*point))
require(observed is not None and "nbt" in observed
- and observed["block"] == ("steamadvantage:steam_furnace" if row["id"] in FURNACES
- else "steamadvantage:steam_crusher"),
+ and observed["block"] == steam_block("steam_furnace" if row["id"] in FURNACES
+ else "steam_crusher", line),
"Held tile is not the measured native machine")
actual.add(point)
require(actual == expected, "Incomplete measured tile hold coverage")
@@ -228,7 +232,7 @@ def audit_documents(catalog, operation, fixture, cold, line):
for stage in ("before", "after"):
require(set(positions(row[stage], base, line)) == expected_positions, "Wrong comparator layout")
for i, count in enumerate(counts):
- data = tile(row[stage], at(3 + 6 * i), "steamadvantage:steam_crusher", line)
+ data = tile(row[stage], at(3 + 6 * i), steam_block("steam_crusher", line), line)
inventory(data, 0, "minecraft:stone", count)
require(energy(data) == 0 and progress(data) == 0, "Comparator witness must remain unpowered")
for i, count in enumerate(counts):
@@ -245,7 +249,7 @@ def audit_documents(catalog, operation, fixture, cold, line):
require(set(snapshot) == expected_positions, "Wrong controlled-machine layout")
if signal:
require(snapshot[at(7)]["block"] == "minecraft:redstone_block", "Missing actual redstone source")
- block = "steamadvantage:steam_crusher" if is_crusher else "steamadvantage:steam_furnace"
+ block = steam_block("steam_crusher" if is_crusher else "steam_furnace", line)
before = tile(row["before"], at(8), block, line)
after = tile(row["after"], at(8), block, line)
item = "minecraft:stone" if is_crusher else "minecraft:sand"
diff --git a/test-rig/migration/survival110_plan.py b/test-rig/migration/survival110_plan.py
new file mode 100644
index 0000000..a0a580b
--- /dev/null
+++ b/test-rig/migration/survival110_plan.py
@@ -0,0 +1,228 @@
+"""Finite material planner. Proposed routes are NOT proof until native replay passes."""
+from collections import Counter, defaultdict
+from native110_recipe_progression import EXCLUSIONS
+
+
+class Unobtainable(ValueError):
+ pass
+
+
+def concrete(token):
+ return token.replace("@32767", "@0") if token else token
+
+
+class Planner:
+ def __init__(self, doc, stock, allow_trades=False):
+ self.doc = doc
+ self.stock = Counter(stock)
+ self.initial = dict(stock)
+ self.actions = []
+ self.routes = defaultdict(list)
+ self.tools = Counter()
+ self.trade_uses = Counter()
+ self.uncredited_trades = []
+ self.reserved = {"minecraft:crafting_table@0": 1, "minecraft:furnace@0": 1}
+ self.attempts = 0
+ for row in doc["crafting"]:
+ if row.get("status") == "PASS":
+ self.routes[row["output"]].append(dict(kind="craft", recipe=row))
+ for row in doc["smelting"]:
+ self.routes[row["output"]].append(dict(kind="smelt", recipe=row))
+ for row in doc["crushing"]:
+ self.routes[row["output"]].append(dict(kind="crush", recipe=row))
+ if allow_trades:
+ for row in doc["economy"]["trades"]:
+ if (not isinstance(row.get("input"),str) or type(row.get("price")) is not int or row["price"]<=0
+ or type(row.get("maxUses")) is not int or row["maxUses"]<=0):
+ self.uncredited_trades.append(dict(id=row["id"],output=row["output"],reason="Missing currency, non-positive price or invalid offer stock"))
+ else:
+ self.routes[row["output"]].append(dict(kind="trade", recipe=row))
+ self.routes["minecraft:water_bucket@0"].append(dict(kind="water", recipe=dict(count=1)))
+ self.ranks = {item: 0 for item, count in stock.items() if count > 0}
+ for _ in range(100):
+ changed = False
+ for item, routes in self.routes.items():
+ rank = min((self.route_rank(route) for route in routes), default=1000000)
+ if rank < self.ranks.get(item, 1000000):
+ self.ranks[item] = rank
+ changed = True
+ if not changed: break
+
+ def route_rank(self, route):
+ row, kind = route["recipe"], route["kind"]
+ rank = lambda item: self.ranks.get(concrete(item), 1000000)
+ if kind == "craft":
+ cells = row.get("providers", [[x] if x else [] for x in row["inputs"]])
+ return 1 + max((min(map(rank, choices)) for choices in cells if choices), default=1000000)
+ if kind == "smelt": return 1 + max(rank(row["input"]), rank("minecraft:furnace@0"), rank("minecraft:coal@0"))
+ if kind == "crush": return 1 + max(rank(row["input"]), min(map(rank, row["tools"]), default=1000000))
+ if kind == "trade": return 1 + max(rank(row["input"]), rank(row["secondInput"]) if row.get("secondInput") else 0)
+ if kind == "water": return 1 + rank("minecraft:bucket@0")
+ raise ValueError(kind)
+
+ def snapshot(self):
+ return self.stock.copy(), len(self.actions), self.tools.copy(), self.trade_uses.copy()
+
+ def restore(self, snapshot):
+ self.stock, action_count, self.tools, self.trade_uses = snapshot
+ del self.actions[action_count:]
+
+ def take(self, item, count=1, path=()):
+ if count <= 0:
+ raise ValueError("Non-positive debit")
+ self.ensure(item, count + self.reserved.get(item, 0), path)
+ self.stock[item] -= count
+
+ def ensure(self, item, count=1, path=()):
+ self.attempts += 1
+ if self.attempts > 100000:
+ raise RuntimeError("Planner search budget exhausted; do not claim unreachable")
+ if self.stock[item] >= count:
+ return
+ if item not in self.ranks:
+ raise Unobtainable("No resource-rooted route for " + item)
+ if item in path or len(path) > 40:
+ raise Unobtainable("Cyclic or excessively deep prerequisite: " + item)
+ path = (*path, item)
+ while self.stock[item] < count:
+ success = False
+ # Prefer an already available input, then short non-recycling paths.
+ routes = sorted(self.routes[item], key=lambda r: self.cost(r))
+ for route in routes:
+ before = self.snapshot()
+ try:
+ self.produce(item, route, path)
+ success = True
+ break
+ except Unobtainable:
+ self.restore(before)
+ if not success:
+ raise Unobtainable("No finite route for " + item)
+
+ def cost(self, route):
+ row, kind = route["recipe"], route["kind"]
+ if kind == "trade": return (self.route_rank(route), 0, 0)
+ if kind == "water": return (self.route_rank(route), 0, 1)
+ if kind in ("smelt", "crush"):
+ return (self.route_rank(route), 0 if self.stock[row["input"]] else 2, 1 if kind == "smelt" else 2)
+ cells = row.get("providers", [[x] if x else [] for x in row["inputs"]])
+ return (self.route_rank(route), sum(not any(self.stock[concrete(x)] for x in choices) for choices in cells if choices), len(cells))
+
+ def produce(self, item, route, path):
+ row, kind = route["recipe"], route["kind"]
+ action = dict(kind=kind, output=item, count=row["count"])
+ if kind == "craft":
+ selected = []
+ for choices in row.get("providers", [[x] if x else [] for x in row["inputs"]]):
+ if not choices:
+ selected.append(None)
+ continue
+ candidate = None
+ for choice in sorted(dict.fromkeys(map(concrete, choices)), key=lambda x: (not bool(self.stock[x]), self.ranks.get(x,1000000))):
+ before = self.snapshot()
+ try:
+ self.take(choice, path=path)
+ candidate = choice
+ break
+ except Unobtainable:
+ self.restore(before)
+ if candidate is None:
+ raise Unobtainable("Missing ingredient for " + item)
+ selected.append(candidate)
+ action.update(recipe=row["id"], inputs=selected, width=row["width"])
+ # Independent policy: a water-bucket ingredient returns exactly one EMPTY bucket.
+ buckets = selected.count("minecraft:water_bucket@0")
+ if buckets:
+ self.stock["minecraft:bucket@0"] += buckets
+ action["emptyBucketsReturned"] = buckets
+ elif kind == "smelt":
+ self.ensure("minecraft:furnace@0", path=path)
+ self.take(row["input"], path=path)
+ self.take("minecraft:coal@0", path=path)
+ action.update(input=row["input"], fuel="minecraft:coal@0")
+ elif kind == "crush":
+ self.take(row["input"], path=path)
+ tool = None
+ for candidate in sorted(row["tools"], key=lambda x: (not bool(self.stock[x]), "iron_crackhammer" not in x)):
+ before = self.snapshot()
+ try:
+ if not self.tools[candidate]:
+ self.ensure(candidate, 1, path)
+ self.tools[candidate] += self.doc["economy"]["toolDurability"][candidate] + 1
+ tool = candidate
+ break
+ except Unobtainable:
+ self.restore(before)
+ if tool is None: raise Unobtainable("No obtainable crushing tool for " + item)
+ self.tools[tool] -= 1
+ if not self.tools[tool]: self.stock[tool] -= 1
+ action.update(input=row["input"], tool=tool)
+ action["toolBreaks"] = not bool(self.tools[tool])
+ elif kind == "trade":
+ if self.trade_uses[row["id"]] >= row["maxUses"]:
+ raise Unobtainable("Offer exhausted; restocking is not assumed")
+ self.take(row["input"], row["price"], path)
+ if row.get("secondInput"): self.take(row["secondInput"], row["secondPrice"], path)
+ self.trade_uses[row["id"]] += 1
+ action.update(trade=row)
+ elif kind == "water":
+ self.take("minecraft:bucket@0", path=path)
+ action["input"] = "minecraft:bucket@0"
+ else: raise ValueError(kind)
+ self.stock[item] += row["count"]
+ self.actions.append(action)
+
+
+def raw_budget(doc):
+ # Harvested resources, not ingots, machine parts, tools, or free energy.
+ names = ("log", "sapling", "cobblestone", "coal", "iron_ore", "gold_ore", "sand", "clay_ball",
+ "gravel", "redstone", "diamond", "emerald", "obsidian", "potato", "wheat", "reeds",
+ "gunpowder", "flint", "leather", "string", "feather", "quartz", "bone", "cactus", "dirt")
+ stock = {"minecraft:"+name+"@0": 2048 for name in names}
+ for ore in ("oreCopper", "oreTin", "oreZinc", "oreLead", "oreNickel", "oreSilver", "oreLithium", "oreSulfur"):
+ for token in doc["ores"].get(ore, []):
+ token = concrete(token)
+ if token in doc["blockItems"]: stock[token] = 2048
+ return stock
+
+
+STARTER = ("minecraft:bucket@0", "basemetals:iron_crackhammer@0", "basepower:sprocket@0",
+ "basepower:fluid_pipe@0", "basepower:still@0", "basesteam:steam_governor@0",
+ "basesteam:steam_pipe@0", "basesteam:steam_boiler_coal@0", "basesteam:steam_furnace@0",
+ "baseelectric:electric_conduit@0", "baseelectric:psu@0", "baseelectric:hydroelectric_generator@0",
+ "baseelectric:plastic_refinery@0", "baseelectric:lead_acid_battery@0",
+ "baseelectric:nickel_hydride_battery@0")
+
+
+def plan(doc):
+ planner = Planner(doc, raw_budget(doc), allow_trades=doc["mode"] == "APOCALYPTIC")
+ planner.ensure("minecraft:crafting_table@0")
+ for item in STARTER:
+ planner.ensure(item)
+ if doc["mode"] != "APOCALYPTIC": planner.ensure("baseelectric:photovoltaic_generator@0")
+ coverage = {}
+ for target in doc["targets"]:
+ if target in EXCLUSIONS:
+ coverage[target] = dict(status="EXCLUDED", reason=EXCLUSIONS[target])
+ elif target == "baseelectric:petrolplastic_ingot@0":
+ coverage[target] = dict(status="LIVE_MACHINE_REQUIRED")
+ elif target == "baseelectric:photovoltaic_generator@0" and doc["mode"] == "APOCALYPTIC":
+ coverage[target] = dict(status="EXCLUDED", reason="Intentional Apocalyptic restriction")
+ else:
+ before = planner.snapshot()
+ try:
+ planner.ensure(target)
+ coverage[target] = dict(status="NATIVE_REPLAY_REQUIRED")
+ except Unobtainable as error:
+ planner.restore(before)
+ coverage[target] = dict(status="NO_FINITE_ROUTE", reason=str(error))
+ # Two water packets for the boiler/stream, plus an empty bucket for crude oil.
+ planner.reserved.update({item: 1 for item in STARTER})
+ for item in STARTER:
+ planner.ensure(item)
+ planner.ensure("minecraft:bucket@0", 1)
+ return dict(schema=1, mode=doc["mode"], rubber=doc["rubber"], initial=planner.initial,
+ actions=planner.actions, expectedStock={k:v for k,v in planner.stock.items() if v},
+ checkpoints=list(STARTER), coverage=coverage,
+ uncreditedTrades=planner.uncredited_trades,
+ scope="FINITE_HARVESTED_RESOURCE_BUDGET; NATIVE_REPLAY_REQUIRED; NOT_MINING_OR_VILLAGER_LEVELING")
diff --git a/test-rig/migration/test_audit_survival110.py b/test-rig/migration/test_audit_survival110.py
new file mode 100644
index 0000000..ab851bc
--- /dev/null
+++ b/test-rig/migration/test_audit_survival110.py
@@ -0,0 +1,62 @@
+"""Synthetic negative controls for the independent evidence audit only."""
+import base64
+from copy import deepcopy
+import io
+import unittest
+import nbtlib
+from audit_survival110 import audit_case, audit
+
+TOOL="basemetals:iron_crackhammer@0"
+
+
+def tool(damage):
+ tag=nbtlib.File({"id":nbtlib.String(TOOL.split('@')[0]),"Count":nbtlib.Byte(1),"Damage":nbtlib.Short(damage)})
+ buffer=io.BytesIO();tag.write(buffer)
+ return [base64.b64encode(buffer.getvalue()).decode("ascii")]
+
+
+def fixture():
+ def row(kind,output,**extra):return dict(status="PASS",kind=kind,output=output,**extra)
+ first=[row("craft",TOOL,before={},after={TOOL:1}),row("crush","powder",before={TOOL:1}),
+ row("trade","gear",offer="test-offer",usesAfter=1)]
+ second=[row("crush","powder",before={TOOL:1}),row("trade","gear",offer="test-offer",usesAfter=2)]
+ return dict(status="PASS",actions=5,economy=dict(toolDurability={TOOL:100},trades=[dict(id="test-offer",maxUses=7)]),
+ coverage={TOOL:dict(status="NATIVE_OBTAINED_FINITE_STOCK")},phaseReports={
+ "first":dict(actions=first,initialStock={},stockTyped=tool(1)),
+ "continue":dict(actions=second,resumedStockTyped=tool(1),stockTyped=tool(2)),
+ "resume":dict(status="PASS",stockTyped=tool(2),maximumSteamFurnaceTemperature=1200),
+ "inspect":dict(status="PASS",stockTyped=tool(2))})
+
+
+class IndependentAuditTests(unittest.TestCase):
+ def test_valid_typed_wear_and_cross_restart_offer_uses(self):
+ result=audit_case(fixture());self.assertEqual(2,result["trades"]);self.assertEqual(2,result["hammerCrushes"])
+
+ def test_tool_damage_reset_fails_even_when_cold_counts_agree(self):
+ data=fixture();data["phaseReports"]["first"]["stockTyped"]=tool(0)
+ data["phaseReports"]["continue"]["resumedStockTyped"]=tool(0)
+ with self.assertRaisesRegex(AssertionError,"damage"):audit_case(data)
+
+ def test_free_merchant_restock_after_restart_is_rejected(self):
+ data=fixture();data["phaseReports"]["continue"]["actions"][-1]["usesAfter"]=1
+ with self.assertRaisesRegex(AssertionError,"Merchant"):audit_case(data)
+
+ def test_unwitnessed_component_cannot_be_marked_available(self):
+ data=fixture();data["coverage"]["free-machine"]=dict(status="NATIVE_OBTAINED_FINITE_STOCK")
+ with self.assertRaisesRegex(AssertionError,"credited"):audit_case(data)
+
+ def test_missing_action_or_changed_final_state_is_rejected(self):
+ data=fixture();data["phaseReports"]["first"]["actions"].pop()
+ with self.assertRaisesRegex(AssertionError,"coverage"):audit_case(data)
+ data=fixture();data["phaseReports"]["inspect"]["stockTyped"]=tool(0)
+ with self.assertRaisesRegex(AssertionError,"Final cold"):audit_case(data)
+
+ def test_new_unreachable_item_cannot_hide_in_historical_gap(self):
+ data=fixture();data["coverage"]["needed-machine"]=dict(status="NO_FINITE_ROUTE")
+ with self.assertRaisesRegex(AssertionError,"gap"):audit_case(data)
+
+ def test_incomplete_matrix_cannot_qualify(self):
+ with self.assertRaisesRegex(AssertionError,"six"):audit(dict(status="PASS",protocolUnchanged=True,manifestUnchanged=True,cases={}))
+
+
+if __name__=="__main__":unittest.main()
diff --git a/test-rig/migration/test_native110_harvest.py b/test-rig/migration/test_native110_harvest.py
index 24453ed..27d01ad 100644
--- a/test-rig/migration/test_native110_harvest.py
+++ b/test-rig/migration/test_native110_harvest.py
@@ -161,7 +161,7 @@ def test_cleanup_negative_counts_bad_sequence_and_bool_timestamps_fail(self):
def test_wrong_tool_cannot_hide_unexpected_live_drop(self):
document=sample()
row(document,"lithium/wood-fails")["dropEvidence"][0]["actualDrops"] = [
- dict(entityId=99999,uuid=str(UUID(int=99999)),item="electricadvantage:li_ore",
+ dict(entityId=99999,uuid=str(UUID(int=99999)),item="baseelectric:li_ore",
count=1,damage=0,tagged=False,removed=False,x=1200.5,y=8.5,z=1024.5)]
with self.assertRaises(AssertionError): native.require_isolation(document)
@@ -185,8 +185,8 @@ def test_java_observes_native_survival_and_real_unfiltered_item_identities(self)
self.assertIn(literal,source)
self.assertNotIn(".getDrops(",source)
self.assertNotIn("import com.mcmoddev",source)
- self.assertNotIn("import zone.moddev.mc.electricadvantage",source)
- self.assertNotIn("import zone.moddev.mc.steamadvantage",source)
+ self.assertNotIn("import zone.moddev.mc.baseelectric",source)
+ self.assertNotIn("import zone.moddev.mc.basesteam",source)
def test_runner_enforces_code_custody_before_boot_without_editing_shared_helpers(self):
source=Path(native.__file__).read_text()
diff --git a/test-rig/migration/test_native110_rebrand_bucket_proof.py b/test-rig/migration/test_native110_rebrand_bucket_proof.py
new file mode 100644
index 0000000..cb7d7db
--- /dev/null
+++ b/test-rig/migration/test_native110_rebrand_bucket_proof.py
@@ -0,0 +1,98 @@
+"""Synthetic four-boot permit rejection controls; no server or artifact mutation."""
+import copy
+import unittest
+from pathlib import Path
+from unittest.mock import patch
+
+import native110_rebrand_bucket_proof as proof
+
+
+NOTICE = "[12:34:56] [Server thread/ERROR] [FML]: Trying to activate the universal filled bucket too late. Call it statically in your Mods class. Mod: Base Metals"
+
+
+def boots():
+ return [dict(label=label, status="PASS_BOOT", exitCode=0,
+ diagnostic=dict(originalSeverity="ERROR", message=NOTICE)) for label in proof.BOOT_LABELS]
+
+
+def role():
+ return dict(status="PASS", operationCases=3, exactColdCases=3,
+ startupFlags={"operate": {}, "restart": {}})
+
+
+class FreshRebrandBucketProofTest(unittest.TestCase):
+ def test_four_complete_boots_and_three_real_bucket_cold_cases_are_required(self):
+ proof.require_four_boots(boots(), role())
+ for mutation in ("missing", "duplicate", "unknown", "exit", "bool-exit", "changed-line", "wrong-mod", "missing-oil", "missing-cold"):
+ observed, validated = boots(), role()
+ if mutation == "missing": observed.pop()
+ elif mutation == "duplicate": observed[-1] = copy.deepcopy(observed[0])
+ elif mutation == "unknown": observed[0]["label"] = "old-proof"
+ elif mutation == "exit": observed[0]["exitCode"] = 1
+ elif mutation == "bool-exit": observed[0]["exitCode"] = False
+ elif mutation == "changed-line": observed[0]["diagnostic"]["message"] += " "
+ elif mutation == "wrong-mod": observed[0]["diagnostic"]["message"] = NOTICE.replace("Base Metals", "basePower")
+ elif mutation == "missing-oil": validated["operationCases"] = 2
+ else: validated["exactColdCases"] = 2
+ with self.subTest(mutation=mutation), self.assertRaises(AssertionError):
+ proof.require_four_boots(observed, validated)
+
+ def test_an_old_pass_or_a_changed_full_candidate_never_binds(self):
+ candidate = dict(manifestSha256="a" * 64, mods=[dict(id=id, sha256=id, version="v", runtimeVersion="v")
+ for id in sorted(proof.TARGET_IDS)], codeInventory={"files": {"engine": "sealed"}})
+ doc = dict(kind=proof.KIND, status="PASS", candidate=candidate)
+ proof.bind_candidate(doc, candidate)
+ for mutation in ("old-proof", "manifest", "power", "steam", "electric", "harness", "base", "ore", "engine"):
+ changed = copy.deepcopy(candidate)
+ document = copy.deepcopy(doc)
+ if mutation == "old-proof": document["kind"] = "historical-legacy-bucket-proof"
+ elif mutation == "manifest": changed["manifestSha256"] = "b" * 64
+ elif mutation == "engine": changed["codeInventory"]["files"]["engine"] = "changed"
+ else:
+ id = {"power": "basepower", "steam": "basesteam", "electric": "baseelectric", "harness": "advantageworkstest", "base": "basemetals", "ore": "orespawn"}[mutation]
+ next(m for m in changed["mods"] if m["id"] == id)["sha256"] = "changed"
+ with self.subTest(mutation=mutation), self.assertRaises(AssertionError): proof.bind_candidate(document, changed)
+
+ def test_exact_line_is_pending_until_the_whole_fresh_campaign_passes(self):
+ lines = ["Starting minecraft server version 1.10.2", "Forge Mod Loader version 12.18.3.2511 for Minecraft 1.10.2 loading", NOTICE]
+ self.assertEqual("PENDING_DIAGNOSTIC_PROOF", proof.legacy.held_diagnostics(lines, proof.legacy.BASE_SHA, proof.legacy.PUBLIC_FORGE_SHA)["status"])
+ for bad in (lines + [NOTICE], lines + ["[12:34:57] [Server thread/ERROR] [FML]: Other failure"], lines[:-1]):
+ with self.assertRaises(AssertionError): proof.legacy.held_diagnostics(bad, proof.legacy.BASE_SHA, proof.legacy.PUBLIC_FORGE_SHA)
+
+ def test_baseline_mod_inventory_cannot_contain_a_harness_or_power(self):
+ proof.require_baseline_mods({"basemetals": "2.4.0", "orespawn": "4.0.8.110021", "Forge": "12.18.3.2511"},
+ {"basemetals": "2.4.0", "orespawn": "4.0.8.110021"})
+ for extra in ("basepower", "advantageworkstest", "unknown"):
+ with self.subTest(extra=extra), self.assertRaises(AssertionError):
+ proof.require_baseline_mods({"basemetals": "2.4.0", "orespawn": "4.0.8.110021", extra: "v"},
+ {"basemetals": "2.4.0", "orespawn": "4.0.8.110021"})
+
+ def test_first_strict_failure_is_required_and_cannot_be_a_preservation_failure(self):
+ candidate = dict(manifestSha256="a" * 64)
+ failed = dict(status="FAIL", targetManifestSha256="a" * 64,
+ failure="Native runtime diagnostic at line 123: " + NOTICE)
+ with patch.object(proof, "digest", return_value="B" * 64), patch.object(proof.legacy, "read", return_value=failed):
+ proof.require_strict_failure(Path("strict.json"), "b" * 64, candidate)
+ for field, value in (("status", "PASS"), ("targetManifestSha256", "c" * 64),
+ ("failure", "Unticked imported state changed"),
+ ("failure", "Native runtime diagnostic at line 123: " + NOTICE.replace("Base Metals", "Other Mod"))):
+ bad = copy.deepcopy(failed)
+ bad[field] = value
+ with self.subTest(field=field, value=value), patch.object(proof.legacy, "read", return_value=bad), self.assertRaises(AssertionError):
+ proof.require_strict_failure(Path("strict.json"), "b" * 64, candidate)
+ with self.assertRaises(AssertionError): proof.require_strict_failure(Path("strict.json"), "changed", candidate)
+
+ def test_each_mode_requires_its_exact_original_observer_with_no_other_extra(self):
+ candidate = dict(mods=[dict(path="core.jar", sha256="core")])
+ for mode in ("connected", "passive-source355", "synthetic-nested"):
+ correct = {"core.jar": "core", "observer.jar": proof.observer_sha(mode)}
+ proof.require_destination_inventory(correct, candidate, mode)
+ for bad in ({"core.jar": "core"}, {**correct, "extra.jar": "unexpected"},
+ {"core.jar": "core", "observer.jar": "changed"},
+ {**correct, "core.jar": "changed"}):
+ with self.subTest(mode=mode, bad=bad), self.assertRaises(AssertionError):
+ proof.require_destination_inventory(bad, candidate, mode)
+ with self.assertRaises(AssertionError): proof.observer_sha("unknown")
+
+
+if __name__ == "__main__": unittest.main()
diff --git a/test-rig/migration/test_native110_rebrand_connected.py b/test-rig/migration/test_native110_rebrand_connected.py
new file mode 100644
index 0000000..12b5b07
--- /dev/null
+++ b/test-rig/migration/test_native110_rebrand_connected.py
@@ -0,0 +1,104 @@
+"""Pure rejection controls, not Minecraft migration evidence."""
+import base64
+import copy
+import gzip
+import io
+import unittest
+
+import nbtlib
+
+import native110_rebrand_connected as rebrand
+
+
+def snapshot(namespace):
+ tag = nbtlib.parse_nbt('{id:"' + namespace + '.steam_furnace",Energy:[I;1065353216],'
+ 'Items:[{Slot:0b,id:"' + ("electricadvantage" if namespace == "steamadvantage" else "baseelectric")
+ + ':lithium_battery",Count:1b,tag:{energy:123.5f,CustomName:"electricadvantage:keep"}}]}')
+ data = io.BytesIO()
+ nbtlib.File(tag).write(data)
+ return dict(held=True, buildCallsThisProcess=0, advancedTicks=0, requestedTicks=0,
+ snapshot=[dict(id="furnace", station="C-STEAM", kind="furnace", name="steamadvantage:steam_furnace",
+ actualName=namespace + ":steam_furnace", x=80, y=80, z=80, properties={"facing": "north"},
+ nbtBase64=base64.b64encode(gzip.compress(data.getvalue())).decode("ascii"))])
+
+
+def change_nbt(document, change):
+ row = document["snapshot"][0]
+ tag = rebrand.binary_nbt(row)
+ change(tag)
+ row["nbtBase64"] = rebrand.encode_nbt(tag)
+
+
+class RebrandPreservationTest(unittest.TestCase):
+ def test_exact_namespace_only_change_passes_without_mutating_documents(self):
+ old, new = snapshot("steamadvantage"), snapshot("basesteam")
+ untouched = copy.deepcopy((old, new))
+ self.assertEqual("PASS", rebrand.preservation(old, new)["status"])
+ self.assertEqual(untouched, (old, new))
+ self.assertEqual("PASS", rebrand.preservation(new, new)["status"])
+
+ def test_removed_item_wrong_facing_and_lost_energy_fail(self):
+ for mutation in ("item", "facing", "energy", "type", "extra", "custom", "old-id", "missing-tile"):
+ old, new = snapshot("steamadvantage"), snapshot("basesteam")
+ if mutation == "item": change_nbt(new, lambda tag: tag["Items"].clear())
+ elif mutation == "facing": new["snapshot"][0]["properties"]["facing"] = "south"
+ elif mutation == "energy": change_nbt(new, lambda tag: tag.__setitem__("Energy", nbtlib.IntArray([0])))
+ elif mutation == "type": change_nbt(new, lambda tag: tag["Items"][0].__setitem__("Count", nbtlib.Int(1)))
+ elif mutation == "extra": change_nbt(new, lambda tag: tag.__setitem__("HiddenEnergy", nbtlib.Int(1)))
+ elif mutation == "custom": change_nbt(new, lambda tag: tag["Items"][0]["tag"].__setitem__("CustomName", nbtlib.String("baseelectric:keep")))
+ elif mutation == "old-id": new["snapshot"][0]["actualName"] = "steamadvantage:steam_furnace"
+ else: new["snapshot"][0].pop("nbtBase64")
+ with self.subTest(mutation=mutation):
+ self.assertEqual("FAIL", rebrand.preservation(old, new)["status"])
+
+ def test_unticked_means_frozen_zero_builds_and_zero_ticks(self):
+ for field, value in (("held", False), ("advancedTicks", 1), ("requestedTicks", 1), ("buildCallsThisProcess", 1)):
+ new = snapshot("basesteam")
+ new[field] = value
+ with self.subTest(field=field), self.assertRaises(AssertionError):
+ rebrand.require_passive(new)
+
+ def test_missing_extra_duplicate_and_moved_witnesses_fail(self):
+ for mutation in ("missing", "extra", "duplicate", "moved"):
+ old, new = snapshot("steamadvantage"), snapshot("basesteam")
+ if mutation == "missing": new["snapshot"].clear()
+ elif mutation == "moved": new["snapshot"][0]["x"] += 1
+ else:
+ row = copy.deepcopy(new["snapshot"][0])
+ if mutation == "extra": row["id"] = "extra"
+ new["snapshot"].append(row)
+ with self.subTest(mutation=mutation):
+ if mutation == "duplicate":
+ with self.assertRaises(AssertionError): rebrand.preservation(old, new)
+ else: self.assertEqual("FAIL", rebrand.preservation(old, new)["status"])
+
+ def test_only_exact_namespace_boundaries_are_translated(self):
+ self.assertEqual("basepower:still", rebrand.target_id("poweradvantage:still"))
+ for value in ("other:poweradvantage", "poweradvantage_extra:still", "custom poweradvantage:still"):
+ self.assertEqual(value, rebrand.target_id(value))
+
+ def test_electric_drill_does_not_invent_a_saved_facing_field(self):
+ old, new = snapshot("steamadvantage"), snapshot("basesteam")
+ for document, namespace in ((old, "electricadvantage"), (new, "baseelectric")):
+ document["snapshot"][0].update(name="electricadvantage:electric_drill",
+ actualName=namespace + ":electric_drill", kind="drill")
+ change_nbt(document, lambda tag: tag.__setitem__("id", nbtlib.String(namespace + ".electric_drill")))
+ change_nbt(document, lambda tag: tag.__setitem__("progress", nbtlib.Short(209)))
+ self.assertEqual("PASS", rebrand.preservation(old, new)["status"])
+ change_nbt(new, lambda tag: tag.__setitem__("Facing", nbtlib.Byte(2)))
+ self.assertEqual("FAIL", rebrand.preservation(old, new)["status"])
+
+ def test_only_steam_legacy_facing_is_derived_from_the_actual_block_state(self):
+ old, new = snapshot("steamadvantage"), snapshot("basesteam")
+ for document, namespace in ((old, "steamadvantage"), (new, "basesteam")):
+ document["snapshot"][0].update(name="steamadvantage:steam_drill",
+ actualName=namespace + ":steam_drill", kind="drill")
+ change_nbt(document, lambda tag: tag.__setitem__("id", nbtlib.String(namespace + ".steam_drill")))
+ change_nbt(new, lambda tag: tag.__setitem__("Facing", nbtlib.Byte(2)))
+ self.assertEqual("PASS", rebrand.preservation(old, new)["status"])
+ change_nbt(new, lambda tag: tag.__setitem__("Facing", nbtlib.Byte(3)))
+ self.assertEqual("FAIL", rebrand.preservation(old, new)["status"])
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/test-rig/migration/test_native110_rebrand_passive.py b/test-rig/migration/test_native110_rebrand_passive.py
new file mode 100644
index 0000000..ee5ad82
--- /dev/null
+++ b/test-rig/migration/test_native110_rebrand_passive.py
@@ -0,0 +1,137 @@
+"""Synthetic oracle rejection tests, never labelled authentic fixture evidence."""
+import copy
+import unittest
+from pathlib import Path
+from unittest.mock import patch
+
+import nbtlib
+
+from native110_rebrand_connected import encode_nbt
+import native110_rebrand_passive as passive
+
+
+def rows(namespace="steamadvantage", enchantment_id=11):
+ result = []
+ for index in range(355):
+ tag = nbtlib.parse_nbt('{id:"' + namespace + '.steam_furnace",Energy:[I;1065353216],Items:[{Slot:0b,id:"'
+ + namespace + ':musket",Count:1b,Damage:5s,tag:{MigrationWitness:"steamadvantage:musket",'
+ + 'ench:[{id:' + str(enchantment_id) + 's,lvl:1s}],Nested:{Bytes:[B;1b,-2b],Ints:[I;3,-7]}}}]}')
+ result.append(dict(x=index, y=80, z=0, name="steamadvantage:steam_furnace", metadata=2,
+ actualName=namespace + ":steam_furnace", properties={"facing": "north"}, nbtBase64=encode_nbt(nbtlib.File(tag))))
+ return result
+
+
+class Passive355Test(unittest.TestCase):
+ def compare(self, old, new, target_registry=None):
+ return passive.compare_rows(old, new, {11: "steamadvantage:recoil"}, target_registry or {47: "steamadvantage:recoil"})
+
+ def test_exact_namespace_translation_and_enchantment_semantics_pass_without_mutation(self):
+ old, new = rows(), rows("basesteam", 47)
+ untouched = copy.deepcopy((old, new))
+ self.assertEqual("PASS", self.compare(old, new)["status"])
+ self.assertEqual(untouched, (old, new))
+
+ def test_missing_extra_duplicate_moved_meta_facing_and_wrong_namespace_fail(self):
+ for mutation in ("missing", "extra", "duplicate", "moved", "meta", "facing", "old-id"):
+ old, new = rows(), rows("basesteam", 47)
+ if mutation == "missing": new.pop()
+ elif mutation == "extra": new.append(copy.deepcopy(new[-1]))
+ elif mutation == "duplicate": new[-1] = copy.deepcopy(new[0])
+ elif mutation == "moved": new[-1]["x"] += 1000
+ elif mutation == "meta": new[-1]["metadata"] = 3
+ elif mutation == "facing": new[-1]["properties"]["facing"] = "south"
+ else: new[-1]["actualName"] = "steamadvantage:steam_furnace"
+ with self.subTest(mutation=mutation), self.assertRaises(AssertionError): self.compare(old, new)
+
+ def test_removed_item_lost_energy_changed_type_enchantment_and_extra_key_fail(self):
+ for mutation in ("item", "energy", "type", "level", "enchantment", "extra", "custom"):
+ old, new = rows(), rows("basesteam", 47)
+ tag = passive.binary_nbt(new[-1])
+ if mutation == "item": tag["Items"].clear()
+ elif mutation == "energy": tag["Energy"] = nbtlib.IntArray([0])
+ elif mutation == "type": tag["Items"][0]["Count"] = nbtlib.Int(1)
+ elif mutation == "level": tag["Items"][0]["tag"]["ench"][0]["lvl"] = nbtlib.Short(2)
+ elif mutation == "enchantment": tag["Items"][0]["tag"]["ench"][0]["id"] = nbtlib.Short(48)
+ elif mutation == "extra": tag["HiddenEnergy"] = nbtlib.Int(1)
+ else: tag["Items"][0]["tag"]["MigrationWitness"] = nbtlib.String("basesteam:musket")
+ new[-1]["nbtBase64"] = encode_nbt(tag)
+ with self.subTest(mutation=mutation), self.assertRaises(AssertionError): self.compare(old, new)
+
+ def test_equal_numeric_ids_do_not_hide_an_incorrect_registry_semantic(self):
+ with self.assertRaises(AssertionError):
+ self.compare(rows(), rows("basesteam", 11), {11: "steamadvantage:powderless"})
+
+ def test_retained_canonical_enchantments_must_not_be_renamed_in_the_target(self):
+ with self.assertRaises(AssertionError):
+ self.compare(rows(), rows("basesteam", 47), {47: "basesteam:recoil"})
+
+ def test_only_steam_derives_exact_typed_facing_from_original_metadata(self):
+ old, new = rows(), rows("basesteam", 47)
+ for meta, facing in enumerate(("down", "up", "north", "south", "west", "east")):
+ for collection, namespace in ((old, "steamadvantage"), (new, "basesteam")):
+ row = collection[meta]
+ row.update(name="steamadvantage:steam_drill", actualName=namespace + ":steam_drill", metadata=meta,
+ properties={"facing": facing})
+ tag = passive.binary_nbt(row)
+ tag["id"] = nbtlib.String(namespace + ".steam_drill")
+ if collection is new: tag["Facing"] = nbtlib.Byte(meta)
+ row["nbtBase64"] = encode_nbt(tag)
+ self.assertEqual("PASS", self.compare(old, new)["status"])
+ for mutation in ("wrong-facing", "wrong-type", "foreign-key", "metadata-disagreement"):
+ damaged = copy.deepcopy(new)
+ source = copy.deepcopy(old)
+ tag = passive.binary_nbt(damaged[2])
+ if mutation == "wrong-facing": tag["Facing"] = nbtlib.Byte(3)
+ elif mutation == "wrong-type": tag["Facing"] = nbtlib.Int(2)
+ elif mutation == "foreign-key": tag["ForeignState"] = nbtlib.Int(1)
+ else: source[2]["properties"]["facing"] = "south"
+ damaged[2]["nbtBase64"] = encode_nbt(tag)
+ with self.subTest(mutation=mutation), self.assertRaises(AssertionError): self.compare(source, damaged)
+
+ def test_electric_missing_facing_stays_absent_and_extra_target_facing_fails(self):
+ old, new = rows(), rows("basesteam", 47)
+ for collection, namespace in ((old, "electricadvantage"), (new, "baseelectric")):
+ row = collection[0]
+ row.update(name="electricadvantage:electric_drill", actualName=namespace + ":electric_drill")
+ tag = passive.binary_nbt(row)
+ tag["id"] = nbtlib.String(namespace + ".electric_drill")
+ row["nbtBase64"] = encode_nbt(tag)
+ self.assertEqual("PASS", self.compare(old, new)["status"])
+ tag = passive.binary_nbt(new[0]); tag["Facing"] = nbtlib.Byte(2)
+ new[0]["nbtBase64"] = encode_nbt(tag)
+ with self.assertRaises(AssertionError): self.compare(old, new)
+
+ def test_observer_has_no_state_repair_or_construction_path(self):
+ java = (Path(passive.__file__).parents[1] / "src/main/java/zone/moddev/mc/advantageworks/NativePassiveMigrationProbe.java").read_text()
+ for forbidden in ("readFromNBT", "setBlockState", "setInventorySlotContents", "markDirty", "build(", "addEnchantment"):
+ self.assertNotIn(forbidden, java)
+ self.assertIn("tile.writeToNBT(new NBTTagCompound())", java)
+
+ def test_synthetic_station_cannot_be_accepted_as_authentic_player_evidence(self):
+ with self.assertRaises(AssertionError): passive.validate_nested({"scope": passive.AUTHENTIC_SCOPE, "cases": []})
+
+ def test_synthetic_xp_seed_remains_exact_and_typed_not_ignored(self):
+ tag = nbtlib.File(nbtlib.parse_nbt('{XpSeed:305441741,Inventory:[],EnderItems:[]}'))
+ encoded = encode_nbt(tag)
+ document = dict(scope=passive.SYNTHETIC_SCOPE, status="PASS", worldInsertions=0, playerFileWrites=0,
+ cases=[dict(id=case, status="PASS", nativeSemantics=True, inputNbtBase64=encoded,
+ expectedNbtBase64=encoded, actualNbtBase64=encoded) for case in sorted(passive.SYNTHETIC_CASES)])
+ self.assertEqual("PASS", passive.validate_nested(document)["status"])
+ for value in (nbtlib.Int(305441742), nbtlib.Long(305441741)):
+ bad = copy.deepcopy(document)
+ actual = nbtlib.File(nbtlib.parse_nbt('{XpSeed:305441741,Inventory:[],EnderItems:[]}'))
+ actual["XpSeed"] = value
+ bad["cases"][0]["actualNbtBase64"] = encode_nbt(actual)
+ with self.subTest(value=type(value).__name__), self.assertRaises(AssertionError): passive.validate_nested(bad)
+
+ def test_only_the_exact_original_observer_is_allowed_and_legacy_commands_are_forbidden(self):
+ expected = passive.SOURCE_JARS["AdvantageMigrationProbe-110-1.0.0.jar"]
+ with patch.object(passive, "digest", return_value=expected):
+ self.assertEqual(Path("fixture/mods/AdvantageMigrationProbe-110-1.0.0.jar"), passive.source_observer(Path("fixture")))
+ with patch.object(passive, "digest", return_value="changed"), self.assertRaises(AssertionError):
+ passive.source_observer(Path("fixture"))
+ for command in ("advprobe build source", "advprobe snapshot source", "setblock 0 80 0 stone", "advconnected build source"):
+ with self.subTest(command=command), self.assertRaises(AssertionError): passive.PassiveServer.send(None, command)
+
+
+if __name__ == "__main__": unittest.main()
diff --git a/test-rig/migration/test_native110_recipe_progression.py b/test-rig/migration/test_native110_recipe_progression.py
index 4eb1509..ce3c128 100644
--- a/test-rig/migration/test_native110_recipe_progression.py
+++ b/test-rig/migration/test_native110_recipe_progression.py
@@ -7,32 +7,32 @@
def fixture(mode="NORMAL"):
rows=[]
ores={"ingotIron":["minecraft:iron_ingot@0"],
- "ingotSilicon":["electricadvantage:silicon_ingot@0"],
+ "ingotSilicon":["baseelectric:silicon_ingot@0"],
"nuggetCopper":["basemetals:copper_nugget@0"],
"nuggetTin":["basemetals:tin_nugget@0"],
"nuggetGold":["minecraft:gold_nugget@0"],
- "plastic":["poweradvantage:plastic@0"],"dustRedstone":["minecraft:redstone@0"]}
+ "plastic":["basepower:plastic@0"],"dustRedstone":["minecraft:redstone@0"]}
def recipe(output,inputs,count=1):
rows.append(dict(id="craft/"+str(len(rows)),output=output,inputs=inputs,count=count,
providers=[[item] for item in inputs],
actualCrafted=output,actualCraftedCount=count,
status="PASS",owned=True,negativeControlsRejected=2,consumption="NATIVE_SLOT_CRAFTING",
recipeBookCraftUnlock="N/A_NO_1_10_RECIPE_BOOK"))
- recipe("poweradvantage:fluid_pipe@0",["minecraft:iron_ingot@0"]*6,3 if mode=="APOCALYPTIC" else 6)
- recipe("steamadvantage:steam_governor@0",["minecraft:iron_nugget@0"])
- recipe("electricadvantage:psu@0",["electricadvantage:control_circuit@0"])
+ recipe("basepower:fluid_pipe@0",["minecraft:iron_ingot@0"]*6,3 if mode=="APOCALYPTIC" else 6)
+ recipe("basesteam:steam_governor@0",["minecraft:iron_nugget@0"])
+ recipe("baseelectric:psu@0",["baseelectric:control_circuit@0"])
if mode!="APOCALYPTIC":
- recipe("poweradvantage:sprocket@0",["basemetals:steel_ingot@0"],4)
+ recipe("basepower:sprocket@0",["basemetals:steel_ingot@0"],4)
for metal in ("Copper","Tin","Gold"):
inputs=[ores["ingotSilicon"][0]]*3+[ores["nugget"+metal][0]]*3
if mode=="TECH_PROGRESSION":
inputs=[ores["plastic"][0],ores["dustRedstone"][0],ores["plastic"][0]]+inputs
- recipe("electricadvantage:integrated_circuit@0",inputs,3)
- recipe("electricadvantage:photovoltaic_generator@0",["minecraft:glass@0"])
+ recipe("baseelectric:integrated_circuit@0",inputs,3)
+ recipe("baseelectric:photovoltaic_generator@0",["minecraft:glass@0"])
return dict(minecraft=native.MC,mode=mode,rubber=True,status="EXPORTED_NOT_QUALIFIED",crafting=rows,
targets=sorted(native.CORE),ores=ores,
blockItems=[],smelting=[dict(input="minecraft:iron_ore@0",output="minecraft:iron_ingot@0",count=1)],
- crusherRegistry="unit:fixture",crushing=[dict(input="minecraft:potato@0",output="poweradvantage:starch@0",tools=[])],sampledNativeLoot=[])
+ crusherRegistry="unit:fixture",crushing=[dict(input="minecraft:potato@0",output="basepower:starch@0",tools=[])],sampledNativeLoot=[])
class RecipeAuditTests(unittest.TestCase):
def test_missing_process_functions_and_lookup_errors_remain_required_failures(self):
@@ -64,7 +64,7 @@ def test_missing_core_or_duplicate_recipe_cannot_qualify(self):
with self.assertRaises(AssertionError): native.mode_checks(doc,"NORMAL",True)
def test_apocalyptic_does_not_gain_free_chips_sprockets_or_solar(self):
- for target in ("poweradvantage:sprocket@0","electricadvantage:integrated_circuit@0","electricadvantage:photovoltaic_generator@0"):
+ for target in ("basepower:sprocket@0","baseelectric:integrated_circuit@0","baseelectric:photovoltaic_generator@0"):
doc=fixture("APOCALYPTIC")
extra=deepcopy(doc["crafting"][0]);extra.update(id="forbidden",output=target);doc["crafting"].append(extra)
with self.subTest(target=target),self.assertRaises(AssertionError): native.mode_checks(doc,"APOCALYPTIC",True)
@@ -74,13 +74,13 @@ def test_pipe_yields_and_tech_chip_complexity_remain_strict(self):
doc=fixture(mode);doc["crafting"][0]["count"]=99
with self.subTest(mode=mode),self.assertRaises(AssertionError):native.mode_checks(doc,mode,True)
doc=fixture("TECH_PROGRESSION")
- next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0")["inputs"]=["minecraft:dirt@0"]*6
+ next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0")["inputs"]=["minecraft:dirt@0"]*6
with self.assertRaises(AssertionError): native.mode_checks(doc,"TECH_PROGRESSION",True)
def test_wrong_chip_materials_are_not_blessed_by_a_root_flag(self):
for mode in ("NORMAL","TECH_PROGRESSION"):
doc=fixture(mode);doc["chipSemanticsVerified"]=True
- chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0")
+ chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0")
chip["inputs"]=["minecraft:dirt@0"]*len(chip["inputs"])
chip["providers"]=[[item] for item in chip["inputs"]]
with self.subTest(mode=mode),self.assertRaisesRegex(AssertionError,"Microchip"):
@@ -90,7 +90,7 @@ def test_chip_yield_is_three_even_when_native_count_fields_agree(self):
for mode in ("NORMAL","TECH_PROGRESSION"):
for count in (1,2,4,64):
doc=fixture(mode)
- chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0")
+ chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0")
chip.update(count=count,actualCraftedCount=count)
with self.subTest(mode=mode,count=count),self.assertRaisesRegex(AssertionError,"Microchip"):
native.mode_checks(doc,mode,True)
@@ -100,7 +100,7 @@ def test_chip_nuggets_cannot_be_mixed_or_replaced_by_ingots(self):
for metals in (["basemetals:copper_nugget@0","basemetals:tin_nugget@0","minecraft:gold_nugget@0"],
["basemetals:copper_ingot@0"]*3):
doc=fixture(mode);doc["ores"]["ingotCopper"]=["basemetals:copper_ingot@0"]
- chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0")
+ chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0")
chip["inputs"][-3:]=metals;chip["providers"][-3:]=[[item] for item in metals]
with self.subTest(mode=mode,metals=metals),self.assertRaisesRegex(AssertionError,"Microchip"):
native.mode_checks(doc,mode,True)
@@ -115,7 +115,7 @@ def test_chip_requires_actual_native_ore_entries(self):
def test_tech_chip_requires_plastic_and_redstone(self):
for slot in (0,1,2):
doc=fixture("TECH_PROGRESSION")
- chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0")
+ chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0")
chip["inputs"][slot]=doc["ores"]["ingotSilicon"][0]
chip["providers"][slot]=[chip["inputs"][slot]]
with self.subTest(slot=slot),self.assertRaisesRegex(AssertionError,"Microchip"):
@@ -125,7 +125,7 @@ def test_chip_requires_complete_consistent_provider_evidence(self):
for mode in ("NORMAL","TECH_PROGRESSION"):
for mutation in ("missing","short","empty","wrong-selected","extra-wrong-choice"):
doc=fixture(mode)
- chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0")
+ chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0")
if mutation=="missing": chip.pop("providers")
elif mutation=="short": chip["providers"].pop()
elif mutation=="empty": chip["providers"][0]=[]
@@ -150,37 +150,37 @@ def test_chip_uses_actual_ore_entries_not_item_name_heuristics(self):
def test_chip_wildcard_ores_accept_native_expanded_providers(self):
doc=fixture();doc["ores"]["ingotSilicon"]=["othermod:silicon@32767"]
- for chip in (r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0"):
+ for chip in (r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0"):
chip["inputs"][:3]=["othermod:silicon@5"]*3
chip["providers"][:3]=[["othermod:silicon@5","othermod:silicon@7"] for _ in range(3)]
native.mode_checks(doc,"NORMAL",True)
def test_chip_provider_wildcards_cannot_broaden_specific_ore_entries(self):
doc=fixture()
- chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0")
+ chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0")
chip["providers"][0]=[chip["inputs"][0].rsplit("@",1)[0]+"@32767"]
with self.assertRaisesRegex(AssertionError,"Microchip"):
native.mode_checks(doc,"NORMAL",True)
def test_unseeded_self_and_mutual_cycles_are_not_reachable(self):
doc=fixture()
- for output,inputs in (("poweradvantage:a@0",["poweradvantage:b@0"]),("poweradvantage:b@0",["poweradvantage:a@0"])):
+ for output,inputs in (("basepower:a@0",["basepower:b@0"]),("basepower:b@0",["basepower:a@0"])):
doc["crafting"].append(dict(id=output,output=output,inputs=inputs,status="PASS"))
doc["targets"].append(output)
result=native.reachability(doc)
- self.assertIn("poweradvantage:a@0",result["blocked"]);self.assertIn("poweradvantage:b@0",result["blocked"])
+ self.assertIn("basepower:a@0",result["blocked"]);self.assertIn("basepower:b@0",result["blocked"])
def test_generated_loot_configuration_is_not_a_real_acquisition(self):
- doc=fixture("APOCALYPTIC");doc["generatedLootConfig"]=["poweradvantage:sprocket@0"]
- self.assertNotIn("poweradvantage:sprocket@0",native.reachability(doc)["reachable"])
- doc["sampledNativeLoot"]=[dict(item="poweradvantage:sprocket@0",table="simple_dungeon",seed=4)]
- self.assertIn("poweradvantage:sprocket@0",native.reachability(doc)["reachable"])
+ doc=fixture("APOCALYPTIC");doc["generatedLootConfig"]=["basepower:sprocket@0"]
+ self.assertNotIn("basepower:sprocket@0",native.reachability(doc)["reachable"])
+ doc["sampledNativeLoot"]=[dict(item="basepower:sprocket@0",table="simple_dungeon",seed=4)]
+ self.assertIn("basepower:sprocket@0",native.reachability(doc)["reachable"])
doc["mode"]="NORMAL"
- self.assertNotIn("poweradvantage:sprocket@0",native.reachability(doc)["reachable"])
+ self.assertNotIn("basepower:sprocket@0",native.reachability(doc)["reachable"])
def test_ore_roots_never_seed_a_crafted_nonblock_part(self):
- doc=fixture();doc["ores"]["oreCopper"]=["poweradvantage:sprocket@0"]
- self.assertNotIn("poweradvantage:sprocket@0",native.reachability(doc)["reachable"])
+ doc=fixture();doc["ores"]["oreCopper"]=["basepower:sprocket@0"]
+ self.assertNotIn("basepower:sprocket@0",native.reachability(doc)["reachable"])
def test_smelting_requires_a_reachable_furnace_and_fuel(self):
doc=fixture();doc["smelting"]=[dict(input="minecraft:iron_ore@0",output="minecraft:iron_ingot@0",count=1)]
@@ -189,10 +189,10 @@ def test_smelting_requires_a_reachable_furnace_and_fuel(self):
self.assertIn("minecraft:iron_ingot@0",native.reachability(doc)["reachable"])
def test_crushing_requires_an_obtainable_valid_hammer(self):
- doc=fixture();doc["crushing"]=[dict(input="minecraft:potato@0",output="poweradvantage:starch@0",tools=["basemetals:stone_crackhammer@0"])]
- self.assertNotIn("poweradvantage:starch@0",native.reachability(doc)["reachable"])
+ doc=fixture();doc["crushing"]=[dict(input="minecraft:potato@0",output="basepower:starch@0",tools=["basemetals:stone_crackhammer@0"])]
+ self.assertNotIn("basepower:starch@0",native.reachability(doc)["reachable"])
doc["crafting"].append(dict(id="hammer",inputs=["minecraft:cobblestone@0"],output="basemetals:stone_crackhammer@0",status="PASS"))
- self.assertIn("poweradvantage:starch@0",native.reachability(doc)["reachable"])
+ self.assertIn("basepower:starch@0",native.reachability(doc)["reachable"])
def test_unverified_native_recipes_and_missing_machine_edges_are_explicit(self):
doc=fixture();doc["crafting"][0].update(status="UNVERIFIED",reason="Missing provider")
diff --git a/test-rig/migration/test_rebrand_target_contract.py b/test-rig/migration/test_rebrand_target_contract.py
new file mode 100644
index 0000000..d4b1483
--- /dev/null
+++ b/test-rig/migration/test_rebrand_target_contract.py
@@ -0,0 +1,69 @@
+"""Target declarations and API boundaries; no builds, servers or source-world writes."""
+import json
+from pathlib import Path
+import unittest
+
+RIG = Path(__file__).resolve().parents[1]
+VERSIONS = {"basepower": ("basePower", "2.4.4.110021"),
+ "basesteam": ("baseSteam", "2.2.6.110021"), "baseelectric": ("baseElectric", "2.2.6.110021")}
+
+
+class RebrandTargetContractTest(unittest.TestCase):
+ def test_all_eleven_current_profiles_are_explicitly_unqualified_new_targets(self):
+ profiles = list((RIG / "profiles").glob("*.json"))
+ self.assertEqual(11, len(profiles))
+ for path in profiles:
+ doc = json.loads(path.read_text())
+ self.assertEqual("UNQUALIFIED_REBRAND_WORKSPACE_INPUTS", doc["qualificationStatus"])
+ for mod in doc["mods"]:
+ self.assertNotIn(mod["id"], ("poweradvantage", "steamadvantage", "electricadvantage"))
+ if mod["id"] in VERSIONS:
+ stem, version = VERSIONS[mod["id"]]
+ self.assertEqual(version, mod["version"])
+ suffix = "-deobf.jar" if doc["mode"] == "development" else ".jar"
+ self.assertEqual(stem + "-" + version + suffix, mod["file"])
+ self.assertRegex(mod.get("sha256", ""), r"^[A-F0-9]{64}$")
+ if doc["mode"] == "packaged":
+ expected = {"basepower": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31",
+ "basesteam": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D",
+ "baseelectric": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1"}
+ self.assertEqual(expected[mod["id"]], mod["sha256"])
+ if mod["id"] == "advantageworkstest":
+ self.assertEqual("1.1.0.110021", mod["version"])
+ if doc["mode"] == "development":
+ self.assertTrue(mod["path"].startswith("build/gradle/libs-dev"))
+ else:
+ self.assertEqual("521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525",mod["sha256"])
+ self.assertIn("/survival-candidate-06/artifacts/" + mod["sha256"] + "/", mod["path"])
+ self.assertTrue(mod["path"].endswith("/" + mod["file"]))
+
+ def test_current_targets_keep_the_legacy_public_api_and_use_new_implementation_packages(self):
+ roots = (RIG / "src", RIG / "client-resources/java")
+ seen_api = False
+ for root in roots:
+ for path in root.rglob("*.java"):
+ source = path.read_text()
+ seen_api |= "cyano.poweradvantage.api" in source
+ self.assertNotIn("cyano.basepower.api", source)
+ for old in ("poweradvantage", "steamadvantage", "electricadvantage"):
+ self.assertNotIn("zone.moddev.mc." + old, source)
+ self.assertNotIn("com.mcmoddev." + old, source)
+ self.assertTrue(seen_api)
+ build = (RIG / "build.gradle").read_text()
+ self.assertIn("../build/libs-dev/basePower-2.4.4.110021-deobf.jar", build)
+
+ def test_java_profile_runner_cannot_treat_unpinned_rebrand_bytes_as_qualified(self):
+ source = (RIG / "src/runner/java/zone/moddev/mc/advantageworks/runner/WorksRunner.java").read_text()
+ self.assertIn('input.id.matches("base(?:power|steam|electric)")', source)
+ self.assertIn("requires a fresh exact SHA-256 pin", source)
+ self.assertIn('manifest.put("qualificationStatus", profile.qualificationStatus)', source)
+
+ def test_harness_metadata_depends_only_on_current_target_ids(self):
+ harness = json.loads((RIG / "src/main/resources/mcmod.info").read_text())
+ client = json.loads((RIG / "client-resources/resources/mcmod.info").read_text())
+ self.assertEqual(["basepower"], harness[0]["dependencies"])
+ self.assertEqual(["basepower", "basesteam", "baseelectric"], client[0]["dependencies"])
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/test-rig/migration/test_steam_control_audit.py b/test-rig/migration/test_steam_control_audit.py
index b2b62bd..03fa1ed 100644
--- a/test-rig/migration/test_steam_control_audit.py
+++ b/test-rig/migration/test_steam_control_audit.py
@@ -4,9 +4,11 @@
import contextlib
from copy import deepcopy
import gzip
+import importlib.util
import io
import json
from pathlib import Path
+import shutil
import tempfile
import unittest
from unittest.mock import patch
@@ -15,7 +17,8 @@
import steam_control_audit as audit
-LINE = Path(__file__).resolve().parents[3].name[2:]
+# This branch tests 1.10; checkout directory names are not version metadata.
+LINE = "110"
def snapshot(position, block, data=None):
@@ -63,7 +66,7 @@ def at(x):
if case_id == audit.COMPARATOR:
before, after = [], []
for i, stock in enumerate((0, 1, 32, 64)):
- tile = snapshot(at(3 + 6 * i), "steamadvantage:steam_crusher",
+ tile = snapshot(at(3 + 6 * i), audit.steam_block("steam_crusher", LINE),
data("minecraft:stone", stock, 0, work=0))
before.append(tile); after.append(deepcopy(tile))
row["count/" + str(3 + 6 * i) + "/4/8/minecraft:stone"] = stock
@@ -72,14 +75,14 @@ def at(x):
crusher = case_id in audit.CRUSHERS
signal, initial = audit.CRUSHERS[case_id] if crusher else (audit.FURNACES[case_id], 40)
if crusher:
- block, item, slot = "steamadvantage:steam_crusher", "minecraft:stone", 0
+ block, item, slot = audit.steam_block("steam_crusher", LINE), "minecraft:stone", 0
work = 105 if signal or initial == 0 else 107
reserve = 0 if initial == 0 else 39.9375 if signal else 38.4375
before_data = data(item, 1, slot, initial, work=106)
after_data = data(item, 1, slot, reserve, work=work)
row["firstLoaded.progress"] = work
else:
- block, item, slot = "steamadvantage:steam_furnace", "minecraft:sand", 1
+ block, item, slot = audit.steam_block("steam_furnace", LINE), "minecraft:sand", 1
heat = 989.5 if signal else 1027.0
work = audit.f32(.25 + audit.f32(audit.f32(3.5e-6) * heat))
reserve = 40 if signal else 39.5
@@ -123,6 +126,33 @@ def change_tile(row, line, **changes):
class SteamControlAuditTests(unittest.TestCase):
+ def test_fixture_version_survives_a_differently_named_checkout(self):
+ with tempfile.TemporaryDirectory(prefix="advantage-checkout-") as temporary:
+ relocated = Path(temporary) / "A Different Repository Name" / "test_steam_control_audit.py"
+ relocated.parent.mkdir()
+ shutil.copyfile(__file__, relocated)
+ spec = importlib.util.spec_from_file_location("relocated_steam_contract", relocated)
+ module = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(module)
+ self.assertEqual("110", module.LINE)
+
+ def test_namespace_is_exact_and_version_specific(self):
+ self.assertEqual("basesteam:steam_crusher", audit.steam_block("steam_crusher", "110"))
+ self.assertEqual("steamadvantage:steam_crusher", audit.steam_block("steam_crusher", "112"))
+
+ def test_old_owner_is_not_accepted_as_a_renamed_native_machine(self):
+ if LINE != "110":
+ self.skipTest("Only the 1.10 target has been renamed")
+ bundle = fixture()
+ for group, keys in (("operation", ("before", "after")), ("fixture", ("positions",)),
+ ("cold", ("positions",))):
+ for row in bundle[group]["cases"]:
+ for key in keys:
+ for state in row[key]:
+ for field in ("block", "state"):
+ state[field] = state[field].replace("basesteam:", "steamadvantage:")
+ self.verify(bundle)
+
def verify(self, bundle, status="FAIL"):
result = audit.audit_documents(**bundle, line=LINE)
self.assertEqual(status, result["status"], result)
diff --git a/test-rig/migration/test_survival110_plan.py b/test-rig/migration/test_survival110_plan.py
new file mode 100644
index 0000000..3da04a3
--- /dev/null
+++ b/test-rig/migration/test_survival110_plan.py
@@ -0,0 +1,120 @@
+"""Planner/receipt negative controls. These tests do not claim gameplay proof."""
+from copy import deepcopy
+import unittest
+from survival110_plan import Planner, Unobtainable
+from native110_survival_progression import validate_replay
+
+
+def recipe(output, inputs, providers=None, count=1):
+ return dict(id="craft/0",status="PASS",output=output,inputs=inputs,
+ providers=providers or [[x] for x in inputs],count=count,width=3)
+
+
+def doc(rows=()):
+ return dict(crafting=list(rows),smelting=[],crushing=[],economy=dict(trades=[],toolDurability={}))
+
+
+class FinitePlannerTests(unittest.TestCase):
+ def test_selects_obtainable_alternative_not_first_registry_entry(self):
+ p=Planner(doc([recipe("gear",["diamond_rod"],[["diamond_rod","iron_rod"]])]),{"iron_rod":1})
+ p.ensure("gear")
+ self.assertEqual(["iron_rod"],p.actions[0]["inputs"])
+ self.assertEqual(0,p.stock["iron_rod"])
+
+ def test_duplicate_ingredient_requires_real_quantity(self):
+ p=Planner(doc([recipe("gear",["iron","iron"])]),{"iron":1})
+ with self.assertRaises(Unobtainable):p.ensure("gear")
+ self.assertEqual(1,p.stock["iron"])
+ self.assertEqual([],p.actions)
+
+ def test_cycles_do_not_create_starting_components(self):
+ p=Planner(doc([recipe("gear",["chip"]),recipe("chip",["gear"])]),{})
+ with self.assertRaises(Unobtainable):p.ensure("gear")
+ self.assertEqual([],p.actions)
+
+ def test_failed_provider_rolls_back_partial_prerequisites(self):
+ p=Planner(doc([recipe("gear",["a","missing"]),recipe("gear",["b"])]),{"a":1,"b":1})
+ p.ensure("gear")
+ self.assertEqual(1,p.stock["a"])
+ self.assertEqual(0,p.stock["b"])
+ self.assertEqual(1,len(p.actions))
+
+ def test_water_bucket_is_not_free_and_returns_empty_bucket(self):
+ d=doc([recipe("battery",["minecraft:water_bucket@0"])])
+ p=Planner(d,{"minecraft:bucket@0":1})
+ p.ensure("battery")
+ self.assertEqual(["water","craft"],[a["kind"] for a in p.actions])
+ self.assertEqual(1,p.stock["minecraft:bucket@0"])
+ self.assertEqual(0,p.stock["minecraft:water_bucket@0"])
+ with self.assertRaises(Unobtainable):Planner(d,{}).ensure("battery")
+
+ def test_smelting_requires_furnace_and_fuel(self):
+ d=doc();d["smelting"]=[dict(input="ore",output="ingot",count=1)]
+ for budget in ({"ore":1},{"ore":1,"minecraft:furnace@0":1}):
+ with self.assertRaises(Unobtainable):Planner(d,budget).ensure("ingot")
+ p=Planner(d,{"ore":1,"minecraft:furnace@0":1,"minecraft:coal@0":1});p.ensure("ingot")
+ self.assertEqual(0,p.stock["minecraft:coal@0"])
+
+ def test_trade_requires_money_and_does_not_assume_restock(self):
+ d=doc();d["economy"]["trades"]=[dict(id="offer",input="emerald",price=2,output="gear",count=1,maxUses=1)]
+ with self.assertRaises(Unobtainable):Planner(d,{"emerald":1},True).ensure("gear")
+ p=Planner(d,{"emerald":4},True);p.ensure("gear")
+ with self.assertRaises(Unobtainable):p.ensure("gear",2)
+ self.assertEqual(2,p.stock["emerald"])
+ with self.assertRaises(Unobtainable):Planner(d,{"emerald":4}).ensure("gear")
+
+ def test_missing_currency_and_zero_price_are_not_free_intermediates(self):
+ for row in (dict(id="bad",price=0,output="gear",count=1,maxUses=7),
+ dict(id="bad",input="emerald",price=0,output="gear",count=1,maxUses=7)):
+ d=doc();d["economy"]["trades"]=[row];p=Planner(d,{"emerald":4},True)
+ with self.assertRaises(Unobtainable):p.ensure("gear")
+ self.assertEqual(1,len(p.uncredited_trades))
+
+ def test_no_diamond_rod_can_be_credited_from_an_unreplayed_provider_list(self):
+ p=Planner(doc([recipe("gear",["diamond_rod"],[["diamond_rod","iron_rod"]])]),{"iron_rod":1})
+ p.ensure("gear")
+ self.assertEqual(0,p.stock["diamond_rod"])
+ self.assertNotIn("diamond_rod",p.actions[0]["inputs"])
+
+ def test_machine_recipe_cannot_consume_the_only_workbench(self):
+ d=doc([recipe("minecraft:crafting_table@0",["wood"]),recipe("machine",["minecraft:crafting_table@0"])])
+ p=Planner(d,{"wood":2,"minecraft:crafting_table@0":1})
+ p.ensure("machine")
+ self.assertEqual(1,p.stock["minecraft:crafting_table@0"])
+ self.assertEqual(1,p.stock["wood"])
+
+
+class ReceiptTests(unittest.TestCase):
+ def fixture(self):
+ action=dict(kind="craft",output="gear",count=1,inputs=["iron"],width=1,recipe="craft/0")
+ p=dict(initial={"iron":1},actions=[action],expectedStock={"gear":1})
+ row=dict(index=0,kind="craft",status="PASS",output="gear",before={"iron":1},after={"gear":1},
+ selectedInputs=["iron"],nativeConsumption="SlotCrafting",negativeControlsRejected=2,returnedEmptyBuckets=0)
+ first=dict(actions=[row],stock={"gear":1},stockTyped=["exact-nbt-test-fixture"])
+ continued=dict(actions=[],craftedStock={"gear":1},resumedStock={"gear":1},resumedStockTyped=["exact-nbt-test-fixture"])
+ return p,first,continued
+
+ def test_valid_accounting(self):validate_replay(*self.fixture())
+
+ def test_rejects_faked_receipts(self):
+ for field,value in (("index",1),("nativeConsumption","LOOKUP_ONLY"),("negativeControlsRejected",0),
+ ("after",{"gear":2}),("before",{"iron":9}),("selectedInputs",["diamond_rod"]),
+ ("returnedEmptyBuckets",1),("output","chip")):
+ p,first,continued=self.fixture();first["actions"][0][field]=value
+ with self.subTest(field=field),self.assertRaises(AssertionError):validate_replay(p,first,continued)
+
+ def test_missing_or_duplicate_step_fails(self):
+ for rows in ([],[0,0]):
+ p,first,continued=self.fixture();first["actions"]=[deepcopy(first["actions"][i]) for i in rows]
+ with self.assertRaises(AssertionError):validate_replay(p,first,continued)
+
+ def test_restart_may_not_reseed_inventory(self):
+ p,first,continued=self.fixture();continued["resumedStock"]={"gear":1,"iron":99}
+ with self.assertRaisesRegex(AssertionError,"reset"):validate_replay(p,first,continued)
+
+ def test_tool_damage_reset_fails_even_if_every_item_count_is_unchanged(self):
+ p,first,continued=self.fixture();continued["resumedStockTyped"]=["same-tool-reset-damage"]
+ with self.assertRaisesRegex(AssertionError,"Typed"):validate_replay(p,first,continued)
+
+
+if __name__=="__main__":unittest.main()
diff --git a/test-rig/profiles/dev-core-apocalyptic.json b/test-rig/profiles/dev-core-apocalyptic.json
index 2826bcb..46bca65 100644
--- a/test-rig/profiles/dev-core-apocalyptic.json
+++ b/test-rig/profiles/dev-core-apocalyptic.json
@@ -7,30 +7,34 @@
"shutdownTimeoutSeconds": 60,
"stationRunSeconds": 5,
"recipeMode": "APOCALYPTIC",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"lifecycleStations": [],
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020-deobf.jar",
- "path": "build/libs-dev/AdvantageWorksTestHarness-1.0.0.110020-deobf.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021-deobf.jar",
+ "path": "build/gradle/libs-dev/AdvantageWorksTestHarness-1.1.0.110021-deobf.jar",
+ "workspaceProduced": true,
+ "sha256": "FE1F72756FA4A16BFAD5CD21C28EC85C2F8FCF25A29EDC5A9908914B6F8559D2"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021-deobf.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/SteamAdvantage-2.2.5.110021-deobf.jar",
- "sha256": "B5247840473DE939234D83B61612B42B2398D79036101CD17ADA5AEA08B8A63F"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021-deobf.jar",
+ "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/baseSteam-2.2.6.110021-deobf.jar",
+ "workspaceProduced": true,
+ "sha256": "17563247BECAA47E7191EC8FDCC1BF8EB493BC83312C2CD2BF2DA52332D6DC55"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021-deobf.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/ElectricAdvantage-2.2.5.110021-deobf.jar",
- "sha256": "2E1ED596049D891C3A41ECC9DFE8979E39DED56651B8DE6DB2A9A4709F5A1AF9"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021-deobf.jar",
+ "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/baseElectric-2.2.6.110021-deobf.jar",
+ "workspaceProduced": true,
+ "sha256": "BBB2620D71A52B1EF11E509F77D52E1A733FB7A8F5883646331AF4D5E1A2708F"
}
- ]
+ ],
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/profiles/dev-core-tech-progression.json b/test-rig/profiles/dev-core-tech-progression.json
index 86b202d..1a21e83 100644
--- a/test-rig/profiles/dev-core-tech-progression.json
+++ b/test-rig/profiles/dev-core-tech-progression.json
@@ -7,30 +7,34 @@
"shutdownTimeoutSeconds": 60,
"stationRunSeconds": 5,
"recipeMode": "TECH_PROGRESSION",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"lifecycleStations": [],
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020-deobf.jar",
- "path": "build/libs-dev/AdvantageWorksTestHarness-1.0.0.110020-deobf.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021-deobf.jar",
+ "path": "build/gradle/libs-dev/AdvantageWorksTestHarness-1.1.0.110021-deobf.jar",
+ "workspaceProduced": true,
+ "sha256": "FE1F72756FA4A16BFAD5CD21C28EC85C2F8FCF25A29EDC5A9908914B6F8559D2"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021-deobf.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/SteamAdvantage-2.2.5.110021-deobf.jar",
- "sha256": "B5247840473DE939234D83B61612B42B2398D79036101CD17ADA5AEA08B8A63F"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021-deobf.jar",
+ "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/baseSteam-2.2.6.110021-deobf.jar",
+ "workspaceProduced": true,
+ "sha256": "17563247BECAA47E7191EC8FDCC1BF8EB493BC83312C2CD2BF2DA52332D6DC55"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021-deobf.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/ElectricAdvantage-2.2.5.110021-deobf.jar",
- "sha256": "2E1ED596049D891C3A41ECC9DFE8979E39DED56651B8DE6DB2A9A4709F5A1AF9"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021-deobf.jar",
+ "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/baseElectric-2.2.6.110021-deobf.jar",
+ "workspaceProduced": true,
+ "sha256": "BBB2620D71A52B1EF11E509F77D52E1A733FB7A8F5883646331AF4D5E1A2708F"
}
- ]
+ ],
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/profiles/dev-core.json b/test-rig/profiles/dev-core.json
index c218a50..4c3a0dd 100644
--- a/test-rig/profiles/dev-core.json
+++ b/test-rig/profiles/dev-core.json
@@ -7,29 +7,33 @@
"shutdownTimeoutSeconds": 60,
"stationRunSeconds": 5,
"recipeMode": "NORMAL",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020-deobf.jar",
- "path": "build/libs-dev/AdvantageWorksTestHarness-1.0.0.110020-deobf.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021-deobf.jar",
+ "path": "build/gradle/libs-dev/AdvantageWorksTestHarness-1.1.0.110021-deobf.jar",
+ "workspaceProduced": true,
+ "sha256": "FE1F72756FA4A16BFAD5CD21C28EC85C2F8FCF25A29EDC5A9908914B6F8559D2"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021-deobf.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/SteamAdvantage-2.2.5.110021-deobf.jar",
- "sha256": "B5247840473DE939234D83B61612B42B2398D79036101CD17ADA5AEA08B8A63F"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021-deobf.jar",
+ "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/baseSteam-2.2.6.110021-deobf.jar",
+ "workspaceProduced": true,
+ "sha256": "17563247BECAA47E7191EC8FDCC1BF8EB493BC83312C2CD2BF2DA52332D6DC55"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021-deobf.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/ElectricAdvantage-2.2.5.110021-deobf.jar",
- "sha256": "2E1ED596049D891C3A41ECC9DFE8979E39DED56651B8DE6DB2A9A4709F5A1AF9"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021-deobf.jar",
+ "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/baseElectric-2.2.6.110021-deobf.jar",
+ "workspaceProduced": true,
+ "sha256": "BBB2620D71A52B1EF11E509F77D52E1A733FB7A8F5883646331AF4D5E1A2708F"
}
- ]
+ ],
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/profiles/packaged-current.json b/test-rig/profiles/packaged-current.json
index ec883de..00ee15c 100644
--- a/test-rig/profiles/packaged-current.json
+++ b/test-rig/profiles/packaged-current.json
@@ -7,8 +7,8 @@
"shutdownTimeoutSeconds": 60,
"stationRunSeconds": 5,
"recipeMode": "NORMAL",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"forge": {
"version": "1.10.2-12.18.3.2511",
"installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar",
@@ -18,46 +18,51 @@
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020.jar",
- "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525"
},
{
- "id": "poweradvantage",
- "version": "2.4.3.110021",
- "file": "PowerAdvantage-2.4.3.110021.jar",
- "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar",
- "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56"
+ "id": "basepower",
+ "version": "2.4.4.110021",
+ "file": "basePower-2.4.4.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar",
- "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar",
- "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1"
},
{
"id": "basemetals",
"version": "2.5.0-beta4",
"file": "BaseMetals-1.10.2-2.5.0-beta4.238.jar",
- "path": "${env:ADVANTAGE_WORKS_CURRENT_MODS}/BaseMetals-1.10.2-2.5.0-beta4.238.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/51F04770C316E62D9ED3EF713144F02FA2EC899645813627091365E12F61C3EF/BaseMetals-1.10.2-2.5.0-beta4.238.jar",
"sha256": "51F04770C316E62D9ED3EF713144F02FA2EC899645813627091365E12F61C3EF"
},
{
"id": "orespawn",
"version": "4.0.8.110021",
"file": "OreSpawn-4.0.8.110021.jar",
- "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar",
"sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21",
"workspaceProduced": true
}
- ]
+ ],
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/profiles/packaged-decoupled.json b/test-rig/profiles/packaged-decoupled.json
index a8686d0..65b9e6b 100644
--- a/test-rig/profiles/packaged-decoupled.json
+++ b/test-rig/profiles/packaged-decoupled.json
@@ -7,8 +7,8 @@
"shutdownTimeoutSeconds": 60,
"stationRunSeconds": 5,
"recipeMode": "NORMAL",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"forge": {
"version": "1.10.2-12.18.3.2511",
"installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar",
@@ -18,39 +18,44 @@
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020.jar",
- "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525"
},
{
- "id": "poweradvantage",
- "version": "2.4.3.110021",
- "file": "PowerAdvantage-2.4.3.110021.jar",
- "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar",
- "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56"
+ "id": "basepower",
+ "version": "2.4.4.110021",
+ "file": "basePower-2.4.4.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar",
- "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar",
- "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1"
},
{
"id": "orespawn",
"version": "4.0.8.110021",
"file": "OreSpawn-4.0.8.110021.jar",
- "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar",
"sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21",
"workspaceProduced": true
}
- ]
+ ],
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/profiles/packaged-legacy.json b/test-rig/profiles/packaged-legacy.json
index 4515c11..d62255e 100644
--- a/test-rig/profiles/packaged-legacy.json
+++ b/test-rig/profiles/packaged-legacy.json
@@ -7,8 +7,8 @@
"shutdownTimeoutSeconds": 60,
"stationRunSeconds": 5,
"recipeMode": "NORMAL",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"forge": {
"version": "1.10.2-12.18.3.2511",
"installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar",
@@ -18,46 +18,51 @@
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020.jar",
- "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525"
},
{
- "id": "poweradvantage",
- "version": "2.4.3.110021",
- "file": "PowerAdvantage-2.4.3.110021.jar",
- "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar",
- "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56"
+ "id": "basepower",
+ "version": "2.4.4.110021",
+ "file": "basePower-2.4.4.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar",
- "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar",
- "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1"
},
{
"id": "basemetals",
"version": "2.4.0.11",
"file": "BaseMetals_1.10.2-2.4.0.11.jar",
- "path": "../../../_deps/BaseMetals-v2.4.0/build/libs/BaseMetals_1.10.2-2.4.0.11.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c-base24/artifacts/A225D3E24CD37C377A9D843861FC13BDDB0B88F799D3D3AEDBC8B1DC636BB5E5/BaseMetals_1.10.2-2.4.0.11.jar",
"sha256": "A225D3E24CD37C377A9D843861FC13BDDB0B88F799D3D3AEDBC8B1DC636BB5E5"
},
{
"id": "orespawn",
"version": "4.0.8.110021",
"file": "OreSpawn-4.0.8.110021.jar",
- "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar",
"sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21",
"workspaceProduced": true
}
- ]
+ ],
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/profiles/packaged-mineralogy.json b/test-rig/profiles/packaged-mineralogy.json
index c05074d..0a001db 100644
--- a/test-rig/profiles/packaged-mineralogy.json
+++ b/test-rig/profiles/packaged-mineralogy.json
@@ -7,8 +7,8 @@
"shutdownTimeoutSeconds": 60,
"stationRunSeconds": 5,
"recipeMode": "NORMAL",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"forge": {
"version": "1.10.2-12.18.3.2511",
"installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar",
@@ -18,37 +18,41 @@
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020.jar",
- "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525"
},
{
- "id": "poweradvantage",
- "version": "2.4.3.110021",
- "file": "PowerAdvantage-2.4.3.110021.jar",
- "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar",
- "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56"
+ "id": "basepower",
+ "version": "2.4.4.110021",
+ "file": "basePower-2.4.4.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar",
- "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar",
- "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1"
},
{
"id": "orespawn",
"version": "4.0.8.110021",
"file": "OreSpawn-4.0.8.110021.jar",
- "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar",
"sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21",
"workspaceProduced": true
},
@@ -60,5 +64,9 @@
"sha256": "48841ABD9517127D1F0D17960AAD86FEFB251D340B006872ACECADD01A4B43F9"
}
],
- "lifecycleStations": ["W-03", "S-01"]
+ "lifecycleStations": [
+ "W-03",
+ "S-01"
+ ],
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/profiles/packaged-optional-power.json b/test-rig/profiles/packaged-optional-power.json
index 3523a7e..d111626 100644
--- a/test-rig/profiles/packaged-optional-power.json
+++ b/test-rig/profiles/packaged-optional-power.json
@@ -7,8 +7,8 @@
"shutdownTimeoutSeconds": 60,
"stationRunSeconds": 5,
"recipeMode": "NORMAL",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"forge": {
"version": "1.10.2-12.18.3.2511",
"installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar",
@@ -18,31 +18,35 @@
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020.jar",
- "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525"
},
{
- "id": "poweradvantage",
- "version": "2.4.3.110021",
- "file": "PowerAdvantage-2.4.3.110021.jar",
- "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar",
- "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56"
+ "id": "basepower",
+ "version": "2.4.4.110021",
+ "file": "basePower-2.4.4.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar",
- "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar",
- "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1"
},
{
"id": "rf-api",
@@ -63,9 +67,10 @@
"id": "orespawn",
"version": "4.0.8.110021",
"file": "OreSpawn-4.0.8.110021.jar",
- "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar",
"sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21",
"workspaceProduced": true
}
- ]
+ ],
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/profiles/worldgen-advantage.json b/test-rig/profiles/worldgen-advantage.json
index 9b39614..fad4e3d 100644
--- a/test-rig/profiles/worldgen-advantage.json
+++ b/test-rig/profiles/worldgen-advantage.json
@@ -5,8 +5,8 @@
"startupTimeoutSeconds": 180,
"stationRunSeconds": 5,
"recipeMode": "NORMAL",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"forge": {
"version": "1.10.2-12.18.3.2511",
"installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar",
@@ -16,37 +16,41 @@
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020.jar",
- "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525"
},
{
- "id": "poweradvantage",
- "version": "2.4.3.110021",
- "file": "PowerAdvantage-2.4.3.110021.jar",
- "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar",
- "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56"
+ "id": "basepower",
+ "version": "2.4.4.110021",
+ "file": "basePower-2.4.4.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar",
- "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar",
- "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1"
},
{
"id": "orespawn",
"version": "4.0.8.110021",
"file": "OreSpawn-4.0.8.110021.jar",
- "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar",
"sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21",
"workspaceProduced": true
}
@@ -64,7 +68,7 @@
{
"id": "desert-oil-visible",
"section": "fluid_deposits",
- "entry": "poweradvantage:fluid_deposit/desert_crude_oil",
+ "entry": "basepower:fluid_deposit/desert_crude_oil",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -72,15 +76,15 @@
{
"id": "desert-oil-owner",
"section": "fluid_deposits",
- "entry": "poweradvantage:fluid_deposit/desert_crude_oil",
+ "entry": "basepower:fluid_deposit/desert_crude_oil",
"present": true,
"field": "source_provider",
- "expectedString": "poweradvantage"
+ "expectedString": "basepower"
},
{
"id": "electric-sulfur-default",
"section": "ores",
- "entry": "electricadvantage:ore/sulfur",
+ "entry": "baseelectric:ore/sulfur",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -88,7 +92,7 @@
{
"id": "electric-lithium-default",
"section": "ores",
- "entry": "electricadvantage:ore/lithium",
+ "entry": "baseelectric:ore/lithium",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -97,13 +101,13 @@
"profileMutations": [
{
"section": "fluid_deposits",
- "entry": "poweradvantage:fluid_deposit/desert_crude_oil",
+ "entry": "basepower:fluid_deposit/desert_crude_oil",
"field": "enabled",
"booleanValue": false
},
{
"section": "ores",
- "entry": "electricadvantage:ore/sulfur",
+ "entry": "baseelectric:ore/sulfur",
"field": "enabled",
"booleanValue": false
}
@@ -112,7 +116,7 @@
{
"id": "desert-oil-user-disable-persists",
"section": "fluid_deposits",
- "entry": "poweradvantage:fluid_deposit/desert_crude_oil",
+ "entry": "basepower:fluid_deposit/desert_crude_oil",
"present": true,
"field": "enabled",
"expectedBoolean": false
@@ -120,7 +124,7 @@
{
"id": "electric-sulfur-user-disable-persists",
"section": "ores",
- "entry": "electricadvantage:ore/sulfur",
+ "entry": "baseelectric:ore/sulfur",
"present": true,
"field": "enabled",
"expectedBoolean": false
@@ -128,7 +132,7 @@
{
"id": "electric-lithium-remains-enabled",
"section": "ores",
- "entry": "electricadvantage:ore/lithium",
+ "entry": "baseelectric:ore/lithium",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -136,14 +140,15 @@
],
"worldgenExpectations": {
"minimumCounts": {
- "poweradvantage:crude_oil": 1,
- "electricadvantage:li_ore": 1,
- "electricadvantage:sulfur_ore": 1
+ "basepower:crude_oil": 1,
+ "baseelectric:li_ore": 1,
+ "baseelectric:sulfur_ore": 1
},
"maximumCounts": {
"mineralogy:crude_oil": 0,
"mineralogy:sulfur_ore": 0
},
"zeroBiomeViolations": true
- }
+ },
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/profiles/worldgen-legacy-import.json b/test-rig/profiles/worldgen-legacy-import.json
index 6eb7cd6..82f61c0 100644
--- a/test-rig/profiles/worldgen-legacy-import.json
+++ b/test-rig/profiles/worldgen-legacy-import.json
@@ -5,8 +5,8 @@
"startupTimeoutSeconds": 180,
"stationRunSeconds": 5,
"recipeMode": "NORMAL",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"forge": {
"version": "1.10.2-12.18.3.2511",
"installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar",
@@ -16,37 +16,41 @@
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020.jar",
- "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525"
},
{
- "id": "poweradvantage",
- "version": "2.4.3.110021",
- "file": "PowerAdvantage-2.4.3.110021.jar",
- "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar",
- "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56"
+ "id": "basepower",
+ "version": "2.4.4.110021",
+ "file": "basePower-2.4.4.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar",
- "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar",
- "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1"
},
{
"id": "orespawn",
"version": "4.0.8.110021",
"file": "OreSpawn-4.0.8.110021.jar",
- "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar",
"sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21",
"workspaceProduced": true
}
@@ -58,7 +62,9 @@
"generatorSettings": "",
"buildWorks": false,
"worldgenSampleRadius": 8,
- "stableWorldgenCountExclusions": ["poweradvantage:crude_oil"],
+ "stableWorldgenCountExclusions": [
+ "basepower:crude_oil"
+ ],
"shutdownTimeoutSeconds": 300,
"lifecycleStations": [],
"configFixtures": [
@@ -75,7 +81,7 @@
{
"id": "legacy-oil-retained",
"section": "ores",
- "entry": "poweradvantage:legacy/poweradvantage_crude_oil_0",
+ "entry": "basepower:legacy/basepower_crude_oil_0",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -83,7 +89,7 @@
{
"id": "legacy-lithium-retained",
"section": "ores",
- "entry": "electricadvantage:legacy/electricadvantage_li_ore_0",
+ "entry": "baseelectric:legacy/baseelectric_li_ore_0",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -91,7 +97,7 @@
{
"id": "legacy-sulfur-retained",
"section": "ores",
- "entry": "electricadvantage:legacy/electricadvantage_sulfur_ore_1",
+ "entry": "baseelectric:legacy/baseelectric_sulfur_ore_1",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -99,19 +105,19 @@
{
"id": "modern-oil-not-duplicated",
"section": "fluid_deposits",
- "entry": "poweradvantage:fluid_deposit/desert_crude_oil",
+ "entry": "basepower:fluid_deposit/desert_crude_oil",
"present": false
},
{
"id": "modern-lithium-not-duplicated",
"section": "ores",
- "entry": "electricadvantage:ore/lithium",
+ "entry": "baseelectric:ore/lithium",
"present": false
},
{
"id": "modern-sulfur-not-duplicated",
"section": "ores",
- "entry": "electricadvantage:ore/sulfur",
+ "entry": "baseelectric:ore/sulfur",
"present": false
}
],
@@ -119,7 +125,7 @@
{
"id": "legacy-oil-retained",
"section": "ores",
- "entry": "poweradvantage:legacy/poweradvantage_crude_oil_0",
+ "entry": "basepower:legacy/basepower_crude_oil_0",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -127,7 +133,7 @@
{
"id": "legacy-lithium-retained",
"section": "ores",
- "entry": "electricadvantage:legacy/electricadvantage_li_ore_0",
+ "entry": "baseelectric:legacy/baseelectric_li_ore_0",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -135,7 +141,7 @@
{
"id": "legacy-sulfur-retained",
"section": "ores",
- "entry": "electricadvantage:legacy/electricadvantage_sulfur_ore_1",
+ "entry": "baseelectric:legacy/baseelectric_sulfur_ore_1",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -143,19 +149,19 @@
{
"id": "modern-oil-not-duplicated",
"section": "fluid_deposits",
- "entry": "poweradvantage:fluid_deposit/desert_crude_oil",
+ "entry": "basepower:fluid_deposit/desert_crude_oil",
"present": false
},
{
"id": "modern-lithium-not-duplicated",
"section": "ores",
- "entry": "electricadvantage:ore/lithium",
+ "entry": "baseelectric:ore/lithium",
"present": false
},
{
"id": "modern-sulfur-not-duplicated",
"section": "ores",
- "entry": "electricadvantage:ore/sulfur",
+ "entry": "baseelectric:ore/sulfur",
"present": false
}
],
@@ -168,14 +174,14 @@
},
{
"id": "power-provider",
- "path": "config/poweradvantage-orespawn.json",
- "contains": "poweradvantage:legacy/poweradvantage_crude_oil_0",
+ "path": "config/basepower-orespawn.json",
+ "contains": "basepower:legacy/basepower_crude_oil_0",
"minimumOccurrences": 1
},
{
"id": "electric-provider",
- "path": "config/electricadvantage-orespawn.json",
- "contains": "electricadvantage:legacy/electricadvantage_li_ore_0",
+ "path": "config/baseelectric-orespawn.json",
+ "contains": "baseelectric:legacy/baseelectric_li_ore_0",
"minimumOccurrences": 1
}
],
@@ -188,27 +194,28 @@
},
{
"id": "power-provider",
- "path": "config/poweradvantage-orespawn.json",
- "contains": "poweradvantage:legacy/poweradvantage_crude_oil_0",
+ "path": "config/basepower-orespawn.json",
+ "contains": "basepower:legacy/basepower_crude_oil_0",
"minimumOccurrences": 1
},
{
"id": "electric-provider",
- "path": "config/electricadvantage-orespawn.json",
- "contains": "electricadvantage:legacy/electricadvantage_li_ore_0",
+ "path": "config/baseelectric-orespawn.json",
+ "contains": "baseelectric:legacy/baseelectric_li_ore_0",
"minimumOccurrences": 1
}
],
"worldgenExpectations": {
"minimumCounts": {
- "poweradvantage:crude_oil": 1,
- "electricadvantage:li_ore": 1,
- "electricadvantage:sulfur_ore": 1
+ "basepower:crude_oil": 1,
+ "baseelectric:li_ore": 1,
+ "baseelectric:sulfur_ore": 1
},
"maximumCounts": {
"mineralogy:crude_oil": 0,
"mineralogy:sulfur_ore": 0
},
"zeroBiomeViolations": false
- }
+ },
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/profiles/worldgen-mineralogy.json b/test-rig/profiles/worldgen-mineralogy.json
index d249b3f..c0f2581 100644
--- a/test-rig/profiles/worldgen-mineralogy.json
+++ b/test-rig/profiles/worldgen-mineralogy.json
@@ -5,8 +5,8 @@
"startupTimeoutSeconds": 180,
"stationRunSeconds": 5,
"recipeMode": "NORMAL",
- "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994",
- "sourceVersion": "2.4.3.110021",
+ "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE",
+ "sourceVersion": "2.4.4.110021",
"forge": {
"version": "1.10.2-12.18.3.2511",
"installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar",
@@ -16,37 +16,41 @@
"mods": [
{
"id": "advantageworkstest",
- "version": "1.0.0.110020",
- "file": "AdvantageWorksTestHarness-1.0.0.110020.jar",
- "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar",
- "workspaceProduced": true
+ "version": "1.1.0.110021",
+ "file": "AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525"
},
{
- "id": "poweradvantage",
- "version": "2.4.3.110021",
- "file": "PowerAdvantage-2.4.3.110021.jar",
- "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar",
- "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56"
+ "id": "basepower",
+ "version": "2.4.4.110021",
+ "file": "basePower-2.4.4.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31"
},
{
- "id": "steamadvantage",
- "version": "2.2.5.110021",
- "file": "SteamAdvantage-2.2.5.110021.jar",
- "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar",
- "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E"
+ "id": "basesteam",
+ "version": "2.2.6.110021",
+ "file": "baseSteam-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D"
},
{
- "id": "electricadvantage",
- "version": "2.2.5.110021",
- "file": "ElectricAdvantage-2.2.5.110021.jar",
- "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar",
- "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5"
+ "id": "baseelectric",
+ "version": "2.2.6.110021",
+ "file": "baseElectric-2.2.6.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar",
+ "workspaceProduced": true,
+ "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1"
},
{
"id": "orespawn",
"version": "4.0.8.110021",
"file": "OreSpawn-4.0.8.110021.jar",
- "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar",
+ "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar",
"sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21",
"workspaceProduced": true
},
@@ -72,7 +76,7 @@
{
"id": "desert-oil-enabled",
"section": "fluid_deposits",
- "entry": "poweradvantage:fluid_deposit/desert_crude_oil",
+ "entry": "basepower:fluid_deposit/desert_crude_oil",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -96,7 +100,7 @@
{
"id": "electric-sulfur-disabled",
"section": "ores",
- "entry": "electricadvantage:ore/sulfur",
+ "entry": "baseelectric:ore/sulfur",
"present": true,
"field": "enabled",
"expectedBoolean": false
@@ -104,7 +108,7 @@
{
"id": "electric-lithium-fallback-enabled",
"section": "ores",
- "entry": "electricadvantage:ore/lithium",
+ "entry": "baseelectric:ore/lithium",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -113,7 +117,7 @@
"profileMutations": [
{
"section": "ores",
- "entry": "electricadvantage:ore/sulfur",
+ "entry": "baseelectric:ore/sulfur",
"field": "enabled",
"booleanValue": true
}
@@ -122,7 +126,7 @@
{
"id": "electric-sulfur-user-enable-persists",
"section": "ores",
- "entry": "electricadvantage:ore/sulfur",
+ "entry": "baseelectric:ore/sulfur",
"present": true,
"field": "enabled",
"expectedBoolean": true
@@ -146,14 +150,15 @@
],
"worldgenExpectations": {
"minimumCounts": {
- "poweradvantage:crude_oil": 1,
+ "basepower:crude_oil": 1,
"mineralogy:crude_oil": 1,
"mineralogy:sulfur_ore": 1,
- "electricadvantage:li_ore": 1
+ "baseelectric:li_ore": 1
},
"maximumCounts": {
- "electricadvantage:sulfur_ore": 0
+ "baseelectric:sulfur_ore": 0
},
"zeroBiomeViolations": true
- }
+ },
+ "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS"
}
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/AdvantageWorksMod.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/AdvantageWorksMod.java
index df20812..1161e94 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/AdvantageWorksMod.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/AdvantageWorksMod.java
@@ -24,6 +24,8 @@ public void preInit(FMLPreInitializationEvent event) {
net.minecraftforge.common.ForgeChunkManager.forceChunk(ticket, chunk);
});
MachineOperationalProbe.register();
+ NativePassiveMigrationProbe.register();
+ NativeSurvivalProgressionProbe.register();
}
@Mod.EventHandler
@@ -32,5 +34,7 @@ public void serverStarting(FMLServerStartingEvent event) {
MachineOperationalProbe.registerCommands(event);
NativeHarvestProbe.registerCommands(event);
NativeRecipeProgressionProbe.registerCommands(event);
+ NativePassiveMigrationProbe.registerCommands(event);
+ NativeSurvivalProgressionProbe.registerCommands(event);
}
}
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/BatteryOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/BatteryOperationalCases.java
index e54c620..072eb43 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/BatteryOperationalCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/BatteryOperationalCases.java
@@ -17,10 +17,10 @@ static void register(List cases) {
cases.add(new MachineScenario("electric/battery-chemistry-" + chemistry,
"Each battery chemistry supplies a real LED from finite item NBT, retaining its rated capacity and exact energy debit", 160,
c -> {
- c.block(7, 4, 8, "electricadvantage:electric_battery_array");
- c.put(7, 4, 8, 0, "electricadvantage:" + chemistry + "_battery", 1);
+ c.block(7, 4, 8, "baseelectric:electric_battery_array");
+ c.put(7, 4, 8, 0, "baseelectric:" + chemistry + "_battery", 1);
NativeStacks.tag(c.inventory(7, 4, 8).getStackInSlot(0)).setFloat("energy", 10);
- c.block(8, 4, 8, "electricadvantage:led_bar");
+ c.block(8, 4, 8, "baseelectric:led_bar");
}, c -> {
PoweredEntity array = (PoweredEntity)c.tile(7, 4, 8);
c.require(array.getEnergyCapacity(new ConduitType("electricity")) == capacity, "rated battery capacity retained");
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/BucketOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/BucketOperationalCases.java
index 1523d13..6a81459 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/BucketOperationalCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/BucketOperationalCases.java
@@ -96,10 +96,10 @@ private static UniversalBucket startup(MachineContext c) {
&& Item.REGISTRY.getObject(bucket.getRegistryName()) == bucket,
"Universal bucket is a real registered item, not merely an enabled flag");
c.record("bucket/item", bucket.getRegistryName().toString());
- for (String mod : new String[]{"basemetals", "steamadvantage", "electricadvantage", "orespawn"})
+ for (String mod : new String[]{"basemetals", "basesteam", "baseelectric", "orespawn"})
c.record("bucket/mod/" + mod, Loader.isModLoaded(mod));
if (Boolean.getBoolean("advworks.bucket.requireStandalone"))
- for (String mod : new String[]{"basemetals", "steamadvantage", "electricadvantage"})
+ for (String mod : new String[]{"basemetals", "basesteam", "baseelectric"})
c.require(!Loader.isModLoaded(mod), "Standalone bucket proof excludes " + mod);
return bucket;
}
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/CanonicalSteamEnchantments.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/CanonicalSteamEnchantments.java
new file mode 100644
index 0000000..84df207
--- /dev/null
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/CanonicalSteamEnchantments.java
@@ -0,0 +1,34 @@
+package zone.moddev.mc.advantageworks;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.util.ResourceLocation;
+
+/** These four released enchantment registry keys intentionally retain their old domain. */
+final class CanonicalSteamEnchantments {
+ private static final Set PATHS = new HashSet<>(Arrays.asList(
+ "rapid_reload", "powderless", "high_explosive", "recoil"));
+
+ static String canonicalId(String id) {
+ if (id.startsWith("basesteam:") && PATHS.contains(id.substring("basesteam:".length())))
+ throw new IllegalArgumentException("Retained canonical enchantment required, no new-domain fallback: " + id);
+ return id;
+ }
+
+ static Enchantment require(String id) {
+ ResourceLocation name = new ResourceLocation(canonicalId(id));
+ if ("steamadvantage".equals(name.getResourceDomain()))
+ for (String path : PATHS) resolve(new ResourceLocation("steamadvantage", path));
+ return resolve(name);
+ }
+
+ private static Enchantment resolve(ResourceLocation name) {
+ Enchantment enchantment = Enchantment.REGISTRY.getObject(name);
+ if (enchantment == null || !Enchantment.REGISTRY.containsKey(name)
+ || !name.equals(Enchantment.REGISTRY.getNameForObject(enchantment)))
+ throw new IllegalStateException("Missing or noncanonical native enchantment: " + name);
+ return enchantment;
+ }
+}
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/DrillOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/DrillOperationalCases.java
index d65669a..799c3e8 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/DrillOperationalCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/DrillOperationalCases.java
@@ -42,7 +42,7 @@ private static final class Witness {
private static void scenario(List cases, String district, EnumFacing facing, String mode) {
boolean steam = district.equals("steam");
boolean move = mode.equals("move"), noPower = mode.equals("no-power");
- String namespace = steam ? "steamadvantage" : "electricadvantage";
+ String namespace = steam ? "basesteam" : "baseelectric";
String drill = namespace + ":" + district + "_drill";
String track = namespace + ":" + district + "_track";
String conduit = namespace + (steam ? ":steam_pipe" : ":electric_conduit");
@@ -116,7 +116,7 @@ private static void scenario(List cases, String district, EnumF
BlockPos active = move ? destination : source;
requireBlock(c, source, move ? conduit : drill, "Source becomes the correct conduit only after a successful move");
requireBlock(c, destination, move ? drill : track, "Destination contains the moved drill, or the untouched single track in a control");
- requireBlock(c, front, move ? "poweradvantage:steel_frame" : "minecraft:bedrock",
+ requireBlock(c, front, move ? "basepower:steel_frame" : "minecraft:bedrock",
"The old bore mouth becomes one steel frame only on movement");
requireBlock(c, nextFront, "minecraft:bedrock", "Destination bedrock stop is never mined");
requireBlock(c, hold, "minecraft:redstone_block", "Destination hold remains physically present");
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricLifecycleOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricLifecycleOperationalCases.java
index 8a0c250..31b9aa2 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricLifecycleOperationalCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricLifecycleOperationalCases.java
@@ -12,7 +12,7 @@
/** Finite legacy jobs. Verification only reads the world; live phase actions need a core hook. */
public final class ElectricLifecycleOperationalCases {
- private static final String EA = "electricadvantage:";
+ private static final String EA = "baseelectric:";
private static final String ELECTRICITY = "electricity";
private static final PropertyBool LIT = PropertyBool.create("lit");
private static final PropertyBool ACTIVE = PropertyBool.create("active");
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricOperationalCases.java
index ad25f96..01fbded 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricOperationalCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricOperationalCases.java
@@ -25,7 +25,7 @@
/** Independent operating contracts. Only setup seeds inputs; all work uses world ticks. */
public final class ElectricOperationalCases {
- private static final String EA = "electricadvantage:";
+ private static final String EA = "baseelectric:";
private static final PropertyBool LED_LIT = PropertyBool.create("lit");
private static final String ELECTRICITY = "electricity";
private static final String GREENHOUSE = "greenhouse";
@@ -167,7 +167,7 @@ private static void refinery(List cases) {
int x = CELLS[i];
c.block(x, Y, Z, EA + "plastic_refinery");
if (i != 1) c.electricSupply(x - 1, Y, Z, 4000);
- if (i != 2) reserve(c, x, Y, Z, "getTank", "poweradvantage:refined_oil", i == 4 ? 99 : 200);
+ if (i != 2) reserve(c, x, Y, Z, "getTank", "basepower:refined_oil", i == 4 ? 99 : 200);
}
rejectFluid(c, CELLS[2], "minecraft:water", 200);
c.put(CELLS[3], Y, Z, 0, EA + "petrolplastic_ingot", 64);
@@ -191,15 +191,15 @@ private static void still(List cases) {
int x = CELLS[i];
c.block(x, Y, Z, EA + "electric_still");
if (i != 1) c.electricSupply(x - 1, Y, Z, 1000);
- if (i != 2) reserve(c, x, Y, Z, "getInputTank", "poweradvantage:crude_oil", i == 4 ? 1 : 40);
+ if (i != 2) reserve(c, x, Y, Z, "getInputTank", "basepower:crude_oil", i == 4 ? 1 : 40);
}
rejectFluid(c, CELLS[2], "minecraft:water", 40);
- reserve(c, CELLS[3], Y, Z, "getOutputTank", "poweradvantage:refined_oil", 1000);
+ reserve(c, CELLS[3], Y, Z, "getOutputTank", "basepower:refined_oil", 1000);
equal(c, "setup.fullOutput", tankAmount(c, CELLS[3], 1), 1000);
}, c -> {
equal(c, "positive.input", tankAmount(c, CELLS[0], 0), 0);
equal(c, "positive.output", tankAmount(c, CELLS[0], 1), 20);
- fluidIs(c, CELLS[0], 1, "poweradvantage:refined_oil");
+ fluidIs(c, CELLS[0], 1, "basepower:refined_oil");
close(c, "positive.energyDebit", 1000 - pairEnergy(c, CELLS[0]), 320, 0.01f);
for (int i = 1; i < CELLS.length; i++) {
equal(c, "negative" + i + ".input", tankAmount(c, CELLS[i], 0), i == 2 ? 0 : i == 4 ? 1 : 40);
@@ -212,7 +212,7 @@ private static void still(List cases) {
+ "mutation. The 48 finite mB then operate on natural ticks, making 24 mB refined oil for 384 electricity.", 80, c -> {
c.block(8, Y, Z, EA + "electric_still");
c.electricSupply(7, Y, Z, 1000);
- Fluid oil = NativeFluids.get("poweradvantage:crude_oil");
+ Fluid oil = NativeFluids.get("basepower:crude_oil");
c.require(oil != null, "Crude oil exists for faced automation");
int stored = 0;
for (EnumFacing face : EnumFacing.values()) {
@@ -226,12 +226,12 @@ private static void still(List cases) {
}, c -> {
equal(c, "faced.input", tankAmount(c, 8, 0), 0);
equal(c, "faced.output", tankAmount(c, 8, 1), 24);
- fluidIs(c, 8, 1, "poweradvantage:refined_oil");
+ fluidIs(c, 8, 1, "basepower:refined_oil");
close(c, "faced.energyDebit", 1000 - pairEnergy(c, 8), 384, 0.01f);
for (EnumFacing face : EnumFacing.values()) {
FluidStack simulated = fluids(c, 8, face).drain(24, false);
equal(c, "face." + face + ".drainable", simulated == null ? 0 : simulated.amount, 24);
- c.require(simulated != null && simulated.getFluid() == NativeFluids.get("poweradvantage:refined_oil"),
+ c.require(simulated != null && simulated.getFluid() == NativeFluids.get("basepower:refined_oil"),
"Face offers the real refined product " + face);
equal(c, "face." + face + ".drainSimulationUnchanged", tankAmount(c, 8, 1), 24);
}
@@ -372,6 +372,11 @@ private static void led(List cases) {
}));
}
+ static boolean hydroturbineIdentity(String owner, String canonicalId, String registrationName) {
+ return "baseelectric".equals(owner) && "baseelectric.Hydroturbine".equals(canonicalId)
+ && "Hydroturbine".equals(registrationName);
+ }
+
private static void hydro(List cases) {
cases.add(new MachineScenario("electric/hydro-rate",
"A naturally spawned turbine in a contained horizontal water channel generates four electricity "
@@ -411,8 +416,8 @@ private static void hydro(List cases) {
for (Entity actor : c.world.getEntitiesWithinAABB(Entity.class,
new AxisAlignedBB(c.at(0, 0, 0), c.at(31, 31, 31)))) {
EntityRegistry.EntityRegistration registration = EntityRegistry.instance().lookupModSpawn(actor.getClass(), false);
- if (registration == null || !"electricadvantage".equals(registration.getContainer().getModId())
- || !"electricadvantage.Hydroturbine".equals(registration.getEntityName())) continue;
+ if (registration == null || !hydroturbineIdentity(registration.getContainer().getModId(),
+ net.minecraft.entity.EntityList.getEntityString(actor), registration.getEntityName())) continue;
turbines++;
c.record("hydro.motion/" + actor.getUniqueID(), new net.minecraft.util.math.Vec3d(actor.motionX, actor.motionY, actor.motionZ).toString());
c.require(new net.minecraft.util.math.Vec3d(actor.motionX, actor.motionY, actor.motionZ).lengthSquared() == 0,
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/LegacyPartialNetworkCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/LegacyPartialNetworkCases.java
index 84736f1..5252d36 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/LegacyPartialNetworkCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/LegacyPartialNetworkCases.java
@@ -41,23 +41,23 @@ private static void add(List cases, String type, String part) {
+ "while other endpoints remain loaded and unchanged. The same ticket restores the chunk; "
+ "event-time typed NBT and finite resources survive, and native processing resumes without rebuilding.",
TICKS, c -> {
- String pipe = type.equals("steam") ? "steamadvantage:steam_pipe"
- : type.equals("electric") ? "electricadvantage:electric_conduit" : "poweradvantage:fluid_pipe";
+ String pipe = type.equals("steam") ? "basesteam:steam_pipe"
+ : type.equals("electric") ? "baseelectric:electric_conduit" : "basepower:fluid_pipe";
if (type.equals("steam")) {
c.steamSupply(3, 4, 3, 6000);
- c.block(20, 4, 20, "steamadvantage:steam_crusher");
+ c.block(20, 4, 20, "basesteam:steam_crusher");
c.put(20, 4, 20, 0, "minecraft:stone", 8);
c.require(c.inventory(20, 4, 20).isItemValidForSlot(0, c.inventory(20, 4, 20).getStackInSlot(0)),
"Native stone crushing recipe is available");
} else if (type.equals("electric")) {
c.electricSupply(3, 4, 3, 6000);
NativeStacks.tag(c.inventory(3, 4, 3).getStackInSlot(0)).setString("PartialNetworkWitness", id);
- c.block(20, 4, 20, "electricadvantage:electric_oven");
+ c.block(20, 4, 20, "baseelectric:electric_oven");
c.put(20, 4, 20, 0, "minecraft:potato", 8);
} else {
- c.block(3, 4, 3, "poweradvantage:fluid_metal_tank");
+ c.block(3, 4, 3, "basepower:fluid_metal_tank");
c.tank(3, 4, 3, "minecraft:water", 6000);
- c.block(20, 4, 20, "steamadvantage:steam_boiler_coal");
+ c.block(20, 4, 20, "basesteam:steam_boiler_coal");
c.put(20, 4, 20, 0, "minecraft:coal", 1);
}
for (int x = 4; x <= 20; x++) c.block(x, 4, 3, pipe);
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/MachineContext.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/MachineContext.java
index 224147f..40f8e51 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/MachineContext.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/MachineContext.java
@@ -230,14 +230,14 @@ float energy(int x, int y, int z, String type) {
}
void steamSupply(int x, int y, int z, float reserve) {
- block(x, y, z, "steamadvantage:steam_tank");
+ block(x, y, z, "basesteam:steam_tank");
power(x, y, z, "steam", reserve);
}
void electricSupply(int x, int y, int z, float reserve) {
if (!Float.isFinite(reserve) || reserve < 0 || reserve > 8000) throw new IllegalArgumentException("Invalid battery reserve");
- block(x, y, z, "electricadvantage:electric_battery_array");
- put(x, y, z, 0, "electricadvantage:lithium_battery", 1);
+ block(x, y, z, "baseelectric:electric_battery_array");
+ put(x, y, z, 0, "baseelectric:lithium_battery", 1);
NativeStacks.tag(inventory(x, y, z).getStackInSlot(0)).setFloat("energy", reserve);
inventory(x, y, z).markDirty();
}
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeFluids.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeFluids.java
index 1248bec..f2eac7c 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeFluids.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeFluids.java
@@ -7,8 +7,8 @@ final class NativeFluids {
static Fluid get(String name) {
Fluid fluid = FluidRegistry.getFluid(name);
if (fluid == null && name.startsWith("minecraft:")) fluid = FluidRegistry.getFluid(name.substring(10));
- if (fluid == null && (name.equals("poweradvantage:crude_oil") || name.equals("poweradvantage:refined_oil")))
- fluid = FluidRegistry.getFluid(name.substring("poweradvantage:".length()));
+ if (fluid == null && (name.equals("basepower:crude_oil") || name.equals("basepower:refined_oil")))
+ fluid = FluidRegistry.getFluid(name.substring("basepower:".length()));
if (fluid == null) throw new IllegalArgumentException("Unregistered fixture fluid " + name);
return fluid;
}
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeHarvestProbe.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeHarvestProbe.java
index 9c21a0e..6ddafbb 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeHarvestProbe.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeHarvestProbe.java
@@ -200,7 +200,7 @@ private static void checkGeometry(WorldServer world, Block block, IBlockState st
boxEvidence.add(encoded);
}
row.add("collisionBoxes", boxEvidence);
- if (blockId.equals("electricadvantage:electric_conduit")) {
+ if (blockId.equals("baseelectric:electric_conduit")) {
expected.add(Arrays.toString(new double[]{.375, .375, .375, .625, .625, .625}));
if ((mask & 2) != 0) expected.add(Arrays.toString(new double[]{.375, .375, .375, .625, 1, .625}));
if ((mask & 1) != 0) expected.add(Arrays.toString(new double[]{.375, 0, .375, .625, .625, .625}));
@@ -249,11 +249,11 @@ private static void run(MinecraftServer server, WorldServer world, String label)
};
player.setPosition(POS.getX() + .5, POS.getY() + 1, POS.getZ() + .5);
JsonArray rows = new JsonArray();
- String sulfur = "electricadvantage:sulfur_ore", lithium = "electricadvantage:li_ore";
+ String sulfur = "baseelectric:sulfur_ore", lithium = "baseelectric:li_ore";
witness(world, player, rows, "sulfur/hand-fails", sulfur, 0, null, false, false, "", 0, 0, 1);
witness(world, player, rows, "sulfur/axe-fails", sulfur, 0, Items.IRON_AXE, false, false, "", 0, 0, 1);
- witness(world, player, rows, "sulfur/wood", sulfur, 0, Items.WOODEN_PICKAXE, false, true, "electricadvantage:sulfur_powder", 1, 4, 8);
- witness(world, player, rows, "sulfur/stone", sulfur, 0, Items.STONE_PICKAXE, false, true, "electricadvantage:sulfur_powder", 1, 4, 8);
+ witness(world, player, rows, "sulfur/wood", sulfur, 0, Items.WOODEN_PICKAXE, false, true, "baseelectric:sulfur_powder", 1, 4, 8);
+ witness(world, player, rows, "sulfur/stone", sulfur, 0, Items.STONE_PICKAXE, false, true, "baseelectric:sulfur_powder", 1, 4, 8);
witness(world, player, rows, "sulfur/silk", sulfur, 0, Items.WOODEN_PICKAXE, true, true, sulfur, 1, 1, 1);
witness(world, player, rows, "lithium/hand-fails", lithium, 1, null, false, false, "", 0, 0, 1);
witness(world, player, rows, "lithium/wood-fails", lithium, 1, Items.WOODEN_PICKAXE, false, false, "", 0, 0, 1);
@@ -262,19 +262,19 @@ private static void run(MinecraftServer server, WorldServer world, String label)
witness(world, player, rows, "lithium/stone", lithium, 1, Items.STONE_PICKAXE, false, true, lithium, 1, 1, 1);
witness(world, player, rows, "lithium/diamond", lithium, 1, Items.DIAMOND_PICKAXE, false, true, lithium, 1, 1, 1);
witness(world, player, rows, "lithium/silk", lithium, 1, Items.STONE_PICKAXE, true, true, lithium, 1, 1, 1);
- witness(world, player, rows, "frame/hand", "poweradvantage:steel_frame", -1, null, false, true, "poweradvantage:steel_frame", 1, 1, 1);
- witness(world, player, rows, "frame/silk", "poweradvantage:steel_frame", -1, Items.DIAMOND_PICKAXE, true, true, "poweradvantage:steel_frame", 1, 1, 1);
+ witness(world, player, rows, "frame/hand", "basepower:steel_frame", -1, null, false, true, "basepower:steel_frame", 1, 1, 1);
+ witness(world, player, rows, "frame/silk", "basepower:steel_frame", -1, Items.DIAMOND_PICKAXE, true, true, "basepower:steel_frame", 1, 1, 1);
for (int mask = 0; mask < 64; mask++) {
for (String family : new String[] {"wire", "scaffold"}) {
- String identity = "electricadvantage:" + (family.equals("wire") ? "electric_conduit" : "electric_track");
+ String identity = "baseelectric:" + (family.equals("wire") ? "electric_conduit" : "electric_track");
String prefix = family + "/" + mask;
witness(world, player, rows, prefix + "/hand", identity, -1, null, false, true, identity, 1, 1, 1, mask);
witness(world, player, rows, prefix + "/silk", identity, -1, Items.DIAMOND_PICKAXE, true, true, identity, 1, 1, 1, mask);
}
}
- properties(world, rows, "solar/native-solidity", "electricadvantage:photovoltaic_generator", true, 0);
- properties(world, rows, "frame/native-opacity", "poweradvantage:steel_frame", false, 0);
+ properties(world, rows, "solar/native-solidity", "baseelectric:photovoltaic_generator", true, 0);
+ properties(world, rows, "frame/native-opacity", "basepower:steel_frame", false, 0);
for (String id : WATER_ONLY) {
JsonObject row = new JsonObject(); row.addProperty("id", id);
row.addProperty("status", "N/A");
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeNestedIdentityProbe.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeNestedIdentityProbe.java
new file mode 100644
index 0000000..98d1e15
--- /dev/null
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeNestedIdentityProbe.java
@@ -0,0 +1,206 @@
+package zone.moddev.mc.advantageworks;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.mojang.authlib.GameProfile;
+import java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.UUID;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.network.EnumPacketDirection;
+import net.minecraft.network.NetHandlerPlayServer;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.management.PlayerInteractionManager;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.WorldServer;
+import net.minecraft.world.GameType;
+import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
+
+/** Synthetic detached native serializers, never evidence of an original saved player. */
+final class NativeNestedIdentityProbe {
+ private static final String[] ENCHANTMENTS = {"powderless", "recoil", "high_explosive", "rapid_reload"};
+
+ static void registerCommands(FMLServerStartingEvent event) {
+ if (!new File("advantage-nested-identity.allow").isFile()) return;
+ event.registerServerCommand(new CommandBase() {
+ @Override public String getName() { return "advnested"; }
+ @Override public String getUsage(ICommandSender sender) { return "advnested run