diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a8f78e58..d2c6921a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -13,7 +13,7 @@ permissions:
contents: read
concurrency:
- group: poweradvantage-1.12-${{ github.workflow }}-${{ github.ref }}
+ group: basepower-1.12-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
@@ -26,6 +26,14 @@ jobs:
- name: Check out source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
+ - name: Check out pinned OreSpawn
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
+ with:
+ repository: MinecraftModDevelopmentMods/OreSpawn
+ ref: 72205b9bb6bfff17cf69715c0d5bd4d2efd3b148
+ path: .ci-dependencies/OreSpawn
+ persist-credentials: false
+
- name: Install Java 8 toolchain
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
@@ -41,6 +49,21 @@ jobs:
- name: Set up Gradle
uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6
+ - name: Build pinned OreSpawn development jar
+ id: orespawn
+ shell: bash
+ run: |
+ set -euo pipefail
+ dependency="$GITHUB_WORKSPACE/.ci-dependencies/OreSpawn"
+ chmod +x "$dependency/gradlew"
+ (
+ cd "$dependency"
+ ./gradlew deobfJar --no-daemon --stacktrace
+ )
+ jar="$dependency/build/libs-dev/OreSpawn-4.1.3.112021-deobf.jar"
+ test -f "$jar"
+ echo "jar=$jar" >> "$GITHUB_OUTPUT"
+
- name: Make the wrapper executable
run: chmod +x ./gradlew
@@ -56,18 +79,19 @@ jobs:
./gradlew clean check build javadoc verifyReleaseDependencies verifyReleaseArtifacts
writeReleaseChecksums verifyEclipseProductionClasspath
-PrebornCoreVerificationRepository=${{ steps.reborncore.outputs.repository }}
+ -PoreSpawnDeobfJar=${{ steps.orespawn.outputs.jar }}
--no-daemon --stacktrace
- name: Upload audited release candidate
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
- name: PowerAdvantage-1.12.2-${{ github.sha }}
+ name: basePower-1.12.2-${{ github.sha }}
if-no-files-found: error
retention-days: 30
path: |
- build/libs/PowerAdvantage-2.4.1.112021.jar
- build/libs/PowerAdvantage-2.4.1.112021-sources.jar
- build/libs/PowerAdvantage-2.4.1.112021-javadoc.jar
+ build/libs/basePower-2.4.4.112021.jar
+ build/libs/basePower-2.4.4.112021-sources.jar
+ build/libs/basePower-2.4.4.112021-javadoc.jar
build/release/SHA256SUMS
CHANGELOG.txt
@@ -75,7 +99,7 @@ jobs:
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
- name: PowerAdvantage-1.12.2-diagnostics-${{ github.sha }}
+ name: basePower-1.12.2-diagnostics-${{ github.sha }}
if-no-files-found: ignore
retention-days: 14
path: |
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 77d6fe58..bc67e199 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -26,6 +26,14 @@ jobs:
- name: Check out source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
+ - name: Check out pinned OreSpawn
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
+ with:
+ repository: MinecraftModDevelopmentMods/OreSpawn
+ ref: 72205b9bb6bfff17cf69715c0d5bd4d2efd3b148
+ path: .ci-dependencies/OreSpawn
+ persist-credentials: false
+
- name: Install Java 8 toolchain
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
@@ -41,6 +49,21 @@ jobs:
- name: Set up Gradle
uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6
+ - name: Build pinned OreSpawn development jar
+ id: orespawn
+ shell: bash
+ run: |
+ set -euo pipefail
+ dependency="$GITHUB_WORKSPACE/.ci-dependencies/OreSpawn"
+ chmod +x "$dependency/gradlew"
+ (
+ cd "$dependency"
+ ./gradlew deobfJar --no-daemon --stacktrace
+ )
+ jar="$dependency/build/libs-dev/OreSpawn-4.1.3.112021-deobf.jar"
+ test -f "$jar"
+ echo "jar=$jar" >> "$GITHUB_OUTPUT"
+
- name: Stage exact RebornCore compile API
id: reborncore
run: |
@@ -57,6 +80,7 @@ jobs:
run: |
chmod +x ./gradlew
./gradlew clean classes --rerun-tasks --no-build-cache --no-daemon --stacktrace \
+ -PoreSpawnDeobfJar="${{ steps.orespawn.outputs.jar }}" \
-PrebornCoreVerificationRepository=${{ steps.reborncore.outputs.repository }}
- name: Analyze
diff --git a/.github/workflows/release-on-tag.yml b/.github/workflows/release-on-tag.yml
index af9cd1ab..5cb77899 100644
--- a/.github/workflows/release-on-tag.yml
+++ b/.github/workflows/release-on-tag.yml
@@ -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
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 9160fce0..4b127053 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,4 +1,11 @@
-Unreleased test-coverage repairs for 1.12.2
+2.4.4.112021 - basePower for Minecraft 1.12.2
+
+- Bring basePower to Forge 1.12.2. Upgrade worlds from the original Advantage mods or the 1.10.2 base mods, keeping blocks, items, fluids and machine contents.
+- Preserve the world-generation settings for oil, sulfur and lithium when moving to OreSpawn 4 on 1.12.2.
+- Keep the saved MMDLib crusher recipe IDs when replacing the old 1.12.2 Advantage mods.
+- Fix the still so pipes fill the input tank and can only drain the output. Crude oil from Mineralogy also works in the still.
+
+Earlier 1.12.2 test-coverage repairs
- Restore the missing carbon-dust recipe name from registered coal and charcoal powders, without replacing existing entries or changing recipe amounts.
- 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 5398930a..aeee1d4e 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,14 @@
-# PowerAdvantage
+# basePower for Minecraft 1.12.2
-Power Advantage provides shared power, fluid, and item transport systems for its Minecraft 1.12.2 expansion mods.
+basePower continues DrCyano's Power Advantage. It adds conveyors, filters, fluid plumbing and the shared systems used by baseSteam and baseElectric. The 1.12.2 build uses Forge 14.23.5.2859 and Java 8.
-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.
+## Moving an existing world
+
+You can upgrade from the original Advantage mods or the base mods on 1.10.2. If you're already using the old Advantage mods on 1.12.2, you can replace them too. Back up your world and config, replace the old mods together, then try the upgrade on a copy. Save, close Minecraft completely and reopen the copy before moving your main world.
+
+Use Forge 14.23.5.2859 or newer, with the 1.12.2 builds of Base Metals, MMDLib and MMD OreSpawn 4.1.3 or newer in the 4.x line. Existing MMDLib crusher recipes keep their saved IDs. If Forge still warns about missing entries, cancel and check what's missing before proceeding. See the [world upgrade guide](docs/1.12-upgrade.md).
+
+[CurseForge](https://www.curseforge.com/minecraft/mc-mods/basepower) | [Player wiki](https://github.com/MinecraftModDevelopmentMods/basePower/wiki)
## Building Minecraft 1.12.2
@@ -20,4 +26,6 @@ For Eclipse, import the repository as an existing Gradle project and run:
gradlew.bat cleanEclipse verifyEclipseProductionClasspath
```
-Base Metals and OreSpawn remain required distribution dependencies but are deliberately absent from the compile classpath. Optional RF and RebornCore integrations compile against SHA-256-pinned API inputs and are not bundled or added to normal development launches. CI stages the exact historical RebornCore Maven release because the later CurseForge archive with the same version has different contents.
+Build the pinned OreSpawn 4.1.3.112021 development jar first, or pass `-PoreSpawnDeobfJar=
-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
-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).
- Categories use fluid registry names rather than implementation classes, so
+ * sibling mods can interoperate without compile-time dependencies on one
+ * another.getRequestsForPower(World, BlockPos, ConduitType, ConduitType) method.
- * @return A list of PowerRequest instances, sorted in order of highest priority to lowest
- * priority.
- */
- public ListpowerType).
- * @param powerType The type of energy being sent
- * @param minimumPriority The lowest priority of power request that will be filled (prevents
- * battery machines from sending circular power)
- * @param world World object instance
- * @param srcPos A position within the power network that you wish to transmit power into. This
- * is usually the position of the tile entity of the generator machine.
- * @param providerInstance The source sending the power (used to prevent the power source from
- * adding to itself, this parameter can be null).
- * @return The amount of energy that was actually consumed by the requests
- */
- public static float transmitPowerToConsumers(
- final float availableEnergy, ConduitType networkType, ConduitType powerType, byte minimumPriority,
- World world, BlockPos srcPos, Object providerInstance
- ) {
- ListFluids.fluidConduit_general for their type but offer specific fluids
- * (such as water or lava) when fluid sources transmit their fluids to fluid consumers (allowing
- * the consumers to generate requests based on the type of fluid on offer).
- */
- public static final ConduitType fluidConduit_general = new ConduitType("fluid");
- private static ReversibleMapcom.mcmoddev.poweradvantage.init package.
-
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 b86dd02a..16d362dc 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 806c844c..a7a62c25 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 com.mcmoddev.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 3b5f4871..a9c55b80 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 com.mcmoddev.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 3748cffc..1fa88db9 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 com.mcmoddev.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;
@@ -74,7 +74,7 @@ public abstract class BlockSimpleFluidConduit extends FluidConduitBlock {
* around the conduit pipes (measured in meters). For each pixel of radius,
* add 0.0625 (1/16).
* For example, if your block model files use
- * poweradvantage:block/pipe3_* as the parent model, then the radius
+ * basepower:block/pipe3_* as the parent model, then the radius
* of the model will be 3 pixels (6 pixels wide) and you will want to use
* 0.1875 (3/16) as the pipeRadius. A pixel in Minecraft is defines as 1/16
* of a block, regardless of the texture resolution.
diff --git a/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidMachine.java b/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidMachine.java
index 20cb3610..befab2ab 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 com.mcmoddev.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 = com.mcmoddev.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.setTranslationKey(MODID+"."+"my_machine");
myMachineBlock.setRegistryName(MODID, "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 1a1618df..af5df6f9 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 com.mcmoddev.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;
@@ -77,7 +77,7 @@ public abstract class BlockSimplePowerConduit extends ConduitBlock {
* @param pipeRadius This is used to determine the size of the hit-boxes
* around the conduit pipes. For each pixel of radius, add 0.0625 (1/16).
* For example, if your block model files use
- * poweradvantage:block/pipe3_* as the parent model, then the radius
+ * basepower:block/pipe3_* as the parent model, then the radius
* of the model will be 3 pixels (6 pixels wide) and you will want to use
* 0.1875 (3/16) as the pipeRadius. A pixel in Minecraft is defines as 1/16
* of a block, regardless of the texture resolution.
diff --git a/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerMachine.java b/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerMachine.java
index 036454a5..3719837a 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 com.mcmoddev.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 = com.mcmoddev.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.setTranslationKey(MODID+"."+"my_machine");
myMachineBlock.setRegistryName(MODID, "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 863283c8..72e28a16 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 com.mcmoddev.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import com.mcmoddev.poweradvantage.math.Integer2D;
-import com.mcmoddev.poweradvantage.registry.ITileEntityGUI;
-import com.mcmoddev.poweradvantage.registry.MachineGUIRegistry;
+import zone.moddev.mc.basepower.registry.ITileEntityGUI;
+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 ecc702d8..41257690 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java
@@ -5,8 +5,8 @@
import cyano.poweradvantage.api.PowerRequest;
import cyano.poweradvantage.api.fluid.FluidPoweredEntity;
import cyano.poweradvantage.api.fluid.FluidRequest;
-import com.mcmoddev.poweradvantage.init.Fluids;
-import com.mcmoddev.poweradvantage.util.FluidIdHelper;
+import zone.moddev.mc.basepower.init.Fluids;
+import zone.moddev.mc.basepower.util.FluidIdHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
diff --git a/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimplePowerMachine.java b/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimplePowerMachine.java
index 4d9d3a80..054b2c9c 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 com.mcmoddev.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/com/mcmoddev/poweradvantage/PowerAdvantage.java b/src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java
similarity index 87%
rename from src/main/java/com/mcmoddev/poweradvantage/PowerAdvantage.java
rename to src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java
index bc82c50a..020d9c83 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/PowerAdvantage.java
+++ b/src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java
@@ -1,10 +1,14 @@
-package com.mcmoddev.poweradvantage;
+package zone.moddev.mc.basepower;
import cyano.poweradvantage.api.ConduitType;
-import com.mcmoddev.poweradvantage.init.WorldGen;
-import com.mcmoddev.poweradvantage.registry.FuelRegistry;
-import com.mcmoddev.poweradvantage.registry.MachineGUIRegistry;
-import com.mcmoddev.poweradvantage.registry.still.recipe.DistillationRecipeRegistry;
+import cyano.poweradvantage.api.FluidCategoryRegistry;
+import zone.moddev.mc.basepower.compat.LegacyIdentity;
+import zone.moddev.mc.basepower.compat.LegacyLevelData;
+import zone.moddev.mc.basepower.compat.LegacyWorldgenIdentity;
+import zone.moddev.mc.basepower.init.OreSpawnWorldGen;
+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;
@@ -12,12 +16,14 @@
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.FMLLog;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
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.FMLServerAboutToStartEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import net.minecraftforge.fml.common.registry.GameRegistry;
@@ -31,14 +37,11 @@
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
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 ✓
@@ -184,7 +187,7 @@
* folder. It will also be helpful to put the javadoc .zip file in this folder as well.
*
* 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")
*
* After that, you need to update your gradle build script to include the dependencies. Add the
* following to build.gradle (adjusting the version numbers on the .jar filenames as
@@ -198,7 +201,7 @@
dependencies {
compile files(
- 'lib/PowerAdvantage-API-x.y.z.jar'
+ 'lib/basePower-API-x.y.z.jar'
)
}
@@ -213,7 +216,8 @@ compile files(
* @author DrCyano
*
*/
-@Mod(modid = PowerAdvantage.MODID, version = PowerAdvantage.VERSION, name=PowerAdvantage.NAME, dependencies = "after:basemetals",
+@Mod(modid = PowerAdvantage.MODID, version = PowerAdvantage.VERSION, name=PowerAdvantage.NAME,
+ dependencies = "required-before:orespawn@[4.1.3,5.0.0)",
acceptedMinecraftVersions = "[1.12.2]")
public class PowerAdvantage
{
@@ -223,11 +227,12 @@ public class PowerAdvantage
}
/** The identifier for this mod */
- public static final String MODID = "poweradvantage";
+ public static final String MODID = "basepower";
+ public static final String LEGACY_MODID = "poweradvantage";
/** 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.update */
- public static final String VERSION = "2.4.1.112021";
+ public static final String VERSION = "2.4.4.112021";
@@ -279,8 +284,19 @@ public void preInit(FMLPreInitializationEvent event)
{
FMLLog.info("%s: loading config file", MODID);
instance = this;
- com.mcmoddev.poweradvantage.init.Entities.registerDataFixers();
- Configuration config = new Configuration(event.getSuggestedConfigurationFile());
+ LegacyIdentity.requireReplacementsOnly(Loader::isModLoaded);
+ Path configDirectory = event.getSuggestedConfigurationFile().toPath().getParent();
+ try {
+ LegacyWorldgenIdentity.migrateConfig(configDirectory, LEGACY_MODID, MODID);
+ if (Loader.isModLoaded("baseelectric")) {
+ LegacyWorldgenIdentity.migrateConfig(configDirectory, "electricadvantage", "baseelectric");
+ }
+ } catch (IOException error) {
+ throw new IllegalStateException("Cannot safely migrate the Advantage generation configuration", error);
+ }
+ zone.moddev.mc.basepower.init.Entities.registerDataFixers();
+ Configuration config = new Configuration(LegacyIdentity.migrateConfiguration(
+ event.getSuggestedConfigurationFile(), LEGACY_MODID));
config.load();
String[] presets = {"NORMAL", "TECH_PROGRESSION", "APOCALYPTIC"};
String mode = config.getString("recipe_mode", "options", "NORMAL", "NORMAL, APOCALYPTIC, or TECH_PROGRESSION. \n"
@@ -328,6 +344,10 @@ public void preInit(FMLPreInitializationEvent event)
distillerRecipeConfig = DEFAULT_DISTILLER_RECIPES;
}
distillRecipes = distillerRecipeConfig.split(";");
+ for (String alias : config.getString("crude_oil_aliases", "options", "",
+ "Additional crude-oil fluid names, separated by semicolons.").split(";")) {
+ if (!alias.trim().isEmpty()) FluidCategoryRegistry.registerAlias(FluidCategoryRegistry.CRUDE_OIL, alias);
+ }
useOtherFluids = config.getBoolean("use_other_fluids", "Other Power Mods", useOtherFluids,
"If true, then Power Advantage will use existing fluids added by other mods where possible");
@@ -382,27 +402,15 @@ public void preInit(FMLPreInitializationEvent event)
config.save();
- FMLLog.info("%s: creating orespawn file (if it doesn't already exist)", MODID);
-
- Path orespawnFolder = Paths.get(event.getSuggestedConfigurationFile().toPath().getParent().toString(),"orespawn");
- Path orespawnFile = Paths.get(orespawnFolder.toString(),MODID+".json");
- if(!Files.exists(orespawnFile)){
- try{
- Files.createDirectories(orespawnFile.getParent());
- Files.write(orespawnFile, Arrays.asList(WorldGen.ORESPAWN_FILE_CONTENTS.split("\n")), Charset.forName("UTF-8"));
- } catch (IOException e) {
- FMLLog.severe(MODID+": Error: Failed to write file "+orespawnFile);
- }
- }
-
-
FMLLog.info("%s: initializing fluids, blocks, items, and loot tables", MODID);
- com.mcmoddev.poweradvantage.init.Fluids.init();
- com.mcmoddev.poweradvantage.init.Blocks.init();
- com.mcmoddev.poweradvantage.init.Items.init();
- com.mcmoddev.poweradvantage.init.TreasureChests.init(event.getSuggestedConfigurationFile().toPath().getParent());
+ zone.moddev.mc.basepower.init.Fluids.init();
+ zone.moddev.mc.basepower.init.Blocks.init();
+ zone.moddev.mc.basepower.init.Items.init();
+ OreSpawnWorldGen.register(configDirectory);
+ LegacyIdentity.migrateAdditionalLootTables(configDirectory, LEGACY_MODID, MODID);
+ zone.moddev.mc.basepower.init.TreasureChests.init(configDirectory);
detectOptionalPowerApis();
- com.mcmoddev.poweradvantage.init.ModSupport.registerContent(detectedRF, detectedTechReborn);
+ zone.moddev.mc.basepower.init.ModSupport.registerContent(detectedRF, detectedTechReborn);
// keep this next comment, it is useful for finding Vanilla recipes
//OreDictionary.initVanillaEntries();
@@ -416,11 +424,30 @@ public void preInit(FMLPreInitializationEvent event)
FMLLog.info("%s: preinit complete", MODID);
}
+ @EventHandler
+ public void serverAboutToStart(FMLServerAboutToStartEvent event) {
+ Path world = event.getServer().getActiveAnvilConverter()
+ .getSaveLoader(event.getServer().getFolderName(), false).getWorldDirectory().toPath();
+ Set replacements = new HashSet<>();
+ replacements.add(MODID);
+ if (Loader.isModLoaded("basesteam")) replacements.add("basesteam");
+ if (Loader.isModLoaded("baseelectric")) replacements.add("baseelectric");
+ try {
+ LegacyLevelData.migrateWorld(world, replacements);
+ LegacyWorldgenIdentity.migrateWorld(world, LEGACY_MODID, MODID);
+ if (replacements.contains("baseelectric")) {
+ LegacyWorldgenIdentity.migrateWorld(world, "electricadvantage", "baseelectric");
+ }
+ } catch (IOException error) {
+ throw new IllegalStateException("Cannot safely migrate this world's Advantage identities", error);
+ }
+ }
+
@SideOnly(Side.CLIENT)
private void clientPreInit(FMLPreInitializationEvent event){
// client-only code
- com.mcmoddev.poweradvantage.init.Blocks.bakeModels();
- com.mcmoddev.poweradvantage.init.ModSupport.bakeModels();
+ zone.moddev.mc.basepower.init.Blocks.bakeModels();
+ zone.moddev.mc.basepower.init.ModSupport.bakeModels();
}
@SideOnly(Side.SERVER)
private void serverPreInit(FMLPreInitializationEvent event){
@@ -443,15 +470,15 @@ public void init(FMLInitializationEvent event)
GameRegistry.registerFuelHandler(FuelRegistry.getInstance());
FMLLog.info("%s: initializing more content", MODID);
- com.mcmoddev.poweradvantage.init.Fuels.init();
- com.mcmoddev.poweradvantage.init.Entities.init();
- com.mcmoddev.poweradvantage.init.Recipes.init();
- com.mcmoddev.poweradvantage.init.Recipes.initDistillationRecipes(distillRecipes);
- com.mcmoddev.poweradvantage.init.Villages.init();
- com.mcmoddev.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.Villages.init();
+ zone.moddev.mc.basepower.init.GUI.init();
FMLLog.info("%s: mod support data registries", MODID);
- com.mcmoddev.poweradvantage.init.ModSupport.registerRecipes();
+ zone.moddev.mc.basepower.init.ModSupport.registerRecipes();
if(event.getSide() == Side.CLIENT){
@@ -490,8 +517,8 @@ private void detectOptionalPowerApis() {
private void clientInit(FMLInitializationEvent event){
// client-only code
FMLLog.info("%s: initializing renders", MODID);
- com.mcmoddev.poweradvantage.init.Items.registerItemRenders(event);
- com.mcmoddev.poweradvantage.init.Blocks.registerItemRenders(event);
+ zone.moddev.mc.basepower.init.Items.registerItemRenders(event);
+ zone.moddev.mc.basepower.init.Blocks.registerItemRenders(event);
}
@SideOnly(Side.SERVER)
private void serverInit(FMLInitializationEvent event){
@@ -526,6 +553,7 @@ public void postInit(FMLPostInitializationEvent event)
FMLLog.info("%s: clearing cached data", MODID);
// Clear caches
+ zone.moddev.mc.basepower.init.Recipes.initCrudeOilAliasDistillationRecipes();
DistillationRecipeRegistry.clearRecipeCache();
sortBlocksByModID();
diff --git a/src/main/java/com/mcmoddev/poweradvantage/RecipeMode.java b/src/main/java/zone/moddev/mc/basepower/RecipeMode.java
similarity index 96%
rename from src/main/java/com/mcmoddev/poweradvantage/RecipeMode.java
rename to src/main/java/zone/moddev/mc/basepower/RecipeMode.java
index f3449579..03c5450f 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/RecipeMode.java
+++ b/src/main/java/zone/moddev/mc/basepower/RecipeMode.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/poweradvantage/blocks/BlockFrame.java b/src/main/java/zone/moddev/mc/basepower/blocks/BlockFrame.java
similarity index 96%
rename from src/main/java/com/mcmoddev/poweradvantage/blocks/BlockFrame.java
rename to src/main/java/zone/moddev/mc/basepower/blocks/BlockFrame.java
index 026af166..356babf9 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/blocks/BlockFrame.java
+++ b/src/main/java/zone/moddev/mc/basepower/blocks/BlockFrame.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.blocks;
+package zone.moddev.mc.basepower.blocks;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/blocks/BlockPowerSwitch.java b/src/main/java/zone/moddev/mc/basepower/blocks/BlockPowerSwitch.java
similarity index 97%
rename from src/main/java/com/mcmoddev/poweradvantage/blocks/BlockPowerSwitch.java
rename to src/main/java/zone/moddev/mc/basepower/blocks/BlockPowerSwitch.java
index 3451b5fe..d109e06c 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/blocks/BlockPowerSwitch.java
+++ b/src/main/java/zone/moddev/mc/basepower/blocks/BlockPowerSwitch.java
@@ -1,9 +1,9 @@
-package com.mcmoddev.poweradvantage.blocks;
+package zone.moddev.mc.basepower.blocks;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.ITypedConduit;
import cyano.poweradvantage.api.PowerConnectorContext;
-import com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/gui/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/blocks/package-info.java
index c23b41d6..0b4337c6 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.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 com.mcmoddev.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/com/mcmoddev/poweradvantage/compat/BaseMetalsCompat.java b/src/main/java/zone/moddev/mc/basepower/compat/BaseMetalsCompat.java
similarity index 97%
rename from src/main/java/com/mcmoddev/poweradvantage/compat/BaseMetalsCompat.java
rename to src/main/java/zone/moddev/mc/basepower/compat/BaseMetalsCompat.java
index d6eeebec..295de1b7 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/compat/BaseMetalsCompat.java
+++ b/src/main/java/zone/moddev/mc/basepower/compat/BaseMetalsCompat.java
@@ -1,7 +1,7 @@
-package com.mcmoddev.poweradvantage.compat;
+package zone.moddev.mc.basepower.compat;
-import com.mcmoddev.poweradvantage.PowerAdvantage;
-import com.mcmoddev.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.ItemStack;
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 00000000..982f5bad
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/compat/LegacyIdentity.java
@@ -0,0 +1,246 @@
+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.enchantment.Enchantment;
+import net.minecraft.item.Item;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.SoundEvent;
+import net.minecraft.util.datafix.IFixableData;
+import net.minecraftforge.event.RegistryEvent;
+import net.minecraftforge.fml.common.FMLLog;
+import net.minecraftforge.fml.common.Loader;
+import net.minecraftforge.fml.common.Mod;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.registry.ForgeRegistries;
+import net.minecraftforge.registries.IForgeRegistry;
+import net.minecraftforge.registries.IForgeRegistryEntry;
+import net.minecraftforge.registries.RegistryManager;
+
+/** Read compatibility for old Advantage worlds; new saves use base identities. */
+@Mod.EventBusSubscriber(modid = "basepower")
+public final class LegacyIdentity {
+ private static final ResourceLocation MMDLIB_CRUSHER_REGISTRY =
+ new ResourceLocation("mmdlib", "crusher_registry");
+
+ 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(
+ RegistryEvent.MissingMappings event, IForgeRegistry registry, String oldModId, String newModId) {
+ remapMissingMappings(event, registry, oldModId, newModId, true);
+ }
+
+ private static > void remapMissingMappings(
+ RegistryEvent.MissingMappings event, IForgeRegistry registry, String oldModId, String newModId,
+ boolean failWithoutTarget) {
+ for (RegistryEvent.MissingMappings.Mapping mapping : event.getAllMappings()) {
+ if (!oldModId.equals(mapping.key.getNamespace())) continue;
+ ResourceLocation target = new ResourceLocation(newModId, mapping.key.getPath());
+ if (registry.containsKey(target)) {
+ mapping.remap(registry.getValue(target));
+ } else if (failWithoutTarget) {
+ mapping.fail();
+ FMLLog.severe("%s: no migration target for %s", newModId, mapping.key);
+ }
+ }
+ }
+
+ private static > void remapInstalled(
+ RegistryEvent.MissingMappings event, IForgeRegistry registry) {
+ remapInstalled(event, registry, true);
+ }
+
+ private static > void remapInstalled(
+ RegistryEvent.MissingMappings event, IForgeRegistry registry, boolean failWithoutTarget) {
+ remapMissingMappings(event, registry, "poweradvantage", "basepower", failWithoutTarget);
+ if (Loader.isModLoaded("basesteam"))
+ remapMissingMappings(event, registry, "steamadvantage", "basesteam", failWithoutTarget);
+ if (Loader.isModLoaded("baseelectric"))
+ remapMissingMappings(event, registry, "electricadvantage", "baseelectric", failWithoutTarget);
+ }
+
+ @SubscribeEvent public static void remapBlocks(RegistryEvent.MissingMappings event) {
+ remapInstalled(event, ForgeRegistries.BLOCKS);
+ }
+
+ @SubscribeEvent public static void remapItems(RegistryEvent.MissingMappings- event) {
+ remapInstalled(event, ForgeRegistries.ITEMS);
+ }
+
+ @SubscribeEvent public static void remapRecipes(RegistryEvent.MissingMappings
event) {
+ remapInstalled(event, ForgeRegistries.RECIPES);
+ }
+
+ @SubscribeEvent public static void remapEnchantments(RegistryEvent.MissingMappings event) {
+ remapInstalled(event, ForgeRegistries.ENCHANTMENTS);
+ }
+
+ // Forge 1.12 filters generic subscribers by the exact entry class. Subscribe
+ // without a type filter so MMDLib stays optional at compile time.
+ @SubscribeEvent
+ @SuppressWarnings("rawtypes")
+ public static void remapCrusherRecipes(RegistryEvent.MissingMappings event) {
+ if (MMDLIB_CRUSHER_REGISTRY.equals(event.getName())) {
+ remapEventRegistry((RegistryEvent.MissingMappings>) event);
+ }
+ }
+
+ private static > void remapEventRegistry(RegistryEvent.MissingMappings event) {
+ // The event's registry is the staging snapshot; replacements live in the active registry.
+ // Leave unknown recipes to Forge's prompt; FAIL does not abort a local 1.12 load.
+ remapInstalled(event, RegistryManager.ACTIVE.getRegistry(event.getName()), false);
+ }
+
+ @SubscribeEvent public static void remapRemovedOrbSound(RegistryEvent.MissingMappings event) {
+ // Forge 1.10 snapshots include the unused orb-touch event; 1.12 only has pickup.
+ ResourceLocation old = new ResourceLocation("minecraft", "entity.experience_orb.touch");
+ ResourceLocation pickup = new ResourceLocation("minecraft", "entity.experience_orb.pickup");
+ if (!ForgeRegistries.SOUND_EVENTS.containsKey(pickup)) return;
+ for (RegistryEvent.MissingMappings.Mapping mapping : event.getAllMappings()) {
+ if (old.equals(mapping.key)) mapping.remap(ForgeRegistries.SOUND_EVENTS.getValue(pickup));
+ }
+ }
+
+ public static IFixableData tileIds(String oldModId, String newModId, int version) {
+ return idFix(version, id -> {
+ for (String prefix : new String[] {oldModId + ":", oldModId + ".", newModId + ".",
+ "minecraft:" + oldModId + ".", "minecraft:" + newModId + "."}) {
+ if (id.startsWith(prefix)) return newModId + ":" + id.substring(prefix.length());
+ }
+ return id;
+ });
+ }
+
+ public static IFixableData itemIds(String oldModId, String newModId, int version) {
+ return idFix(version, id -> {
+ if (!id.startsWith(oldModId + ":")) return id;
+ ResourceLocation target = new ResourceLocation(newModId, id.substring(oldModId.length() + 1));
+ return net.minecraftforge.fml.common.registry.ForgeRegistries.ITEMS.containsKey(target)
+ ? target.toString() : id;
+ });
+ }
+
+ public static IFixableData idFix(int version, java.util.function.UnaryOperator rename) {
+ return new IFixableData() {
+ @Override public int getFixVersion() { return version; }
+ @Override public NBTTagCompound fixTagCompound(NBTTagCompound tag) {
+ if (tag.hasKey("id", 8)) {
+ String id = tag.getString("id");
+ String canonical = rename.apply(id);
+ if (!id.equals(canonical)) tag.setString("id", canonical);
+ }
+ return tag;
+ }
+ };
+ }
+
+ 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) {
+ 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 00000000..0edbe942
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/compat/LegacyLevelData.java
@@ -0,0 +1,137 @@
+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;
+
+/** Adapts the Forge 1.10 header before Forge 1.12 reads it. */
+public final class LegacyLevelData {
+ private LegacyLevelData() { }
+
+ public static boolean remapFluidDefaults(NBTTagCompound root) {
+ String key = root.hasKey("forge", 10) ? "forge" : "Forge";
+ if (!root.hasKey(key, 10)) return false;
+ NBTTagCompound forge = root.getCompoundTag(key);
+ 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")));
+ }
+
+ static boolean remapForgeOwner(NBTTagCompound root) {
+ if (!root.hasKey("Forge", 10)) return false;
+ if (root.hasKey("forge") && !root.getTag("forge").equals(root.getTag("Forge"))) {
+ throw new IllegalStateException("Conflicting Forge and forge world headers");
+ }
+ root.setTag("forge", root.getTag("Forge"));
+ root.removeTag("Forge");
+ return true;
+ }
+
+ 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);
+ if ("Forge".equals(mod.getString("ModId"))) {
+ if (present.contains("forge")) throw new IllegalStateException("Conflicting Forge mod list entries");
+ mod.setString("ModId", "forge");
+ changed = true;
+ }
+ 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 = remapForgeOwner(document);
+ 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 00000000..13308471
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentity.java
@@ -0,0 +1,690 @@
+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 and OreSpawn configuration migration from 1.10 to 1.12.
+ *
+ * Call {@link #migrateConfig} during the owning mod's preInit, before
+ * OreSpawn 4's init imports 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. The 1.12 bridge only imports OS3,
+ * so convert old owned OS1 declarations before that bridge starts.
+ *
+ *
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-os3-bridge-migrated")
+ || 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");
+ }
+ boolean os1 = "os1".equals(kind);
+ JsonObject imported = os1 ? toOs3(legacy.get(0).migrated) : legacy.get(0).migrated;
+ batch.write("orespawn3/" + newModId + ".json", imported);
+ for (Document source : legacy) {
+ if (os1 || source.path.getFileName().toString().equals(oldModId + ".json")) batch.retire(source);
+ }
+ }
+ if (profile != null) batch.write("orespawn-worldgen.json", profile.migrated);
+ return batch.commit();
+ }
+
+ private static JsonObject toOs3(JsonObject source) throws IOException {
+ JsonArray sections = source.getAsJsonArray("dimensions");
+ java.util.Set explicit = new java.util.HashSet<>();
+ for (JsonElement section : sections) {
+ JsonElement id = section.getAsJsonObject().get("dimension");
+ if (!"+".equals(id.getAsString())) explicit.add(integer(id, "dimension"));
+ }
+ JsonObject spawns = new JsonObject();
+ for (JsonElement section : sections) {
+ JsonObject dimension = section.getAsJsonObject();
+ JsonArray ids = new JsonArray();
+ JsonElement id = dimension.get("dimension");
+ if ("+".equals(id.getAsString())) {
+ java.util.Set registered = new java.util.TreeSet<>(Arrays.asList(-1, 0, 1));
+ registered.addAll(Arrays.asList(net.minecraftforge.common.DimensionManager.getStaticDimensionIDs()));
+ for (Integer number : registered) if (!explicit.contains(number)) ids.add(number);
+ // An empty OS3 dimension list means Overworld, not "no dimensions".
+ if (ids.size() == 0) continue;
+ } else {
+ ids.add(integer(id, "dimension"));
+ }
+ for (JsonElement entry : dimension.getAsJsonArray("ores")) {
+ JsonObject ore = entry.getAsJsonObject();
+ String block = ore.get("blockID").getAsString();
+ JsonObject output = new JsonObject();
+ output.addProperty("name", block);
+ output.addProperty("chance", 100);
+ if (ore.has("blockMeta")) output.add("metadata", ore.get("blockMeta"));
+ JsonArray blocks = new JsonArray();
+ blocks.add(output);
+ JsonObject spawn = new JsonObject();
+ spawn.addProperty("enabled", true);
+ spawn.addProperty("feature", "default");
+ spawn.addProperty("replaces", "default");
+ spawn.add("blocks", blocks);
+ spawn.add("dimensions", ids);
+ JsonObject parameters = new JsonObject();
+ String[] keys = {"size", "variation", "frequency", "minHeight", "maxHeight"};
+ Number[] defaults = {8, 0, 0.5D, 0, 256};
+ for (int index = 0; index < keys.length; index++) {
+ String field = keys[index];
+ parameters.add(field, ore.has(field) ? ore.get(field) : new JsonPrimitive(defaults[index]));
+ }
+ spawn.add("parameters", parameters);
+ JsonArray includes = new JsonArray();
+ if (ore.has("biomes")) {
+ for (JsonElement selector : ore.getAsJsonArray("biomes")) {
+ if (!isString(selector)) throw new IOException("Numeric OS1 biome IDs need explicit names");
+ String biome = selector.getAsString().toLowerCase(java.util.Locale.ROOT);
+ if (!biome.matches("[a-z0-9_.-]+:[a-z0-9_./-]+")) {
+ throw new IOException("OS1 biome '" + biome + "' needs an explicit resource ID");
+ }
+ includes.add(biome);
+ }
+ }
+ JsonObject biomes = new JsonObject();
+ biomes.add("includes", includes);
+ spawn.add("biomes", biomes);
+ spawns.add(block.replace(':', '_').replace('/', '_') + "_" + spawns.size(), spawn);
+ }
+ }
+ if (spawns.size() == 0) throw new IOException("No representable OS1 generation rules");
+ JsonObject result = new JsonObject();
+ result.addProperty("version", "2.0");
+ result.add("spawns", spawns);
+ return result;
+ }
+
+ /** 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/com/mcmoddev/poweradvantage/conduitnetwork/ConduitNetworkManager.java b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManager.java
similarity index 97%
rename from src/main/java/com/mcmoddev/poweradvantage/conduitnetwork/ConduitNetworkManager.java
rename to src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManager.java
index 14460d59..9454c292 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/conduitnetwork/ConduitNetworkManager.java
+++ b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManager.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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 com.mcmoddev.poweradvantage.math.BlockPos4D;
-import com.mcmoddev.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/basepower/conduitnetwork/ConduitRegistry.java b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitRegistry.java
new file mode 100644
index 00000000..f64b0bc5
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitRegistry.java
@@ -0,0 +1,351 @@
+package zone.moddev.mc.basepower.conduitnetwork;
+
+import zone.moddev.mc.basepower.PowerAdvantage;
+import cyano.poweradvantage.api.ConduitType;
+import cyano.poweradvantage.api.IPowerMachine;
+import cyano.poweradvantage.api.ITypedConduit;
+import cyano.poweradvantage.api.PowerRequest;
+import cyano.poweradvantage.api.modsupport.ExternalPowerRequest;
+import cyano.poweradvantage.api.modsupport.LightWeightPowerRegistry;
+import cyano.poweradvantage.api.modsupport.Wrappers;
+import zone.moddev.mc.basepower.math.BlockPos4D;
+import net.minecraft.block.Block;
+import net.minecraft.block.ITileEntityProvider;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.ChunkPos;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.world.ChunkEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+import java.util.*;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * This is the master keeper of power networks.
+ * @author DrCyano
+ *
+ */
+public class ConduitRegistry {
+
+ private final Map networkManagers = new HashMap<>();
+ private final Map activeWorlds = new HashMap<>();
+
+ // thread-safe singleton instantiation
+ private static ConduitRegistry instance = null;
+ private static final Lock initLock = new ReentrantLock();
+
+ /**
+ * Thread-safe singleton instantiation
+ *
+ * @return A singleton instance of this class
+ */
+ public static ConduitRegistry getInstance() {
+ if (instance == null) {
+ initLock.lock();
+ try {
+ if (instance == null) {
+ instance = new ConduitRegistry();
+ MinecraftForge.EVENT_BUS.register(instance);
+ }
+ } finally {
+ initLock.unlock();
+ }
+ }
+ return instance;
+ }
+
+
+ /**
+ * Scans the power network for a given coordinate and returns a list of power requests from
+ * all power sinks on that network. If transmitting a subtype of enrgy (such as a type of
+ * fluid), then conduitType is the super type (used for connecting conduits) and energyType is
+ * the specific subtype being transmitted.
+ *
+ * @param w The world instance for this dimension
+ * @param coord The block asking for power requests
+ * @param conduitType the type of energy transmission network (and type of energy) to poll. If
+ * the conduit type and the type of energy energy being transmitted are different (e.g. sending
+ * a subtype of energy), then use the
+ * getRequestsForPower(World, BlockPos, ConduitType, ConduitType) method.
+ * @return A list of PowerRequest instances, sorted in order of highest priority to lowest
+ * priority.
+ */
+ public List getRequestsForPower(World w, BlockPos coord, ConduitType conduitType) {
+ return getRequestsForPower(w, coord, conduitType, conduitType);
+ }
+
+ /**
+ * Scans the power network for a given coordinate and returns a list of power requests from
+ * all power sinks on that network. If transmitting a subtype of enrgy (such as a type of
+ * fluid), then conduitType is the super type (used for connecting conduits) and energyType is
+ * the specific subtype being transmitted.
+ *
+ * @param w The world instance for this dimension
+ * @param coord The block asking for power requests
+ * @param conduitType the type of energy transmission network to poll
+ * @param energyType the type of energy being offered (usually is the same as conduitType)
+ * @return A list of PowerRequest instances, sorted in order of highest priority to lowest
+ * priority.
+ */
+ public List getRequestsForPower(World w, BlockPos coord, ConduitType conduitType, ConduitType energyType) {
+ if (!w.isBlockLoaded(coord)) return Collections.emptyList();
+ int dimension = w.provider.getDimension();
+ clearIfWorldChanged(w, dimension);
+ ConduitNetworkManager manager = getConduitNetworkManager(conduitType);
+ BlockPos4D bp = new BlockPos4D(dimension, coord);
+ boolean wasValidated = manager.isValidatedNetwork(bp);
+ if (!wasValidated) {
+ manager.revalidate(bp, w, conduitType);
+ }
+ List requests = collectRequests(w, manager.getNetwork(bp), conduitType, energyType);
+ if (requests.isEmpty() && wasValidated) {
+ manager.revalidate(bp, w, conduitType);
+ requests = collectRequests(w, manager.getNetwork(bp), conduitType, energyType);
+ }
+ Collections.sort(requests);
+ return requests;
+ }
+
+ private List collectRequests(World w, List net, ConduitType conduitType, ConduitType energyType) {
+ List requests = new ArrayList<>();
+ for (BlockPos4D pos : net) {
+ if (!w.isBlockLoaded(pos.pos)) continue;
+ Block b = w.getBlockState(pos.pos).getBlock();
+ if (b instanceof ITileEntityProvider) {
+ TileEntity e = w.getTileEntity(pos.pos);
+ if (e instanceof IPowerMachine && ((ITypedConduit) e).isPowerSink(energyType)) {
+ PowerRequest req = ((IPowerMachine) e).getPowerRequest(energyType);
+ if (req != PowerRequest.REQUEST_NOTHING) requests.add(req);
+ } else {
+ if (LightWeightPowerRegistry.getInstance().isExternalPowerBlock(b)) {
+ if (e != null) {
+ PowerRequest req = new ExternalPowerRequest(LightWeightPowerRegistry.getInstance()
+ .getRequestedPowerAmount(w, pos.pos, energyType), e);
+ if (req.amount > 0) {
+ requests.add(req);
+ }
+ }
+ } else {
+ if (PowerAdvantage.detectedRF && PowerAdvantage.rfConversionTable.containsKey(conduitType)) {
+ if (e instanceof cofh.api.energy.IEnergyReceiver) {
+ requests.add(Wrappers.wrapRFPowerRequest(
+ (cofh.api.energy.IEnergyReceiver) e, energyType, PowerAdvantage.rfConversionTable.get(conduitType)
+ ));
+ }
+ }
+ if (PowerAdvantage.detectedTechReborn && PowerAdvantage.trConversionTable.containsKey(conduitType)) {
+ if (e instanceof reborncore.api.power.IEnergyInterfaceTile) {
+ requests.add(Wrappers.wrapTRPowerRequest(
+ (reborncore.api.power.IEnergyInterfaceTile) e, energyType, PowerAdvantage.trConversionTable.get(conduitType)
+ ));
+ }
+ }
+ }
+ }
+ }
+ }
+ return requests;
+ }
+
+ /**
+ * Sends the provided energy out to all machines requesting energy that are connected to the
+ * given TileEntity. The amount of energy actually sent out is returned
+ *
+ * @param availableEnergy Maximum amount of energy to send
+ * @param powerType The type of energy being sent
+ * @param minimumPriority The lowest priority of power request that will be filled (prevents
+ * battery machines from sending circular power)
+ * @param provider The source TileEntity sending the power
+ * @return The amount of energy that was actually consumed by the requests
+ */
+ public static float transmitPowerToConsumers(
+ final float availableEnergy, ConduitType powerType, byte minimumPriority,
+ TileEntity provider
+ ) {
+ return transmitPowerToConsumers(availableEnergy, powerType, powerType, minimumPriority, provider.getWorld(), provider.getPos(), provider);
+ }
+
+ /**
+ * Sends the provided energy out to all machines requesting energy that are connected to the
+ * given TileEntity. The amount of energy actually sent out is returned
+ *
+ * @param availableEnergy Maximum amount of energy to send
+ * @param networkType The power network to access (almost always the same as
+ * powerType).
+ * @param powerType The type of energy being sent
+ * @param minimumPriority The lowest priority of power request that will be filled (prevents
+ * battery machines from sending circular power)
+ * @param world World object instance
+ * @param srcPos A position within the power network that you wish to transmit power into. This
+ * is usually the position of the tile entity of the generator machine.
+ * @param providerInstance The source sending the power (used to prevent the power source from
+ * adding to itself, this parameter can be null).
+ * @return The amount of energy that was actually consumed by the requests
+ */
+ public static float transmitPowerToConsumers(
+ final float availableEnergy, ConduitType networkType, ConduitType powerType, byte minimumPriority,
+ World world, BlockPos srcPos, Object providerInstance
+ ) {
+ List requests = ConduitRegistry.getInstance().getRequestsForPower(world, srcPos, networkType, powerType);
+ return distributePower(availableEnergy, powerType, minimumPriority, world, providerInstance, requests);
+ }
+
+ static float distributePower(float availableEnergy, ConduitType powerType, byte minimumPriority,
+ World world, Object providerInstance, List requests) {
+ if (!Float.isFinite(availableEnergy) || availableEnergy <= 0) return 0;
+ float e = availableEnergy;
+ for (PowerRequest req : requests) {
+ if (!Float.isFinite(req.amount) || req.amount <= 0) continue;
+ if (req.entity == providerInstance) continue;
+ if (req.priority < minimumPriority) continue;
+
+ float offered = Math.min(e, req.amount);
+ float accepted;
+ if (req instanceof ExternalPowerRequest) {
+ accepted = LightWeightPowerRegistry.getInstance().addPower(world, ((ExternalPowerRequest) req).pos,
+ powerType, offered);
+ } else {
+ if (req.entity == null) continue;
+ accepted = req.entity.addEnergy(offered, powerType);
+ }
+ if (Float.isFinite(accepted)) e -= Math.max(0, Math.min(offered, accepted));
+ if (e <= 0) break;
+ }
+ return availableEnergy - e;
+ }
+
+
+ /**
+ * Invoke this method anytime a conduit block enters the world
+ *
+ * @param w The world instance for this dimension
+ * @param dimension The ID number for this dimension
+ * @param location The position of the block being added
+ * @param type The native energy type of the added conduit block
+ */
+ public void conduitBlockPlacedEvent(World w, int dimension, BlockPos location, ConduitType type) {
+ if (w.isRemote) return; // ignore client-side
+ clearIfWorldChanged(w, dimension);
+ BlockPos4D coord = new BlockPos4D(dimension, location);
+ ConduitNetworkManager manager = getConduitNetworkManager(type);
+ manager.invalidate(coord);
+ for (int i = 0; i < EnumFacing.values().length; i++) {
+ EnumFacing face = EnumFacing.values()[i];
+ BlockPos4D n = coord.offset(face);
+ manager.invalidate(n);
+ }
+ }
+
+ /**
+ * Invoke this method anytime a conduit block enters the world
+ *
+ * @param w The world instance for this dimension
+ * @param dimension The ID number for this dimension
+ * @param location The position of the block being added
+ * @param types The native energy type of the added conduit block
+ */
+ public void conduitBlockPlacedEvent(World w, int dimension, BlockPos location, ConduitType... types) {
+ for (int i = 0; i < types.length; i++) {
+ conduitBlockPlacedEvent(w, dimension, location, types[i]);
+ }
+ }
+
+ /**
+ * Clears cached networks after a powered tile is loaded. A local invalidation
+ * is insufficient when another source cached a partial network before all
+ * neighboring chunks and tile entities were available.
+ *
+ * @param w world containing the loaded tile
+ * @param dimension dimension containing the loaded tile
+ * @param types power types whose cached networks must be rebuilt
+ */
+ public void conduitBlockLoadedEvent(World w, int dimension, ConduitType... types) {
+ if (w.isRemote) return;
+ clearIfWorldChanged(w, dimension);
+ for (ConduitType type : types) {
+ getConduitNetworkManager(type).invalidateAll();
+ }
+ }
+
+ /**
+ * Invoke this method anytime a conduit block is removed from the world
+ *
+ * @param w The world instance for this dimension
+ * @param dimension The ID number for this dimension
+ * @param location The position of the block being removed
+ * @param type The native energy type of the removed conduit block
+ */
+ public void conduitBlockRemovedEvent(World w, int dimension, BlockPos location, ConduitType type) {
+ if (w.isRemote) return; // ignore client-side
+ clearIfWorldChanged(w, dimension);
+ BlockPos4D coord = new BlockPos4D(dimension, location);
+ ConduitNetworkManager manager = getConduitNetworkManager(type);
+ manager.invalidate(coord);
+ for (int i = 0; i < EnumFacing.values().length; i++) {
+ EnumFacing face = EnumFacing.values()[i];
+ BlockPos4D n = coord.offset(face);
+ manager.invalidate(n);
+ }
+ }
+
+ /**
+ * Invoke this method anytime a conduit block is removed from the world
+ *
+ * @param w The world instance for this dimension
+ * @param dimension The ID number for this dimension
+ * @param location The position of the block being removed
+ * @param types The native energy type of the removed conduit block
+ */
+ public void conduitBlockRemovedEvent(World w, int dimension, BlockPos location, ConduitType... types) {
+ for (int i = 0; i < types.length; i++) {
+ conduitBlockRemovedEvent(w, dimension, location, types[i]);
+ }
+ }
+
+ /** Clears networks crossing a changed chunk, including adjacent pipe-only boundaries. */
+ @SubscribeEvent
+ public void onChunkLoad(ChunkEvent.Load event) {
+ invalidateChunk(event);
+ }
+
+ /** Clears networks before an unloaded section can be used for another transfer. */
+ @SubscribeEvent
+ public void onChunkUnload(ChunkEvent.Unload event) {
+ invalidateChunk(event);
+ }
+
+ private void invalidateChunk(ChunkEvent event) {
+ World world = event.getWorld();
+ if (world.isRemote) return;
+ int dimension = world.provider.getDimension();
+ clearIfWorldChanged(world, dimension);
+ for (ConduitNetworkManager manager : networkManagers.values()) {
+ manager.invalidateChunk(dimension, new ChunkPos(
+ event.getChunk().x, event.getChunk().z));
+ }
+ }
+
+ private ConduitNetworkManager getConduitNetworkManager(ConduitType type) {
+ if (networkManagers.containsKey(type)) {
+ return networkManagers.get(type);
+ } else {
+ ConduitNetworkManager manager = new ConduitNetworkManager(type);
+ networkManagers.put(type, manager);
+ return manager;
+ }
+ }
+
+ private void clearIfWorldChanged(World w, int dimension) {
+ World knownWorld = activeWorlds.get(dimension);
+ if (knownWorld == w) return;
+ if (knownWorld != null) {
+ networkManagers.clear();
+ activeWorlds.clear();
+ }
+ activeWorlds.put(dimension, w);
+ }
+}
diff --git a/src/main/java/com/mcmoddev/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/com/mcmoddev/poweradvantage/conduitnetwork/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/conduitnetwork/package-info.java
index 5a96a5da..e16e94ab 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.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/com/mcmoddev/poweradvantage/graphics/package-info.java b/src/main/java/zone/moddev/mc/basepower/graphics/package-info.java
similarity index 71%
rename from src/main/java/com/mcmoddev/poweradvantage/graphics/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/graphics/package-info.java
index 0a2cbe9c..29bc810f 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.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/com/mcmoddev/poweradvantage/gui/FilteredFluidTankGUI.java b/src/main/java/zone/moddev/mc/basepower/gui/FilteredFluidTankGUI.java
similarity index 95%
rename from src/main/java/com/mcmoddev/poweradvantage/gui/FilteredFluidTankGUI.java
rename to src/main/java/zone/moddev/mc/basepower/gui/FilteredFluidTankGUI.java
index 246cf219..0a34f69a 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/gui/FilteredFluidTankGUI.java
+++ b/src/main/java/zone/moddev/mc/basepower/gui/FilteredFluidTankGUI.java
@@ -1,8 +1,8 @@
-package com.mcmoddev.poweradvantage.gui;
+package zone.moddev.mc.basepower.gui;
import cyano.poweradvantage.api.fluid.FluidPoweredEntity;
import cyano.poweradvantage.api.simple.SimpleMachineGUI;
-import com.mcmoddev.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/com/mcmoddev/poweradvantage/gui/FluidTankGUI.java b/src/main/java/zone/moddev/mc/basepower/gui/FluidTankGUI.java
similarity index 97%
rename from src/main/java/com/mcmoddev/poweradvantage/gui/FluidTankGUI.java
rename to src/main/java/zone/moddev/mc/basepower/gui/FluidTankGUI.java
index 9e94c5b2..8173b374 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/gui/FluidTankGUI.java
+++ b/src/main/java/zone/moddev/mc/basepower/gui/FluidTankGUI.java
@@ -1,8 +1,8 @@
-package com.mcmoddev.poweradvantage.gui;
+package zone.moddev.mc.basepower.gui;
import cyano.poweradvantage.api.fluid.FluidPoweredEntity;
import cyano.poweradvantage.api.simple.SimpleMachineGUI;
-import com.mcmoddev.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.BufferBuilder;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/gui/FunctionalCreativeTab.java b/src/main/java/zone/moddev/mc/basepower/gui/FunctionalCreativeTab.java
similarity index 98%
rename from src/main/java/com/mcmoddev/poweradvantage/gui/FunctionalCreativeTab.java
rename to src/main/java/zone/moddev/mc/basepower/gui/FunctionalCreativeTab.java
index 0b16830d..bdd89f61 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/gui/FunctionalCreativeTab.java
+++ b/src/main/java/zone/moddev/mc/basepower/gui/FunctionalCreativeTab.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.gui;
+package zone.moddev.mc.basepower.gui;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/gui/StillGUI.java b/src/main/java/zone/moddev/mc/basepower/gui/StillGUI.java
similarity index 90%
rename from src/main/java/com/mcmoddev/poweradvantage/gui/StillGUI.java
rename to src/main/java/zone/moddev/mc/basepower/gui/StillGUI.java
index 2f4bac29..74ae7823 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/gui/StillGUI.java
+++ b/src/main/java/zone/moddev/mc/basepower/gui/StillGUI.java
@@ -1,8 +1,8 @@
-package com.mcmoddev.poweradvantage.gui;
+package zone.moddev.mc.basepower.gui;
import cyano.poweradvantage.api.simple.SimpleMachineGUI;
-import com.mcmoddev.poweradvantage.machines.fluidmachines.StillTileEntity;
-import com.mcmoddev.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/com/mcmoddev/poweradvantage/items/package-info.java b/src/main/java/zone/moddev/mc/basepower/gui/package-info.java
similarity index 77%
rename from src/main/java/com/mcmoddev/poweradvantage/items/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/gui/package-info.java
index 9d1cc773..e830c8e9 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.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 com.mcmoddev.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/com/mcmoddev/poweradvantage/init/Blocks.java b/src/main/java/zone/moddev/mc/basepower/init/Blocks.java
similarity index 93%
rename from src/main/java/com/mcmoddev/poweradvantage/init/Blocks.java
rename to src/main/java/zone/moddev/mc/basepower/init/Blocks.java
index e0f9e726..3b6bb2d3 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/Blocks.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Blocks.java
@@ -1,15 +1,15 @@
-package com.mcmoddev.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import com.mcmoddev.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 com.mcmoddev.poweradvantage.blocks.BlockFrame;
-import com.mcmoddev.poweradvantage.blocks.BlockPowerSwitch;
-import com.mcmoddev.poweradvantage.machines.conveyors.*;
-import com.mcmoddev.poweradvantage.machines.creative.InfiniteEnergyBlock;
-import com.mcmoddev.poweradvantage.machines.fluidmachines.*;
-import com.mcmoddev.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;
@@ -78,7 +78,7 @@ public static void init() {
if (initDone) return;
ItemGroups.init();
Fluids.init();
- com.mcmoddev.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/com/mcmoddev/poweradvantage/init/Entities.java b/src/main/java/zone/moddev/mc/basepower/init/Entities.java
similarity index 59%
rename from src/main/java/com/mcmoddev/poweradvantage/init/Entities.java
rename to src/main/java/zone/moddev/mc/basepower/init/Entities.java
index 2d1e6c67..daf3c900 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/Entities.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Entities.java
@@ -1,18 +1,17 @@
-package com.mcmoddev.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.datafix.FixTypes;
-import net.minecraft.util.datafix.IFixableData;
import net.minecraftforge.common.util.ModFixs;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.registry.GameRegistry;
-import com.mcmoddev.poweradvantage.PowerAdvantage;
-import com.mcmoddev.poweradvantage.machines.conveyors.*;
-import com.mcmoddev.poweradvantage.machines.creative.InfiniteEnergyTileEntity;
-import com.mcmoddev.poweradvantage.machines.fluidmachines.*;
-import com.mcmoddev.poweradvantage.machines.fluidmachines.modsupport.TerminalFluidPipeTileEntity;
+import zone.moddev.mc.basepower.PowerAdvantage;
+import zone.moddev.mc.basepower.compat.LegacyIdentity;
+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 {
@@ -23,7 +22,8 @@ public abstract class Entities {
public static void registerDataFixers() {
if (dataFixersRegistered) return;
ModFixs fixes = FMLCommonHandler.instance().getDataFixer().init(PowerAdvantage.MODID, 1);
- fixes.registerFix(FixTypes.BLOCK_ENTITY, new LegacyTileEntityIdFix(PowerAdvantage.MODID, 1));
+ fixes.registerFix(FixTypes.BLOCK_ENTITY, LegacyIdentity.tileIds(PowerAdvantage.LEGACY_MODID, PowerAdvantage.MODID, 1));
+ fixes.registerFix(FixTypes.ITEM_INSTANCE, LegacyIdentity.itemIds(PowerAdvantage.LEGACY_MODID, PowerAdvantage.MODID, 1));
dataFixersRegistered = true;
}
@@ -57,33 +57,4 @@ public static void registerTileEntity(Class extends TileEntity> tileEntityClas
GameRegistry.registerTileEntity(tileEntityClass, new ResourceLocation(PowerAdvantage.MODID, path));
}
- private static final class LegacyTileEntityIdFix implements IFixableData {
- private final String modid;
- private final int version;
-
- private LegacyTileEntityIdFix(String modid, int version) {
- this.modid = modid;
- this.version = version;
- }
-
- @Override
- public int getFixVersion() {
- return version;
- }
-
- @Override
- public NBTTagCompound fixTagCompound(NBTTagCompound compound) {
- if (compound.hasKey("id", 8)) {
- String id = compound.getString("id");
- String legacyPrefix = modid + ".";
- String legacyMinecraftPrefix = "minecraft:" + legacyPrefix;
- if (id.startsWith(legacyMinecraftPrefix)) {
- compound.setString("id", modid + ":" + id.substring(legacyMinecraftPrefix.length()));
- } else if (id.startsWith(legacyPrefix)) {
- compound.setString("id", modid + ":" + id.substring(legacyPrefix.length()));
- }
- }
- return compound;
- }
- }
}
diff --git a/src/main/java/zone/moddev/mc/basepower/init/Fluids.java b/src/main/java/zone/moddev/mc/basepower/init/Fluids.java
new file mode 100644
index 00000000..d0de8200
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/init/Fluids.java
@@ -0,0 +1,146 @@
+package zone.moddev.mc.basepower.init;
+
+import zone.moddev.mc.basepower.PowerAdvantage;
+import cyano.poweradvantage.api.ConduitType;
+import cyano.poweradvantage.api.fluid.ColoredFluid;
+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;
+import net.minecraftforge.fml.common.FMLLog;
+
+public abstract class Fluids {
+
+
+ private static boolean initDone = false;
+
+ /**
+ * This is the conduit type reported by pipes that transport fluids. Note that fluid machines
+ * report Fluids.fluidConduit_general for their type but offer specific fluids
+ * (such as water or lava) when fluid sources transmit their fluids to fluid consumers (allowing
+ * the consumers to generate requests based on the type of fluid on offer).
+ */
+ public static final ConduitType fluidConduit_general = new ConduitType("fluid");
+ private static ReversibleMap fluidConduitLUT = new ReversibleHashMap<>();
+ /**
+ * This is the conduit type equivalent of water
+ */
+ public static ConduitType fluidConduit_water;
+ /**
+ * This is the conduit type equivalent of lava
+ */
+ public static ConduitType fluidConduit_lava;
+
+ /**
+ * black gold
+ */
+ public static Fluid crude_oil;
+ /**
+ * general purpose (fuel) oil
+ */
+ public static Fluid refined_oil;
+
+ public static void init() {
+ if (initDone) return;
+
+ zone.moddev.mc.basepower.init.Materials.init();
+
+ fluidConduit_water = new ConduitType("water");
+ fluidConduit_lava = new ConduitType("lava");
+ fluidConduitLUT.put(FluidRegistry.WATER, fluidConduit_water);
+ fluidConduitLUT.put(FluidRegistry.LAVA, fluidConduit_lava);
+
+ crude_oil = newFluid(PowerAdvantage.MODID, "crude_oil", 850, 6000, 300, 0, 0xFFFFFFFF);//0xFF100808);
+ FluidRegistry.registerFluid(crude_oil);
+ refined_oil = newFluid(PowerAdvantage.MODID, "refined_oil", 720, 1000, 300, 0, 0xFFFFFFFF);//0xFFfef08e);
+ FluidRegistry.registerFluid(refined_oil);
+
+ initDone = true;
+ }
+
+
+ /**
+ * Creates a new fluid and registers it with the game.
+ *
+ * @param modID The ID of the mod that owns this fluid
+ * @param name The game registry name of the fluid
+ * @param density The density of the fluid (water is 1000)
+ * @param viscosity The viscosity of the fluid (water is 1000)
+ * @param temperature Temperature of the fluid, in Kelvin (default is 300)
+ * @param luminosity Glow factor for the fluid
+ * @param tintColor ARGB pixel value describing the color tint to apply to the fluid (use
+ * 0xFFFFFFFF if the texture is already colored)
+ * @return A new fluid instance.
+ */
+ private static Fluid newFluid(String modID, String name, int density, int viscosity, int temperature, int luminosity, int tintColor) {
+ if (PowerAdvantage.useOtherFluids && FluidRegistry.isFluidRegistered(name)) {
+ // fluid already exists. Use that one.
+ FMLLog.warning("Using fluid %s from %s instead of creating a new fluid %s:%s", FluidRegistry.getFluid(name).getName(),
+ FluidRegistry.getFluid(name).getFlowing().getNamespace(), modID, name);
+ return FluidRegistry.getFluid(name);
+ }
+ Fluid f = new ColoredFluid(name, new ResourceLocation(modID + ":blocks/" + name + "_still"), new ResourceLocation(modID + ":blocks/" + name + "_flow"), tintColor);
+ f.setDensity(density);
+ f.setViscosity(viscosity);
+ f.setTemperature(temperature);
+ f.setLuminosity(luminosity);
+ f.setUnlocalizedName(modID + "." + name);
+ FluidRegistry.registerFluid(f);
+ registerNewFluid(f);
+ FluidRegistry.addBucketForFluid(f);
+ return f;
+ }
+
+ /**
+ * Adds a fluid to the PowerAdvantage registry of fluids, generating the necessary conduit type
+ * object to represent the fluid in a power network
+ *
+ * @param f A new fluid
+ */
+ public static void registerNewFluid(Fluid f) {
+ ConduitType fluidType = new ConduitType(f.getUnlocalizedName());
+ fluidConduitLUT.put(f, fluidType);
+ }
+
+ /**
+ * Checks if the given conduit type represents a fluid
+ *
+ * @param type A conduit type
+ * @return True if type is a fluid, false otherwise
+ */
+ public static boolean isFluidType(ConduitType type) {
+ return type.equals(fluidConduit_general) || fluidConduitLUT.containsValue(type);
+ }
+
+ /**
+ * Converts a fluid to its conduit type representation
+ *
+ * @param f A fluid
+ * @return a conduit type associated with the fluid
+ */
+ public static ConduitType fluidToConduitType(Fluid f) {
+ if (fluidConduitLUT.containsKey(f)) {
+ return fluidConduitLUT.get(f);
+ } else {
+ ConduitType fluidType = new ConduitType(f.getUnlocalizedName());
+ fluidConduitLUT.put(f, fluidType);
+ return fluidType;
+ }
+ }
+
+
+ /**
+ * Converts a conduit type to the fluid that it represents
+ *
+ * @param t A conduit type
+ * @return the associated fluid, or null if t does not represent a fluid
+ */
+ public static Fluid conduitTypeToFluid(ConduitType t) {
+ if (fluidConduitLUT.containsValue(t)) {
+ return fluidConduitLUT.getKey(t);
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/com/mcmoddev/poweradvantage/init/Fuels.java b/src/main/java/zone/moddev/mc/basepower/init/Fuels.java
similarity index 77%
rename from src/main/java/com/mcmoddev/poweradvantage/init/Fuels.java
rename to src/main/java/zone/moddev/mc/basepower/init/Fuels.java
index 25ee5a81..f1cfaee5 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/Fuels.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Fuels.java
@@ -1,7 +1,8 @@
-package com.mcmoddev.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import com.mcmoddev.poweradvantage.compat.BaseMetalsCompat;
-import com.mcmoddev.poweradvantage.registry.FuelRegistry;
+import cyano.poweradvantage.api.FluidCategoryRegistry;
+import zone.moddev.mc.basepower.compat.BaseMetalsCompat;
+import zone.moddev.mc.basepower.registry.FuelRegistry;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.ForgeModContainer;
import net.minecraftforge.fluids.FluidStack;
@@ -27,7 +28,8 @@ public static void init() {
UniversalBucket ubItem = (UniversalBucket) ub.getItem();
FluidStack fs = ubItem.getFluid(ub);
if (fs != null && fs.amount > 0) {
- if (fs.getFluid() == Fluids.crude_oil) return (short) (fs.amount * CRUDE_OIL_FUEL_PER_FLUID_UNIT);
+ if (FluidCategoryRegistry.matches(FluidCategoryRegistry.CRUDE_OIL, fs.getFluid()))
+ return (short) (fs.amount * CRUDE_OIL_FUEL_PER_FLUID_UNIT);
if (fs.getFluid() == Fluids.refined_oil)
return (short) (fs.amount * REFINED_OIL_FUEL_PER_FLUID_UNIT);
}
diff --git a/src/main/java/com/mcmoddev/poweradvantage/init/GUI.java b/src/main/java/zone/moddev/mc/basepower/init/GUI.java
similarity index 93%
rename from src/main/java/com/mcmoddev/poweradvantage/init/GUI.java
rename to src/main/java/zone/moddev/mc/basepower/init/GUI.java
index 5e769763..19e15230 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/GUI.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/GUI.java
@@ -1,11 +1,11 @@
-package com.mcmoddev.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
import net.minecraft.util.ResourceLocation;
-import com.mcmoddev.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import cyano.poweradvantage.api.simple.SimpleMachineGUI;
-import com.mcmoddev.poweradvantage.gui.*;
-import com.mcmoddev.poweradvantage.math.Integer2D;
-import com.mcmoddev.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/com/mcmoddev/poweradvantage/init/ItemGroups.java b/src/main/java/zone/moddev/mc/basepower/init/ItemGroups.java
similarity index 90%
rename from src/main/java/com/mcmoddev/poweradvantage/init/ItemGroups.java
rename to src/main/java/zone/moddev/mc/basepower/init/ItemGroups.java
index 47a91f80..dedaa1c8 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/ItemGroups.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/ItemGroups.java
@@ -1,7 +1,7 @@
-package com.mcmoddev.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import com.mcmoddev.poweradvantage.PowerAdvantage;
-import com.mcmoddev.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/com/mcmoddev/poweradvantage/init/Items.java b/src/main/java/zone/moddev/mc/basepower/init/Items.java
similarity index 94%
rename from src/main/java/com/mcmoddev/poweradvantage/init/Items.java
rename to src/main/java/zone/moddev/mc/basepower/init/Items.java
index 844bc116..dc1c49ed 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/Items.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Items.java
@@ -1,7 +1,7 @@
-package com.mcmoddev.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import com.mcmoddev.poweradvantage.PowerAdvantage;
-import com.mcmoddev.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/com/mcmoddev/poweradvantage/init/Materials.java b/src/main/java/zone/moddev/mc/basepower/init/Materials.java
similarity index 78%
rename from src/main/java/com/mcmoddev/poweradvantage/init/Materials.java
rename to src/main/java/zone/moddev/mc/basepower/init/Materials.java
index f0467502..91af7879 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/Materials.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Materials.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
public class Materials {
diff --git a/src/main/java/com/mcmoddev/poweradvantage/init/ModSupport.java b/src/main/java/zone/moddev/mc/basepower/init/ModSupport.java
similarity index 98%
rename from src/main/java/com/mcmoddev/poweradvantage/init/ModSupport.java
rename to src/main/java/zone/moddev/mc/basepower/init/ModSupport.java
index 555eea7c..d36778b3 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/ModSupport.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/ModSupport.java
@@ -1,6 +1,6 @@
-package com.mcmoddev.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import com.mcmoddev.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;
diff --git a/src/main/java/zone/moddev/mc/basepower/init/OreSpawnWorldGen.java b/src/main/java/zone/moddev/mc/basepower/init/OreSpawnWorldGen.java
new file mode 100644
index 00000000..e7fa688c
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/init/OreSpawnWorldGen.java
@@ -0,0 +1,74 @@
+package zone.moddev.mc.basepower.init;
+
+import zone.moddev.mc.basepower.PowerAdvantage;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fml.common.FMLLog;
+import net.minecraftforge.fml.common.Loader;
+import zone.moddev.mc.orespawn.api.OreSpawnApi;
+import zone.moddev.mc.orespawn.api.WorldgenProvider;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+/** Registers PowerAdvantage's OreSpawn 4 world-generation contribution. */
+public final class OreSpawnWorldGen {
+ public static final ResourceLocation DESERT_CRUDE_OIL =
+ new ResourceLocation(PowerAdvantage.MODID, "fluid_deposit/desert_crude_oil");
+ private static final ResourceLocation CRUDE_OIL_BLOCK =
+ new ResourceLocation(PowerAdvantage.MODID, "crude_oil");
+ private static final ResourceLocation OVERWORLD = new ResourceLocation("minecraft", "overworld");
+ private static final ResourceLocation STONE_TAG = new ResourceLocation("forge", "stone");
+
+ private OreSpawnWorldGen() {
+ }
+
+ public static void register(Path configDirectory) {
+ WorldgenProvider provider = createProvider();
+ boolean accepted = OreSpawnApi.enqueue(provider);
+ String override = describeOverride(configDirectory);
+ String defaults = Loader.isModLoaded("mineralogy")
+ ? "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) {
+ FMLLog.warning("%s: OreSpawn rejected the typed world-generation provider; "
+ + "an authoritative provider override may already be active", PowerAdvantage.MODID);
+ }
+ }
+
+ public static WorldgenProvider createProvider() {
+ return WorldgenProvider.builder(PowerAdvantage.MODID, 1)
+ .fluidDeposit(DESERT_CRUDE_OIL, CRUDE_OIL_BLOCK, deposit -> deposit
+ .enabled(true)
+ .dimension(OVERWORLD, dimension -> dimension
+ .enabled(true)
+ .yRange(0, 48)
+ .attempts(0.08D)
+ .radius(5, 12)
+ .verticalRadius(2, 5)
+ .maxLobes(4)
+ .minSolidCover(2)
+ .minSolidShell(1)
+ .hostBlock(new ResourceLocation("minecraft", "stone"))
+ .hostTag(STONE_TAG)
+ .biomeDictionary("SANDY")
+ .excludeBiomeDictionary("BEACH")
+ .excludeBiomeDictionary("MESA")))
+ .build();
+ }
+
+ static String describeOverride(Path configDirectory) {
+ if (Files.isRegularFile(configDirectory.resolve(PowerAdvantage.MODID + "-orespawn.json"))) {
+ return "config/" + PowerAdvantage.MODID + "-orespawn.json (authoritative)";
+ }
+ if (Files.isRegularFile(configDirectory.resolve("orespawn").resolve(PowerAdvantage.MODID + ".json"))) {
+ return "config/orespawn/" + PowerAdvantage.MODID + ".json (legacy importer authority)";
+ }
+ if (Files.isRegularFile(configDirectory.resolve("orespawn3").resolve(PowerAdvantage.MODID + ".json"))) {
+ return "config/orespawn3/" + PowerAdvantage.MODID + ".json (legacy importer authority)";
+ }
+ return "none";
+ }
+}
diff --git a/src/main/java/com/mcmoddev/poweradvantage/init/Recipes.java b/src/main/java/zone/moddev/mc/basepower/init/Recipes.java
similarity index 79%
rename from src/main/java/com/mcmoddev/poweradvantage/init/Recipes.java
rename to src/main/java/zone/moddev/mc/basepower/init/Recipes.java
index 688c471c..c060d481 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/Recipes.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Recipes.java
@@ -1,10 +1,13 @@
-package com.mcmoddev.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import com.mcmoddev.poweradvantage.PowerAdvantage;
-import com.mcmoddev.poweradvantage.RecipeMode;
-import com.mcmoddev.poweradvantage.compat.BaseMetalsCompat;
-import com.mcmoddev.poweradvantage.registry.still.recipe.DistillationRecipeRegistry;
+import cyano.poweradvantage.api.FluidCategoryRegistry;
+import zone.moddev.mc.basepower.PowerAdvantage;
+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.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fml.common.FMLLog;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.oredict.OreDictionary;
@@ -82,4 +85,15 @@ public static void initDistillationRecipes(String[] distillRecipes) {
}
}
+ public static void initCrudeOilAliasDistillationRecipes() {
+ Fluid refinedOil = FluidRegistry.getFluid("refined_oil");
+ if (refinedOil == null) return;
+ for (String alias : FluidCategoryRegistry.getAliases(FluidCategoryRegistry.CRUDE_OIL)) {
+ Fluid input = FluidRegistry.getFluid(alias);
+ if (input != null && DistillationRecipeRegistry.getInstance().getDistillationRecipeForFluid(input) == null) {
+ DistillationRecipeRegistry.addDistillationRecipe(alias, 2, refinedOil.getName(), 1);
+ }
+ }
+ }
+
}
diff --git a/src/main/java/com/mcmoddev/poweradvantage/init/TreasureChests.java b/src/main/java/zone/moddev/mc/basepower/init/TreasureChests.java
similarity index 88%
rename from src/main/java/com/mcmoddev/poweradvantage/init/TreasureChests.java
rename to src/main/java/zone/moddev/mc/basepower/init/TreasureChests.java
index 2cd9e46e..e63b0099 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/TreasureChests.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/TreasureChests.java
@@ -1,6 +1,6 @@
-package com.mcmoddev.poweradvantage.init;
+package zone.moddev.mc.basepower.init;
-import com.mcmoddev.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import net.minecraftforge.fml.common.FMLLog;
import org.apache.logging.log4j.Level;
@@ -49,7 +49,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 +63,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 +77,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" +
diff --git a/src/main/java/com/mcmoddev/poweradvantage/init/Villages.java b/src/main/java/zone/moddev/mc/basepower/init/Villages.java
similarity index 97%
rename from src/main/java/com/mcmoddev/poweradvantage/init/Villages.java
rename to src/main/java/zone/moddev/mc/basepower/init/Villages.java
index a652ea84..bcc3b61e 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/Villages.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/Villages.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/poweradvantage/init/WorldGen.java b/src/main/java/zone/moddev/mc/basepower/init/WorldGen.java
similarity index 86%
rename from src/main/java/com/mcmoddev/poweradvantage/init/WorldGen.java
rename to src/main/java/zone/moddev/mc/basepower/init/WorldGen.java
index c8b73943..e25d91ce 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/init/WorldGen.java
+++ b/src/main/java/zone/moddev/mc/basepower/init/WorldGen.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/poweradvantage/init/package-info.java b/src/main/java/zone/moddev/mc/basepower/init/package-info.java
similarity index 78%
rename from src/main/java/com/mcmoddev/poweradvantage/init/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/init/package-info.java
index 9b9febb0..28a4285d 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.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/com/mcmoddev/poweradvantage/items/RotationTool.java b/src/main/java/zone/moddev/mc/basepower/items/RotationTool.java
similarity index 97%
rename from src/main/java/com/mcmoddev/poweradvantage/items/RotationTool.java
rename to src/main/java/zone/moddev/mc/basepower/items/RotationTool.java
index fe1cd62a..30d350c1 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/items/RotationTool.java
+++ b/src/main/java/zone/moddev/mc/basepower/items/RotationTool.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/poweradvantage/blocks/package-info.java b/src/main/java/zone/moddev/mc/basepower/items/package-info.java
similarity index 77%
rename from src/main/java/com/mcmoddev/poweradvantage/blocks/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/items/package-info.java
index 335c0081..04ef1d7b 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.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 com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/BlockConveyor.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyor.java
index d0a7f9f4..2ee5d92f 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/BlockConveyor.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyor.java
@@ -1,7 +1,7 @@
-package com.mcmoddev.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import cyano.poweradvantage.api.GUIBlock;
-import com.mcmoddev.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/com/mcmoddev/poweradvantage/machines/conveyors/BlockConveyorFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyorFilter.java
similarity index 97%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/BlockConveyorFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyorFilter.java
index 3939df5c..e13208b4 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/BlockConveyorFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyorFilter.java
@@ -1,8 +1,8 @@
-package com.mcmoddev.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import com.google.common.base.Predicate;
import cyano.poweradvantage.api.GUIBlock;
-import com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityBlockFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityBlockFilter.java
index b25d8740..8a65770f 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityBlockFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityBlockFilter.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityConveyor.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyor.java
index 72061bcd..ed4b0c4a 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityConveyor.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyor.java
@@ -1,6 +1,6 @@
-package com.mcmoddev.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
-import com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityConveyorFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyorFilter.java
index c8afc01d..31cc3ee0 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityConveyorFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyorFilter.java
@@ -1,6 +1,6 @@
-package com.mcmoddev.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
-import com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityFoodFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFoodFilter.java
index c9b66468..2425df87 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityFoodFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFoodFilter.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityFuelFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFuelFilter.java
similarity index 84%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityFuelFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFuelFilter.java
index 631cd732..513b8288 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityFuelFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFuelFilter.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.item.ItemStack;
diff --git a/src/main/java/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityInventoryFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityInventoryFilter.java
index 358d016c..6875aa01 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityInventoryFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityInventoryFilter.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.item.ItemStack;
diff --git a/src/main/java/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityOreFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOreFilter.java
index bab84e23..5573d7fe 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityOreFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOreFilter.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityOverflowFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOverflowFilter.java
index b20e5483..052ba25f 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityOverflowFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOverflowFilter.java
@@ -1,6 +1,6 @@
-package com.mcmoddev.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
-import com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityPlantFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityPlantFilter.java
index dace8978..6f6f65cc 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntityPlantFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityPlantFilter.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/poweradvantage/machines/conveyors/TileEntitySmeltableFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntitySmeltableFilter.java
similarity index 87%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntitySmeltableFilter.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntitySmeltableFilter.java
index e8091298..a8064322 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/conveyors/TileEntitySmeltableFilter.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntitySmeltableFilter.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/package-info.java
index 276bf587..f1881ac9 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.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 com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/creative/InfiniteEnergyBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyBlock.java
index cb22ece6..d75ce84a 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/creative/InfiniteEnergyBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyBlock.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/creative/InfiniteEnergyTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyTileEntity.java
index 11f7c0e0..76ad9c4b 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/creative/InfiniteEnergyTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyTileEntity.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidDischargeBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeBlock.java
index ec062c55..88597efd 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidDischargeBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeBlock.java
@@ -1,10 +1,10 @@
-package com.mcmoddev.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 com.mcmoddev.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/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidDischargeTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeTileEntity.java
similarity index 98%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidDischargeTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeTileEntity.java
index b6f7e238..382d66b8 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidDischargeTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeTileEntity.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine;
@@ -12,7 +12,7 @@
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
-import com.mcmoddev.poweradvantage.util.FluidHandlerHelper;
+import zone.moddev.mc.basepower.util.FluidHandlerHelper;
import net.minecraftforge.fluids.*;
import net.minecraftforge.fluids.capability.IFluidHandler;
diff --git a/src/main/java/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidDrainBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainBlock.java
index e10f63a1..e48d49d9 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidDrainBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainBlock.java
@@ -1,9 +1,9 @@
-package com.mcmoddev.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 com.mcmoddev.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/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidDrainTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainTileEntity.java
similarity index 98%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidDrainTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainTileEntity.java
index 1f2cdc09..c2daf22b 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidDrainTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainTileEntity.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.ConduitType;
import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine;
@@ -13,7 +13,7 @@
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
-import com.mcmoddev.poweradvantage.util.FluidHandlerHelper;
+import zone.moddev.mc.basepower.util.FluidHandlerHelper;
import net.minecraftforge.fluids.*;
import net.minecraftforge.fluids.capability.IFluidHandler;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidPipeBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidPipeBlock.java
similarity index 91%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidPipeBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidPipeBlock.java
index 4cb90c79..bf462121 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/FluidPipeBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidPipeBlock.java
@@ -1,8 +1,8 @@
-package com.mcmoddev.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.simple.BlockSimpleFluidConduit;
-import com.mcmoddev.poweradvantage.init.Blocks;
-import com.mcmoddev.poweradvantage.util.FluidHandlerHelper;
+import zone.moddev.mc.basepower.init.Blocks;
+import zone.moddev.mc.basepower.util.FluidHandlerHelper;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
diff --git a/src/main/java/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/fluidmachines/MetalTankBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankBlock.java
index b69dfdf7..b376e4f5 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/MetalTankBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankBlock.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/fluidmachines/MetalTankTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankTileEntity.java
index 2265e899..c7ba2fbe 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/MetalTankTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankTileEntity.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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(Fluid.BUCKET_VOLUME * 10, "tile.poweradvantage.fluid_metal_tank.name");
+ super(Fluid.BUCKET_VOLUME * 10, "tile.basepower.fluid_metal_tank.name");
}
diff --git a/src/main/java/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/fluidmachines/StillBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillBlock.java
index 354e0127..d4b79210 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/StillBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillBlock.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/poweradvantage/machines/fluidmachines/StillTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillTileEntity.java
similarity index 88%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/StillTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillTileEntity.java
index 3833a1e8..43c0997c 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/StillTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillTileEntity.java
@@ -1,18 +1,23 @@
-package com.mcmoddev.poweradvantage.machines.fluidmachines;
+package zone.moddev.mc.basepower.machines.fluidmachines;
import cyano.poweradvantage.api.fluid.FluidRequest;
import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine;
-import com.mcmoddev.poweradvantage.registry.FuelRegistry;
-import com.mcmoddev.poweradvantage.registry.still.recipe.DistillationRecipe;
-import com.mcmoddev.poweradvantage.registry.still.recipe.DistillationRecipeRegistry;
-import com.mcmoddev.poweradvantage.util.FluidIdHelper;
+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 zone.moddev.mc.basepower.util.FluidIdHelper;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
+import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.fluids.*;
+import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
+import net.minecraftforge.fluids.capability.FluidTankProperties;
+import net.minecraftforge.fluids.capability.IFluidHandler;
+import net.minecraftforge.fluids.capability.IFluidTankProperties;
@SuppressWarnings("deprecation")
public class StillTileEntity extends TileEntitySimpleFluidMachine {
@@ -40,6 +45,43 @@ public StillTileEntity() {
super(Fluid.BUCKET_VOLUME, StillTileEntity.class.getName());
}
+ @Override
+ public T getCapability(Capability capability, EnumFacing face) {
+ if (capability != CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
+ return super.getCapability(capability, face);
+ }
+ return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(new IFluidHandler() {
+ @Override public IFluidTankProperties[] getTankProperties() {
+ return new IFluidTankProperties[] {
+ new FluidTankProperties(inputTank.getFluid(), inputTank.getCapacity(), true, false) {
+ @Override public boolean canFillFluidType(FluidStack stack) {
+ return stack != null && StillTileEntity.this.canFill(face, stack.getFluid());
+ }
+ },
+ new FluidTankProperties(getTank().getFluid(), getTank().getCapacity(), false, true)
+ };
+ }
+
+ @Override public int fill(FluidStack stack, boolean execute) {
+ int filled = StillTileEntity.this.fill(face, stack, execute);
+ if (execute && filled > 0) markDirty();
+ return filled;
+ }
+
+ @Override public FluidStack drain(FluidStack stack, boolean execute) {
+ if (stack == null || !stack.isFluidEqual(getTank().getFluid())) return null;
+ return drain(stack.amount, execute);
+ }
+
+ @Override public FluidStack drain(int amount, boolean execute) {
+ if (amount <= 0) return null;
+ FluidStack drained = getTank().drain(amount, execute);
+ if (execute && drained != null && drained.amount > 0) markDirty();
+ return drained;
+ }
+ });
+ }
+
@Override
protected ItemStack[] getInventory() {
return inventory;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/StorageTankBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankBlock.java
similarity index 95%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/StorageTankBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankBlock.java
index 69f62522..10e22972 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/StorageTankBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankBlock.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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) Fluid.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;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/StorageTankTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankTileEntity.java
similarity index 96%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/StorageTankTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankTileEntity.java
index e781784d..dfe69814 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/StorageTankTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankTileEntity.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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(Fluid.BUCKET_VOLUME * 4, "tile.poweradvantage.fluid_storage_tank.name");
+ super(Fluid.BUCKET_VOLUME * 4, "tile.basepower.fluid_storage_tank.name");
}
/**
diff --git a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java
similarity index 91%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java
index 88de8bb1..ceed4445 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java
@@ -1,9 +1,9 @@
-package com.mcmoddev.poweradvantage.machines.fluidmachines.modsupport;
+package zone.moddev.mc.basepower.machines.fluidmachines.modsupport;
import cyano.poweradvantage.api.ConduitType;
-import com.mcmoddev.poweradvantage.init.Blocks;
-import com.mcmoddev.poweradvantage.machines.fluidmachines.FluidPipeBlock;
-import com.mcmoddev.poweradvantage.util.FluidHandlerHelper;
+import zone.moddev.mc.basepower.init.Blocks;
+import zone.moddev.mc.basepower.machines.fluidmachines.FluidPipeBlock;
+import zone.moddev.mc.basepower.util.FluidHandlerHelper;
import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.state.IBlockState;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java
similarity index 95%
rename from src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java
rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java
index 30d61116..4ce41863 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java
+++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java
@@ -1,13 +1,13 @@
-package com.mcmoddev.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 com.mcmoddev.poweradvantage.conduitnetwork.ConduitRegistry;
-import com.mcmoddev.poweradvantage.init.Fluids;
-import com.mcmoddev.poweradvantage.util.FluidHandlerHelper;
+import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry;
+import zone.moddev.mc.basepower.init.Fluids;
+import zone.moddev.mc.basepower.util.FluidHandlerHelper;
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 00000000..58c6c73e
--- /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/com/mcmoddev/poweradvantage/math/BlockPos4D.java b/src/main/java/zone/moddev/mc/basepower/math/BlockPos4D.java
similarity index 99%
rename from src/main/java/com/mcmoddev/poweradvantage/math/BlockPos4D.java
rename to src/main/java/zone/moddev/mc/basepower/math/BlockPos4D.java
index 299726cc..086fe6a6 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/math/BlockPos4D.java
+++ b/src/main/java/zone/moddev/mc/basepower/math/BlockPos4D.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/basepower/math/Integer2D.java b/src/main/java/zone/moddev/mc/basepower/math/Integer2D.java
new file mode 100644
index 00000000..b974d364
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/math/Integer2D.java
@@ -0,0 +1,33 @@
+package zone.moddev.mc.basepower.math;
+
+/**
+ * This class is used to store 2D integer coordinates
+ * @author DrCyano
+ *
+ */
+public final class Integer2D extends com.mcmoddev.poweradvantage.math.Integer2D {
+
+ /**
+ * Creates an integer pair to be used as 2D coordinates
+ *
+ * @param x X-coordinate of X,Y coordinate pair
+ * @param y Y-coordinate of X,Y coordinate pair
+ */
+ public Integer2D(int x, int y) {
+ super(x, y);
+ }
+
+ /**
+ * Generates an array of Integer2D objects from a series of integers
+ *
+ * @param xy Series of coordinates in order of x0, y0, x1, y1, ...
+ * @return Array of Integer2D instances
+ */
+ public static Integer2D[] fromCoordinates(int... xy) {
+ Integer2D[] arr = new Integer2D[xy.length / 2];
+ for (int i = 0; i < arr.length; i++) {
+ arr[i] = new Integer2D(xy[2 * i], xy[2 * i + 1]);
+ }
+ return arr;
+ }
+}
diff --git a/src/main/java/com/mcmoddev/poweradvantage/math/package-info.java b/src/main/java/zone/moddev/mc/basepower/math/package-info.java
similarity index 56%
rename from src/main/java/com/mcmoddev/poweradvantage/math/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/math/package-info.java
index ba2ed2d8..2ec83a06 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.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/com/mcmoddev/poweradvantage/package-info.java b/src/main/java/zone/moddev/mc/basepower/package-info.java
similarity index 82%
rename from src/main/java/com/mcmoddev/poweradvantage/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/package-info.java
index d8c0ec97..e4cdd203 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.poweradvantage;
\ No newline at end of file
+package zone.moddev.mc.basepower;
\ No newline at end of file
diff --git a/src/main/java/com/mcmoddev/poweradvantage/recipe/condition/NotRecipeModeConditionFactory.java b/src/main/java/zone/moddev/mc/basepower/recipe/condition/NotRecipeModeConditionFactory.java
similarity index 78%
rename from src/main/java/com/mcmoddev/poweradvantage/recipe/condition/NotRecipeModeConditionFactory.java
rename to src/main/java/zone/moddev/mc/basepower/recipe/condition/NotRecipeModeConditionFactory.java
index 05e674c8..0faa13c8 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/recipe/condition/NotRecipeModeConditionFactory.java
+++ b/src/main/java/zone/moddev/mc/basepower/recipe/condition/NotRecipeModeConditionFactory.java
@@ -1,8 +1,8 @@
-package com.mcmoddev.poweradvantage.recipe.condition;
+package zone.moddev.mc.basepower.recipe.condition;
import com.google.gson.JsonObject;
-import com.mcmoddev.poweradvantage.PowerAdvantage;
-import com.mcmoddev.poweradvantage.RecipeMode;
+import zone.moddev.mc.basepower.PowerAdvantage;
+import zone.moddev.mc.basepower.RecipeMode;
import net.minecraft.util.JsonUtils;
import net.minecraftforge.common.crafting.IConditionFactory;
import net.minecraftforge.common.crafting.JsonContext;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/recipe/condition/OreDictEmptyConditionFactory.java b/src/main/java/zone/moddev/mc/basepower/recipe/condition/OreDictEmptyConditionFactory.java
similarity index 91%
rename from src/main/java/com/mcmoddev/poweradvantage/recipe/condition/OreDictEmptyConditionFactory.java
rename to src/main/java/zone/moddev/mc/basepower/recipe/condition/OreDictEmptyConditionFactory.java
index 3e044915..5407ce22 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/recipe/condition/OreDictEmptyConditionFactory.java
+++ b/src/main/java/zone/moddev/mc/basepower/recipe/condition/OreDictEmptyConditionFactory.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.recipe.condition;
+package zone.moddev.mc.basepower.recipe.condition;
import com.google.gson.JsonObject;
import net.minecraft.util.JsonUtils;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/recipe/condition/RecipeModeConditionFactory.java b/src/main/java/zone/moddev/mc/basepower/recipe/condition/RecipeModeConditionFactory.java
similarity index 78%
rename from src/main/java/com/mcmoddev/poweradvantage/recipe/condition/RecipeModeConditionFactory.java
rename to src/main/java/zone/moddev/mc/basepower/recipe/condition/RecipeModeConditionFactory.java
index f35b8f40..a84376b7 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/recipe/condition/RecipeModeConditionFactory.java
+++ b/src/main/java/zone/moddev/mc/basepower/recipe/condition/RecipeModeConditionFactory.java
@@ -1,8 +1,8 @@
-package com.mcmoddev.poweradvantage.recipe.condition;
+package zone.moddev.mc.basepower.recipe.condition;
import com.google.gson.JsonObject;
-import com.mcmoddev.poweradvantage.PowerAdvantage;
-import com.mcmoddev.poweradvantage.RecipeMode;
+import zone.moddev.mc.basepower.PowerAdvantage;
+import zone.moddev.mc.basepower.RecipeMode;
import net.minecraft.util.JsonUtils;
import net.minecraftforge.common.crafting.IConditionFactory;
import net.minecraftforge.common.crafting.JsonContext;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/registry/FuelRegistry.java b/src/main/java/zone/moddev/mc/basepower/registry/FuelRegistry.java
similarity index 97%
rename from src/main/java/com/mcmoddev/poweradvantage/registry/FuelRegistry.java
rename to src/main/java/zone/moddev/mc/basepower/registry/FuelRegistry.java
index ec98b411..be5ea2c3 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/registry/FuelRegistry.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/FuelRegistry.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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 com.mcmoddev.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/basepower/registry/ITileEntityGUI.java b/src/main/java/zone/moddev/mc/basepower/registry/ITileEntityGUI.java
new file mode 100644
index 00000000..b89151cc
--- /dev/null
+++ b/src/main/java/zone/moddev/mc/basepower/registry/ITileEntityGUI.java
@@ -0,0 +1,35 @@
+package zone.moddev.mc.basepower.registry;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+/**
+ * This interface is used to combine the two different classes of a block GUI
+ * into a single object, which can then be added to the MachineGUIRegistry.
+ * @author DrCyano
+ *
+ */
+public interface ITileEntityGUI extends com.mcmoddev.poweradvantage.registry.ITileEntityGUI {
+ /**
+ * Gets an instance of net.minecraft.inventory.Container for the
+ * server-side portion of a GUI interaction.
+ *
+ * @param e The TileEntity that is presenting this GUI
+ * @param player The player that is going to use the GUI
+ * @return An instance of net.minecraft.inventory.Container
+ */
+ public abstract net.minecraft.inventory.Container getContainer(TileEntity e, EntityPlayer player);
+
+ /**
+ * Gets an instance of net.minecraft.client.gui.inventory.GuiContainer for
+ * the client-side portion of a GUI interaction.
+ *
+ * @param e The TileEntity that is presenting this GUI
+ * @param player The player that is going to use the GUI
+ * @return An instance of net.minecraft.client.gui.inventory.GuiContainer
+ */
+ @SideOnly(Side.CLIENT)
+ public abstract net.minecraft.client.gui.inventory.GuiContainer getContainerGUI(TileEntity e, EntityPlayer player);
+}
diff --git a/src/main/java/com/mcmoddev/poweradvantage/registry/MachineGUIRegistry.java b/src/main/java/zone/moddev/mc/basepower/registry/MachineGUIRegistry.java
similarity index 98%
rename from src/main/java/com/mcmoddev/poweradvantage/registry/MachineGUIRegistry.java
rename to src/main/java/zone/moddev/mc/basepower/registry/MachineGUIRegistry.java
index 16761ea5..384b308a 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/registry/MachineGUIRegistry.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/MachineGUIRegistry.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.registry;
+package zone.moddev.mc.basepower.registry;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/registry/package-info.java b/src/main/java/zone/moddev/mc/basepower/registry/package-info.java
similarity index 68%
rename from src/main/java/com/mcmoddev/poweradvantage/registry/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/registry/package-info.java
index b5c7066c..d22177c1 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/registry/still/recipe/DistillationRecipe.java
rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipe.java
index 7d9ddb53..4d7070f2 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/registry/still/recipe/DistillationRecipe.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipe.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/registry/still/recipe/DistillationRecipeRegistry.java
rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipeRegistry.java
index 8a58ae35..8c9d572d 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/registry/still/recipe/DistillationRecipeRegistry.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipeRegistry.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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 com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/registry/still/recipe/ExplicitFluidReference.java
rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/ExplicitFluidReference.java
index f912bfa9..fc1a7068 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/registry/still/recipe/ExplicitFluidReference.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/ExplicitFluidReference.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.registry.still.recipe;
+package zone.moddev.mc.basepower.registry.still.recipe;
import net.minecraftforge.fluids.Fluid;
diff --git a/src/main/java/com/mcmoddev/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/com/mcmoddev/poweradvantage/registry/still/recipe/FluidReference.java
rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/FluidReference.java
index 05b098df..e5ef7039 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/registry/still/recipe/FluidReference.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/FluidReference.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/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/com/mcmoddev/poweradvantage/registry/still/recipe/RegistryNameFluidReference.java
rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/RegistryNameFluidReference.java
index 72aabbfa..afb9582d 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/registry/still/recipe/RegistryNameFluidReference.java
+++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/RegistryNameFluidReference.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/poweradvantage/util/FluidHandlerHelper.java b/src/main/java/zone/moddev/mc/basepower/util/FluidHandlerHelper.java
similarity index 94%
rename from src/main/java/com/mcmoddev/poweradvantage/util/FluidHandlerHelper.java
rename to src/main/java/zone/moddev/mc/basepower/util/FluidHandlerHelper.java
index ef72c4a7..b7bb7776 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/util/FluidHandlerHelper.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/FluidHandlerHelper.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/util/FluidIdHelper.java b/src/main/java/zone/moddev/mc/basepower/util/FluidIdHelper.java
similarity index 94%
rename from src/main/java/com/mcmoddev/poweradvantage/util/FluidIdHelper.java
rename to src/main/java/zone/moddev/mc/basepower/util/FluidIdHelper.java
index 48f18de6..b111af0d 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/util/FluidIdHelper.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/FluidIdHelper.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/util/HashCodeHelper.java b/src/main/java/zone/moddev/mc/basepower/util/HashCodeHelper.java
similarity index 96%
rename from src/main/java/com/mcmoddev/poweradvantage/util/HashCodeHelper.java
rename to src/main/java/zone/moddev/mc/basepower/util/HashCodeHelper.java
index 34e6b878..c7b3a122 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/util/HashCodeHelper.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/HashCodeHelper.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
public abstract class HashCodeHelper {
diff --git a/src/main/java/com/mcmoddev/poweradvantage/util/InventoryWrapper.java b/src/main/java/zone/moddev/mc/basepower/util/InventoryWrapper.java
similarity index 99%
rename from src/main/java/com/mcmoddev/poweradvantage/util/InventoryWrapper.java
rename to src/main/java/zone/moddev/mc/basepower/util/InventoryWrapper.java
index a5f51fed..6ba3cc9b 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/util/InventoryWrapper.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/InventoryWrapper.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/com/mcmoddev/poweradvantage/util/PowerHelper.java b/src/main/java/zone/moddev/mc/basepower/util/PowerHelper.java
similarity index 94%
rename from src/main/java/com/mcmoddev/poweradvantage/util/PowerHelper.java
rename to src/main/java/zone/moddev/mc/basepower/util/PowerHelper.java
index 0119d953..fe3c9a71 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/util/PowerHelper.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/PowerHelper.java
@@ -1,7 +1,7 @@
-package com.mcmoddev.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
import cofh.api.energy.IEnergyReceiver;
-import com.mcmoddev.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/com/mcmoddev/poweradvantage/util/ReversibleHashMap.java b/src/main/java/zone/moddev/mc/basepower/util/ReversibleHashMap.java
similarity index 97%
rename from src/main/java/com/mcmoddev/poweradvantage/util/ReversibleHashMap.java
rename to src/main/java/zone/moddev/mc/basepower/util/ReversibleHashMap.java
index 15d38442..770ff7d2 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/util/ReversibleHashMap.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/ReversibleHashMap.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
import java.util.Collection;
import java.util.Map;
diff --git a/src/main/java/com/mcmoddev/poweradvantage/util/ReversibleMap.java b/src/main/java/zone/moddev/mc/basepower/util/ReversibleMap.java
similarity index 82%
rename from src/main/java/com/mcmoddev/poweradvantage/util/ReversibleMap.java
rename to src/main/java/zone/moddev/mc/basepower/util/ReversibleMap.java
index dd1503c5..fce0f4ca 100644
--- a/src/main/java/com/mcmoddev/poweradvantage/util/ReversibleMap.java
+++ b/src/main/java/zone/moddev/mc/basepower/util/ReversibleMap.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.util;
+package zone.moddev.mc.basepower.util;
public interface ReversibleMap extends java.util.Map {
diff --git a/src/main/java/com/mcmoddev/poweradvantage/util/package-info.java b/src/main/java/zone/moddev/mc/basepower/util/package-info.java
similarity index 56%
rename from src/main/java/com/mcmoddev/poweradvantage/util/package-info.java
rename to src/main/java/zone/moddev/mc/basepower/util/package-info.java
index bb17f239..e2fb4a05 100644
--- a/src/main/java/com/mcmoddev/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 com.mcmoddev.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/resources/assets/basepower/blockstates/converter_rf_electricity.json b/src/main/resources/assets/basepower/blockstates/converter_rf_electricity.json
new file mode 100644
index 00000000..c1651bf5
--- /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 00000000..ee86021f
--- /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 00000000..d27391c4
--- /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 00000000..499b8759
--- /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 00000000..e8b811cb
--- /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 00000000..7dc40c7e
--- /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 00000000..11898d24
--- /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 00000000..846b1b7e
--- /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 00000000..51f7d5d3
--- /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 00000000..8de48408
--- /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 00000000..c716e08f
--- /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 00000000..f2d91b3f
--- /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 00000000..4c349cc5
--- /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 00000000..2a5080ae
--- /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 00000000..f192d117
--- /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 00000000..286caf44
--- /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 00000000..8b6be877
--- /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 00000000..c73e9e65
--- /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 00000000..d446b803
--- /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 00000000..48007b4f
--- /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 00000000..3e7aaa33
--- /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 00000000..b1a03d50
--- /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 00000000..9a740fb4
--- /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 00000000..7b402a81
--- /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 00000000..4856eadf
--- /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 00000000..beab6a8c
--- /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 00000000..58c57550
--- /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=Power Advantage
+
+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 00000000..58c57550
--- /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=Power Advantage
+
+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 00000000..58c57550
--- /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=Power Advantage
+
+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 00000000..f3525fe7
--- /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=Power Advantage
+
+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 00000000..10254ce4
--- /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=Power Advantage
+
+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 00000000..bf1ffb64
--- /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=Power Advantage
+
+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 00000000..673795a5
--- /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 00000000..2a0ea30a
--- /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 00000000..a8b04efe
--- /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 00000000..0c47868b
--- /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 00000000..b9d1b837
--- /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 00000000..48f51d37
--- /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 00000000..611540f9
--- /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 01a03f62..dbdf82ad 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 82f513c9..5a534f0d 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 a831250b..b1fe2c85 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 00000000..102f1072
--- /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 00000000..2ee79703
--- /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 00000000..b076dd00
--- /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 33428415..85fc4abf 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 00000000..65e3862c
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_0.json
@@ -0,0 +1,7 @@
+{
+ "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 00000000..3de01b0f
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_densuw.json
@@ -0,0 +1,7 @@
+{
+ "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 00000000..c61fadb9
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_desuw.json
@@ -0,0 +1,7 @@
+{
+ "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 00000000..cfb26b68
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_dnu.json
@@ -0,0 +1,7 @@
+{
+ "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 00000000..d0f8c0c8
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_ensw.json
@@ -0,0 +1,7 @@
+{
+ "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 00000000..2401588e
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_n.json
@@ -0,0 +1,7 @@
+{
+ "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 00000000..b2dc847d
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_ns.json
@@ -0,0 +1,7 @@
+{
+ "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 00000000..eeaf1cc9
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nsuw.json
@@ -0,0 +1,7 @@
+{
+ "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 00000000..75c2bf60
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nsw.json
@@ -0,0 +1,7 @@
+{
+ "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 00000000..4dba871f
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nuw.json
@@ -0,0 +1,7 @@
+{
+ "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 00000000..a7aa067c
--- /dev/null
+++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nw.json
@@ -0,0 +1,7 @@
+{
+ "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 c8daff39..70f1e281 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 00000000..53991a62
--- /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 00000000..b132b591
--- /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 40f79af8..83005105 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 40f79af8..83005105 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 40f79af8..83005105 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 00000000..9da9824c
--- /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 00000000..fadbf83d
--- /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 00000000..67b14ad3
--- /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 00000000..41c8e925
--- /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 00000000..cbec1c3c
--- /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 00000000..040a4fd8
--- /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 00000000..4f71669f
--- /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 00000000..1e097b16
--- /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 00000000..ee436335
--- /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 6e5ef049..a423e34b 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 132b4027..89186905 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 399a8e43..2e3bb66b 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 00000000..96b8cfd8
--- /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 00000000..bc0182ff
--- /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 00000000..145160a4
--- /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 00000000..8016dd44
--- /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 00000000..20bffbeb
--- /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 00000000..77e6147c
--- /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 00000000..8c54bb8f
--- /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 00000000..d9af1467
--- /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 00000000..60de5a6c
--- /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 00000000..cc8c6058
--- /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 00000000..2cfca627
--- /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 00000000..2cfca627
--- /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 00000000..33831e30
--- /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 00000000..e62bd15b
--- /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 00000000..a1abf245
--- /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 00000000..53b56ddd
--- /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 00000000..e8f9061e
--- /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 00000000..f042d83c
--- /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 00000000..e820da77
--- /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 00000000..96db616c
--- /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 00000000..1399fb3c
--- /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 00000000..03a135df
--- /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 00000000..7a44c344
--- /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 00000000..caac6427
--- /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 00000000..40beb7ab
--- /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 00000000..5386d841
--- /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 498abaf3..e096fa4c 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 f26d4642..8555e9f9 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 ac3db87c..5e9dbcfe 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 00000000..78e655ea
--- /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 00000000..74f0491a
--- /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/basepower/recipes/_factories.json b/src/main/resources/assets/basepower/recipes/_factories.json
new file mode 100644
index 00000000..09f7fc2c
--- /dev/null
+++ b/src/main/resources/assets/basepower/recipes/_factories.json
@@ -0,0 +1,7 @@
+{
+ "conditions": {
+ "recipe_mode": "zone.moddev.mc.basepower.recipe.condition.RecipeModeConditionFactory",
+ "not_recipe_mode": "zone.moddev.mc.basepower.recipe.condition.NotRecipeModeConditionFactory",
+ "ore_dict_empty": "zone.moddev.mc.basepower.recipe.condition.OreDictEmptyConditionFactory"
+ }
+}
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_discharge.json b/src/main/resources/assets/basepower/recipes/fluid_discharge.json
similarity index 89%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_discharge.json
rename to src/main/resources/assets/basepower/recipes/fluid_discharge.json
index dd039fdb..0c5f1388 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_discharge.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_discharge.json
@@ -24,7 +24,7 @@
}
},
"result": {
- "item": "poweradvantage:fluid_discharge"
+ "item": "basepower:fluid_discharge"
},
"group": "fluid_machines"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_drain.json b/src/main/resources/assets/basepower/recipes/fluid_drain.json
similarity index 90%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_drain.json
rename to src/main/resources/assets/basepower/recipes/fluid_drain.json
index 066a9166..49499826 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_drain.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_drain.json
@@ -24,7 +24,7 @@
}
},
"result": {
- "item": "poweradvantage:fluid_drain"
+ "item": "basepower:fluid_drain"
},
"group": "fluid_machines"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_metal_tank_iron_normal.json b/src/main/resources/assets/basepower/recipes/fluid_metal_tank_iron_normal.json
similarity index 78%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_metal_tank_iron_normal.json
rename to src/main/resources/assets/basepower/recipes/fluid_metal_tank_iron_normal.json
index f7a0ffce..84d50f42 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_metal_tank_iron_normal.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_metal_tank_iron_normal.json
@@ -16,11 +16,11 @@
}
},
"result": {
- "item": "poweradvantage:fluid_metal_tank"
+ "item": "basepower:fluid_metal_tank"
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "NORMAL"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_metal_tank_steel.json b/src/main/resources/assets/basepower/recipes/fluid_metal_tank_steel.json
similarity index 85%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_metal_tank_steel.json
rename to src/main/resources/assets/basepower/recipes/fluid_metal_tank_steel.json
index 268706e2..1ea251be 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_metal_tank_steel.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_metal_tank_steel.json
@@ -16,7 +16,7 @@
}
},
"result": {
- "item": "poweradvantage:fluid_metal_tank"
+ "item": "basepower:fluid_metal_tank"
},
"group": "fluid_machines"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_copper_apocalyptic.json b/src/main/resources/assets/basepower/recipes/fluid_pipe_copper_apocalyptic.json
similarity index 76%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_pipe_copper_apocalyptic.json
rename to src/main/resources/assets/basepower/recipes/fluid_pipe_copper_apocalyptic.json
index 84184b8f..7ae03613 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_copper_apocalyptic.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_pipe_copper_apocalyptic.json
@@ -12,12 +12,12 @@
}
},
"result": {
- "item": "poweradvantage:fluid_pipe",
+ "item": "basepower:fluid_pipe",
"count": 3
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "APOCALYPTIC"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_copper_normal.json b/src/main/resources/assets/basepower/recipes/fluid_pipe_copper_normal.json
similarity index 76%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_pipe_copper_normal.json
rename to src/main/resources/assets/basepower/recipes/fluid_pipe_copper_normal.json
index 72d06a5f..560daabb 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_copper_normal.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_pipe_copper_normal.json
@@ -12,12 +12,12 @@
}
},
"result": {
- "item": "poweradvantage:fluid_pipe",
+ "item": "basepower:fluid_pipe",
"count": 6
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "NORMAL"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_iron_apocalyptic.json b/src/main/resources/assets/basepower/recipes/fluid_pipe_iron_apocalyptic.json
similarity index 76%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_pipe_iron_apocalyptic.json
rename to src/main/resources/assets/basepower/recipes/fluid_pipe_iron_apocalyptic.json
index 510eec30..61b12b57 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_iron_apocalyptic.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_pipe_iron_apocalyptic.json
@@ -12,12 +12,12 @@
}
},
"result": {
- "item": "poweradvantage:fluid_pipe",
+ "item": "basepower:fluid_pipe",
"count": 3
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "APOCALYPTIC"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_iron_normal.json b/src/main/resources/assets/basepower/recipes/fluid_pipe_iron_normal.json
similarity index 75%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_pipe_iron_normal.json
rename to src/main/resources/assets/basepower/recipes/fluid_pipe_iron_normal.json
index 20141152..caf98182 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_iron_normal.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_pipe_iron_normal.json
@@ -12,12 +12,12 @@
}
},
"result": {
- "item": "poweradvantage:fluid_pipe",
+ "item": "basepower:fluid_pipe",
"count": 6
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "NORMAL"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_iron_tech.json b/src/main/resources/assets/basepower/recipes/fluid_pipe_iron_tech.json
similarity index 76%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_pipe_iron_tech.json
rename to src/main/resources/assets/basepower/recipes/fluid_pipe_iron_tech.json
index 31b2694b..922ff11a 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_iron_tech.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_pipe_iron_tech.json
@@ -12,12 +12,12 @@
}
},
"result": {
- "item": "poweradvantage:fluid_pipe",
+ "item": "basepower:fluid_pipe",
"count": 6
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "TECH_PROGRESSION"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_lead_apocalyptic.json b/src/main/resources/assets/basepower/recipes/fluid_pipe_lead_apocalyptic.json
similarity index 76%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_pipe_lead_apocalyptic.json
rename to src/main/resources/assets/basepower/recipes/fluid_pipe_lead_apocalyptic.json
index 07569626..7b0d8f90 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_pipe_lead_apocalyptic.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_pipe_lead_apocalyptic.json
@@ -12,12 +12,12 @@
}
},
"result": {
- "item": "poweradvantage:fluid_pipe",
+ "item": "basepower:fluid_pipe",
"count": 3
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "APOCALYPTIC"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_storage_tank.json b/src/main/resources/assets/basepower/recipes/fluid_storage_tank.json
similarity index 85%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_storage_tank.json
rename to src/main/resources/assets/basepower/recipes/fluid_storage_tank.json
index 9eb41503..bd86624d 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_storage_tank.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_storage_tank.json
@@ -16,7 +16,7 @@
}
},
"result": {
- "item": "poweradvantage:fluid_storage_tank"
+ "item": "basepower:fluid_storage_tank"
},
"group": "fluid_machines"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/fluid_switch.json b/src/main/resources/assets/basepower/recipes/fluid_switch.json
similarity index 88%
rename from src/main/resources/assets/poweradvantage/recipes/fluid_switch.json
rename to src/main/resources/assets/basepower/recipes/fluid_switch.json
index 083cf0ad..c8cd51c6 100644
--- a/src/main/resources/assets/poweradvantage/recipes/fluid_switch.json
+++ b/src/main/resources/assets/basepower/recipes/fluid_switch.json
@@ -18,7 +18,7 @@
}
},
"result": {
- "item": "poweradvantage:fluid_switch"
+ "item": "basepower:fluid_switch"
},
"group": "fluid_machines"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/item_conveyor.json b/src/main/resources/assets/basepower/recipes/item_conveyor.json
similarity index 88%
rename from src/main/resources/assets/poweradvantage/recipes/item_conveyor.json
rename to src/main/resources/assets/basepower/recipes/item_conveyor.json
index 7012ade1..7848fc87 100644
--- a/src/main/resources/assets/poweradvantage/recipes/item_conveyor.json
+++ b/src/main/resources/assets/basepower/recipes/item_conveyor.json
@@ -19,7 +19,7 @@
}
},
"result": {
- "item": "poweradvantage:item_conveyor",
+ "item": "basepower:item_conveyor",
"count": 5
},
"group": "conveyors"
diff --git a/src/main/resources/assets/poweradvantage/recipes/item_filter_block.json b/src/main/resources/assets/basepower/recipes/item_filter_block.json
similarity index 74%
rename from src/main/resources/assets/poweradvantage/recipes/item_filter_block.json
rename to src/main/resources/assets/basepower/recipes/item_filter_block.json
index cfa04a40..6b330af8 100644
--- a/src/main/resources/assets/poweradvantage/recipes/item_filter_block.json
+++ b/src/main/resources/assets/basepower/recipes/item_filter_block.json
@@ -7,7 +7,7 @@
],
"key": {
"x": {
- "item": "poweradvantage:item_conveyor"
+ "item": "basepower:item_conveyor"
},
"y": {
"item": "minecraft:stone",
@@ -18,7 +18,7 @@
}
},
"result": {
- "item": "poweradvantage:item_filter_block"
+ "item": "basepower:item_filter_block"
},
"group": "conveyors"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/item_filter_food.json b/src/main/resources/assets/basepower/recipes/item_filter_food.json
similarity index 73%
rename from src/main/resources/assets/poweradvantage/recipes/item_filter_food.json
rename to src/main/resources/assets/basepower/recipes/item_filter_food.json
index f4543d09..1297fd90 100644
--- a/src/main/resources/assets/poweradvantage/recipes/item_filter_food.json
+++ b/src/main/resources/assets/basepower/recipes/item_filter_food.json
@@ -7,7 +7,7 @@
],
"key": {
"x": {
- "item": "poweradvantage:item_conveyor"
+ "item": "basepower:item_conveyor"
},
"y": {
"item": "minecraft:bread"
@@ -17,7 +17,7 @@
}
},
"result": {
- "item": "poweradvantage:item_filter_food"
+ "item": "basepower:item_filter_food"
},
"group": "conveyors"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/item_filter_fuel.json b/src/main/resources/assets/basepower/recipes/item_filter_fuel.json
similarity index 74%
rename from src/main/resources/assets/poweradvantage/recipes/item_filter_fuel.json
rename to src/main/resources/assets/basepower/recipes/item_filter_fuel.json
index 2ef78397..592bff0d 100644
--- a/src/main/resources/assets/poweradvantage/recipes/item_filter_fuel.json
+++ b/src/main/resources/assets/basepower/recipes/item_filter_fuel.json
@@ -7,7 +7,7 @@
],
"key": {
"x": {
- "item": "poweradvantage:item_conveyor"
+ "item": "basepower:item_conveyor"
},
"y": {
"item": "minecraft:coal",
@@ -18,7 +18,7 @@
}
},
"result": {
- "item": "poweradvantage:item_filter_fuel"
+ "item": "basepower:item_filter_fuel"
},
"group": "conveyors"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/item_filter_inventory.json b/src/main/resources/assets/basepower/recipes/item_filter_inventory.json
similarity index 72%
rename from src/main/resources/assets/poweradvantage/recipes/item_filter_inventory.json
rename to src/main/resources/assets/basepower/recipes/item_filter_inventory.json
index b9a3574f..167f9a62 100644
--- a/src/main/resources/assets/poweradvantage/recipes/item_filter_inventory.json
+++ b/src/main/resources/assets/basepower/recipes/item_filter_inventory.json
@@ -7,7 +7,7 @@
],
"key": {
"x": {
- "item": "poweradvantage:item_conveyor"
+ "item": "basepower:item_conveyor"
},
"y": {
"item": "minecraft:chest"
@@ -17,7 +17,7 @@
}
},
"result": {
- "item": "poweradvantage:item_filter_inventory"
+ "item": "basepower:item_filter_inventory"
},
"group": "conveyors"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/item_filter_ore.json b/src/main/resources/assets/basepower/recipes/item_filter_ore.json
similarity index 75%
rename from src/main/resources/assets/poweradvantage/recipes/item_filter_ore.json
rename to src/main/resources/assets/basepower/recipes/item_filter_ore.json
index 9d8c1fa9..30cab2f4 100644
--- a/src/main/resources/assets/poweradvantage/recipes/item_filter_ore.json
+++ b/src/main/resources/assets/basepower/recipes/item_filter_ore.json
@@ -7,7 +7,7 @@
],
"key": {
"x": {
- "item": "poweradvantage:item_conveyor"
+ "item": "basepower:item_conveyor"
},
"y": {
"type": "forge:ore_dict",
@@ -18,7 +18,7 @@
}
},
"result": {
- "item": "poweradvantage:item_filter_ore"
+ "item": "basepower:item_filter_ore"
},
"group": "conveyors"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/item_filter_overflow.json b/src/main/resources/assets/basepower/recipes/item_filter_overflow.json
similarity index 67%
rename from src/main/resources/assets/poweradvantage/recipes/item_filter_overflow.json
rename to src/main/resources/assets/basepower/recipes/item_filter_overflow.json
index de525d34..d6ec1f7e 100644
--- a/src/main/resources/assets/poweradvantage/recipes/item_filter_overflow.json
+++ b/src/main/resources/assets/basepower/recipes/item_filter_overflow.json
@@ -6,14 +6,14 @@
],
"key": {
"x": {
- "item": "poweradvantage:item_conveyor"
+ "item": "basepower:item_conveyor"
},
"z": {
"item": "minecraft:wooden_pressure_plate"
}
},
"result": {
- "item": "poweradvantage:item_filter_overflow"
+ "item": "basepower:item_filter_overflow"
},
"group": "conveyors"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/item_filter_plant.json b/src/main/resources/assets/basepower/recipes/item_filter_plant.json
similarity index 75%
rename from src/main/resources/assets/poweradvantage/recipes/item_filter_plant.json
rename to src/main/resources/assets/basepower/recipes/item_filter_plant.json
index d767e537..e2518443 100644
--- a/src/main/resources/assets/poweradvantage/recipes/item_filter_plant.json
+++ b/src/main/resources/assets/basepower/recipes/item_filter_plant.json
@@ -7,7 +7,7 @@
],
"key": {
"x": {
- "item": "poweradvantage:item_conveyor"
+ "item": "basepower:item_conveyor"
},
"y": {
"type": "forge:ore_dict",
@@ -18,7 +18,7 @@
}
},
"result": {
- "item": "poweradvantage:item_filter_plant"
+ "item": "basepower:item_filter_plant"
},
"group": "conveyors"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/item_filter_smelt.json b/src/main/resources/assets/basepower/recipes/item_filter_smelt.json
similarity index 73%
rename from src/main/resources/assets/poweradvantage/recipes/item_filter_smelt.json
rename to src/main/resources/assets/basepower/recipes/item_filter_smelt.json
index ed854d35..0a2eaf76 100644
--- a/src/main/resources/assets/poweradvantage/recipes/item_filter_smelt.json
+++ b/src/main/resources/assets/basepower/recipes/item_filter_smelt.json
@@ -7,7 +7,7 @@
],
"key": {
"x": {
- "item": "poweradvantage:item_conveyor"
+ "item": "basepower:item_conveyor"
},
"y": {
"item": "minecraft:furnace"
@@ -17,7 +17,7 @@
}
},
"result": {
- "item": "poweradvantage:item_filter_smelt"
+ "item": "basepower:item_filter_smelt"
},
"group": "conveyors"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/rotator_tool.json b/src/main/resources/assets/basepower/recipes/rotator_tool.json
similarity index 86%
rename from src/main/resources/assets/poweradvantage/recipes/rotator_tool.json
rename to src/main/resources/assets/basepower/recipes/rotator_tool.json
index e45df535..29cb8785 100644
--- a/src/main/resources/assets/poweradvantage/recipes/rotator_tool.json
+++ b/src/main/resources/assets/basepower/recipes/rotator_tool.json
@@ -16,7 +16,7 @@
}
},
"result": {
- "item": "poweradvantage:rotator_tool"
+ "item": "basepower:rotator_tool"
},
"group": "tools"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/sprocket_bronze_nugget_tech_no_rod.json b/src/main/resources/assets/basepower/recipes/sprocket_bronze_nugget_tech_no_rod.json
similarity index 74%
rename from src/main/resources/assets/poweradvantage/recipes/sprocket_bronze_nugget_tech_no_rod.json
rename to src/main/resources/assets/basepower/recipes/sprocket_bronze_nugget_tech_no_rod.json
index 19638164..f3a7e04e 100644
--- a/src/main/resources/assets/poweradvantage/recipes/sprocket_bronze_nugget_tech_no_rod.json
+++ b/src/main/resources/assets/basepower/recipes/sprocket_bronze_nugget_tech_no_rod.json
@@ -16,16 +16,16 @@
}
},
"result": {
- "item": "poweradvantage:sprocket",
+ "item": "basepower:sprocket",
"count": 4
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "TECH_PROGRESSION"
},
{
- "type": "poweradvantage:ore_dict_empty",
+ "type": "basepower:ore_dict_empty",
"ore": "rod"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/sprocket_rod_normal.json b/src/main/resources/assets/basepower/recipes/sprocket_rod_normal.json
similarity index 80%
rename from src/main/resources/assets/poweradvantage/recipes/sprocket_rod_normal.json
rename to src/main/resources/assets/basepower/recipes/sprocket_rod_normal.json
index cd893dc0..657a577d 100644
--- a/src/main/resources/assets/poweradvantage/recipes/sprocket_rod_normal.json
+++ b/src/main/resources/assets/basepower/recipes/sprocket_rod_normal.json
@@ -16,12 +16,12 @@
}
},
"result": {
- "item": "poweradvantage:sprocket",
+ "item": "basepower:sprocket",
"count": 4
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "NORMAL"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/sprocket_rod_tech.json b/src/main/resources/assets/basepower/recipes/sprocket_rod_tech.json
similarity index 80%
rename from src/main/resources/assets/poweradvantage/recipes/sprocket_rod_tech.json
rename to src/main/resources/assets/basepower/recipes/sprocket_rod_tech.json
index 85152156..e4551ae3 100644
--- a/src/main/resources/assets/poweradvantage/recipes/sprocket_rod_tech.json
+++ b/src/main/resources/assets/basepower/recipes/sprocket_rod_tech.json
@@ -16,12 +16,12 @@
}
},
"result": {
- "item": "poweradvantage:sprocket",
+ "item": "basepower:sprocket",
"count": 4
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "TECH_PROGRESSION"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/sprocket_stickwood_normal.json b/src/main/resources/assets/basepower/recipes/sprocket_stickwood_normal.json
similarity index 80%
rename from src/main/resources/assets/poweradvantage/recipes/sprocket_stickwood_normal.json
rename to src/main/resources/assets/basepower/recipes/sprocket_stickwood_normal.json
index a000cb6b..cbe9668b 100644
--- a/src/main/resources/assets/poweradvantage/recipes/sprocket_stickwood_normal.json
+++ b/src/main/resources/assets/basepower/recipes/sprocket_stickwood_normal.json
@@ -16,12 +16,12 @@
}
},
"result": {
- "item": "poweradvantage:sprocket",
+ "item": "basepower:sprocket",
"count": 4
},
"conditions": [
{
- "type": "poweradvantage:recipe_mode",
+ "type": "basepower:recipe_mode",
"mode": "NORMAL"
}
],
diff --git a/src/main/resources/assets/poweradvantage/recipes/steel_frame.json b/src/main/resources/assets/basepower/recipes/steel_frame.json
similarity index 82%
rename from src/main/resources/assets/poweradvantage/recipes/steel_frame.json
rename to src/main/resources/assets/basepower/recipes/steel_frame.json
index cf4b2091..e2ec8955 100644
--- a/src/main/resources/assets/poweradvantage/recipes/steel_frame.json
+++ b/src/main/resources/assets/basepower/recipes/steel_frame.json
@@ -12,7 +12,7 @@
}
},
"result": {
- "item": "poweradvantage:steel_frame"
+ "item": "basepower:steel_frame"
},
"group": "parts"
}
diff --git a/src/main/resources/assets/poweradvantage/recipes/still.json b/src/main/resources/assets/basepower/recipes/still.json
similarity index 89%
rename from src/main/resources/assets/poweradvantage/recipes/still.json
rename to src/main/resources/assets/basepower/recipes/still.json
index 7717c482..26524a4d 100644
--- a/src/main/resources/assets/poweradvantage/recipes/still.json
+++ b/src/main/resources/assets/basepower/recipes/still.json
@@ -17,7 +17,7 @@
}
},
"result": {
- "item": "poweradvantage:still"
+ "item": "basepower:still"
},
"group": "fluid_machines"
}
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 de3267f0..4f0718ac 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 4b721e09..0645f48c 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 de3267f0..4f0718ac 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 4b721e09..0645f48c 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 97d881ea..00000000
--- 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 5e285905..00000000
--- 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 110dd846..00000000
--- 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 f3c69427..00000000
--- 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 33f98428..00000000
--- 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 3997feec..00000000
--- 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 167fb814..00000000
--- 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 3d945543..00000000
--- 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 a6e77200..00000000
--- 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 1becb1c2..00000000
--- 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 a3e5b659..00000000
--- 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 8cc55cc4..00000000
--- 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 7ba2ae4c..00000000
--- 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 ea59a65c..00000000
--- 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 f0008637..00000000
--- 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 9ac27147..00000000
--- 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 f3d0201d..00000000
--- 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 e3ddd504..00000000
--- 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 cb50460c..00000000
--- 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 9983ebcc..00000000
--- 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 cae43edb..00000000
--- 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 ac947ea7..00000000
--- 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 072ae292..00000000
--- 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 c39fa3b5..00000000
--- 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 bcd36cb3..00000000
--- 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 6d09be01..00000000
--- 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 43ffeb7d..00000000
--- 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 43ffeb7d..00000000
--- 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 43ffeb7d..00000000
--- 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 c534462f..00000000
--- 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 2e39647c..00000000
--- 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 9f6054a1..00000000
--- 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 3a1bb88b..00000000
--- 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 749917d1..00000000
--- 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 8dc5fbb4..00000000
--- 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 199869da..00000000
--- 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 de5d6bed..00000000
--- 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 3141fcbe..00000000
--- 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 99b269e3..00000000
--- 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 7dff7e5a..00000000
--- 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 df0fc23e..00000000
--- 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 93445c16..00000000
--- 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 25307680..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_0.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 b27c5e3b..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_densuw.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 b28fbf1a..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_desuw.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 58ad993c..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_dnu.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 f909d919..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ensw.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 549fa775..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_n.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 46b2b21e..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ns.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 a2efd485..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsuw.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 a4d12d0a..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsw.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 2c6730c8..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nuw.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 03097f73..00000000
--- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nw.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "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 99376fe2..00000000
--- 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 a09edb76..00000000
--- 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 f176d901..00000000
--- 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 0d2c3a62..00000000
--- 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 2c1f6589..00000000
--- 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 d12bdefb..00000000
--- 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 45200ce2..00000000
--- 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 26dbe01c..00000000
--- 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 8abd3a4b..00000000
--- 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 4d16d31e..00000000
--- 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 49deac1d..00000000
--- 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 8c08c41c..00000000
--- 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 2d783539..00000000
--- 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 eb646820..00000000
--- 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 b9b04298..00000000
--- 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 ca2c0b82..00000000
--- 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 1ca73e42..00000000
--- 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 9a7a15f8..00000000
--- 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 e0bcaeee..00000000
--- 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 fc987457..00000000
--- 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 97ecaa98..00000000
--- 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 097b7358..00000000
--- 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 097b7358..00000000
--- 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 a337b200..00000000
--- 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 f00c5426..00000000
--- 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 5b216c85..00000000
--- 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 03aab32c..00000000
--- 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 231eb2ca..00000000
--- 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 4fa32a5d..00000000
--- 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 0e5aca23..00000000
--- 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 f238e136..00000000
--- 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 4fb288b6..00000000
--- 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 1e3a7703..00000000
--- 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 ba5c859c..00000000
--- 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 92ae073c..00000000
--- 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 74d98116..00000000
--- 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 d4f0bc20..00000000
--- 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 e87a33bb..00000000
--- 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 e70ea2ae..00000000
--- 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/assets/poweradvantage/recipes/_factories.json b/src/main/resources/assets/poweradvantage/recipes/_factories.json
deleted file mode 100644
index b2b96bce..00000000
--- a/src/main/resources/assets/poweradvantage/recipes/_factories.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "conditions": {
- "recipe_mode": "com.mcmoddev.poweradvantage.recipe.condition.RecipeModeConditionFactory",
- "not_recipe_mode": "com.mcmoddev.poweradvantage.recipe.condition.NotRecipeModeConditionFactory",
- "ore_dict_empty": "com.mcmoddev.poweradvantage.recipe.condition.OreDictEmptyConditionFactory"
- }
-}
diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info
index a78e7516..611a5e31 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/cyano/poweradvantage/api/fluid/FluidNetworkApiTest.java b/src/test/java/cyano/poweradvantage/api/fluid/FluidNetworkApiTest.java
new file mode 100644
index 00000000..4fa54b94
--- /dev/null
+++ b/src/test/java/cyano/poweradvantage/api/fluid/FluidNetworkApiTest.java
@@ -0,0 +1,111 @@
+package cyano.poweradvantage.api.fluid;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.junit.BeforeClass;
+
+import cyano.poweradvantage.api.ConduitType;
+import cyano.poweradvantage.api.IPowerMachine;
+import cyano.poweradvantage.api.PowerConnectorContext;
+import cyano.poweradvantage.api.PowerRequest;
+import net.minecraft.init.Bootstrap;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+public class FluidNetworkApiTest {
+ private static final ConduitType WATER = new ConduitType("test-water");
+
+ @BeforeClass
+ public static void initializeMinecraftRegistries() {
+ Bootstrap.register();
+ }
+
+ @Test
+ public void distributesOnlyWhatConsumersAccept() {
+ Sink partial = new Sink(25);
+ Sink full = new Sink(100);
+ int accepted = FluidNetworkApi.distributeFluid(Arrays.asList(
+ new PowerRequest(PowerRequest.HIGH_PRIORITY, 80, partial),
+ new PowerRequest(PowerRequest.MEDIUM_PRIORITY, 100, full)),
+ WATER, 100, PowerRequest.LAST_PRIORITY, null);
+ assertEquals(100, accepted);
+ assertEquals(25, partial.stored, 0);
+ assertEquals(75, full.stored, 0);
+ }
+
+ @Test
+ public void respectsPriorityAndSourceExclusion() {
+ Sink source = new Sink(100);
+ Sink lowPriority = new Sink(100);
+ int accepted = FluidNetworkApi.distributeFluid(Arrays.asList(
+ new PowerRequest(PowerRequest.HIGH_PRIORITY, 100, source),
+ new PowerRequest(PowerRequest.BACKUP_PRIORITY, 100, lowPriority)),
+ WATER, 100, PowerRequest.LOW_PRIORITY, source);
+ assertEquals(0, accepted);
+ assertEquals(0, source.stored, 0);
+ assertEquals(0, lowPriority.stored, 0);
+ }
+
+ @Test
+ public void rejectsInvalidDistributionArguments() {
+ assertEquals(0, FluidNetworkApi.distributeFluid(null, WATER, 100, PowerRequest.LAST_PRIORITY, null));
+ assertEquals(0, FluidNetworkApi.distributeFluid(Arrays.asList(), null, 100,
+ PowerRequest.LAST_PRIORITY, null));
+ assertEquals(0, FluidNetworkApi.distributeFluid(Arrays.asList(), WATER, 0,
+ PowerRequest.LAST_PRIORITY, null));
+ }
+
+ @Test
+ public void respectsTransferLimitWithoutMutatingOffer() {
+ Sink sink = new Sink(1000);
+ FluidStack offered = new FluidStack(FluidRegistry.WATER, 750);
+ int accepted = FluidNetworkApi.distributeFluid(Arrays.asList(
+ new PowerRequest(PowerRequest.MEDIUM_PRIORITY, 1000, sink)),
+ WATER, offered, 300, PowerRequest.LAST_PRIORITY, null);
+ assertEquals(300, accepted);
+ assertEquals(750, offered.amount);
+ }
+
+ @Test
+ public void clampsInvalidConsumerResponses() {
+ Sink overAccepting = new Sink(1000) {
+ @Override public float addEnergy(float energy, ConduitType type) { return energy + 100; }
+ };
+ Sink rejecting = new Sink(1000) {
+ @Override public float addEnergy(float energy, ConduitType type) { return -10; }
+ };
+ assertEquals(40, FluidNetworkApi.distributeFluid(Arrays.asList(
+ new PowerRequest(PowerRequest.MEDIUM_PRIORITY, 100, overAccepting)),
+ WATER, 40, PowerRequest.LAST_PRIORITY, null));
+ assertEquals(0, FluidNetworkApi.distributeFluid(Arrays.asList(
+ new PowerRequest(PowerRequest.MEDIUM_PRIORITY, 100, rejecting)),
+ WATER, 40, PowerRequest.LAST_PRIORITY, null));
+ }
+
+ private static class Sink implements IPowerMachine {
+ private final float acceptanceLimit;
+ private float stored;
+
+ private Sink(float acceptanceLimit) {
+ this.acceptanceLimit = acceptanceLimit;
+ }
+
+ @Override public float getEnergyCapacity(ConduitType type) { return acceptanceLimit; }
+ @Override public float getEnergy(ConduitType type) { return stored; }
+ @Override public void setEnergy(float energy, ConduitType type) { stored = energy; }
+ @Override public float addEnergy(float energy, ConduitType type) {
+ float accepted = Math.min(energy, acceptanceLimit - stored);
+ stored += accepted;
+ return accepted;
+ }
+ @Override public float subtractEnergy(float energy, ConduitType type) { return 0; }
+ @Override public PowerRequest getPowerRequest(ConduitType type) { return PowerRequest.REQUEST_NOTHING; }
+ @Override public boolean isPowerSink(ConduitType type) { return true; }
+ @Override public boolean isPowerSource(ConduitType type) { return false; }
+ @Override public boolean canAcceptConnection(PowerConnectorContext connection) { return true; }
+ @Override public ConduitType[] getTypes() { return new ConduitType[] { WATER }; }
+ }
+}
diff --git a/src/test/java/com/mcmoddev/poweradvantage/UniversalBucketStartupTest.java b/src/test/java/zone/moddev/mc/basepower/UniversalBucketStartupTest.java
similarity index 97%
rename from src/test/java/com/mcmoddev/poweradvantage/UniversalBucketStartupTest.java
rename to src/test/java/zone/moddev/mc/basepower/UniversalBucketStartupTest.java
index 5abb8091..a7096ab2 100644
--- a/src/test/java/com/mcmoddev/poweradvantage/UniversalBucketStartupTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/UniversalBucketStartupTest.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage;
+package zone.moddev.mc.basepower;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
diff --git a/src/test/java/com/mcmoddev/poweradvantage/compat/CarbonDustFallbackTest.java b/src/test/java/zone/moddev/mc/basepower/compat/CarbonDustFallbackTest.java
similarity index 98%
rename from src/test/java/com/mcmoddev/poweradvantage/compat/CarbonDustFallbackTest.java
rename to src/test/java/zone/moddev/mc/basepower/compat/CarbonDustFallbackTest.java
index 2e5b286b..b9e8d48d 100644
--- a/src/test/java/com/mcmoddev/poweradvantage/compat/CarbonDustFallbackTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/compat/CarbonDustFallbackTest.java
@@ -1,6 +1,6 @@
-package com.mcmoddev.poweradvantage.compat;
+package zone.moddev.mc.basepower.compat;
-import com.mcmoddev.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
import java.lang.reflect.Method;
import java.util.*;
import net.minecraft.init.Bootstrap;
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 00000000..97d9608d
--- /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 00000000..962466be
--- /dev/null
+++ b/src/test/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentityTest.java
@@ -0,0 +1,444 @@
+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 spawn = read(root.resolve("orespawn3/basepower.json")).getAsJsonObject("spawns")
+ .getAsJsonObject("basepower_crude_oil_0");
+ assertEquals("basepower:crude_oil", spawn.getAsJsonArray("blocks").get(0)
+ .getAsJsonObject().get("name").getAsString());
+ assertEquals(0.25, spawn.getAsJsonObject("parameters").get("frequency").getAsDouble(), 0);
+ assertEquals(64, spawn.getAsJsonObject("parameters").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 spawns = read(config.resolve("orespawn3/baseelectric.json")).getAsJsonObject("spawns");
+ assertEquals(2, spawns.size());
+ for (String output : new String[] {"li_ore", "sulfur_ore"}) {
+ JsonObject spawn = spawns.getAsJsonObject("baseelectric_" + output + ("li_ore".equals(output) ? "_0" : "_1"));
+ assertEquals(3, spawn.getAsJsonArray("dimensions").size());
+ assertEquals("baseelectric:" + output, spawn.getAsJsonArray("blocks").get(0)
+ .getAsJsonObject().get("name").getAsString());
+ }
+ assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric"));
+ }
+}
diff --git a/src/test/java/com/mcmoddev/poweradvantage/conduitnetwork/ConduitNetworkManagerTest.java b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManagerTest.java
similarity index 96%
rename from src/test/java/com/mcmoddev/poweradvantage/conduitnetwork/ConduitNetworkManagerTest.java
rename to src/test/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManagerTest.java
index 8e5f9b19..a0341202 100644
--- a/src/test/java/com/mcmoddev/poweradvantage/conduitnetwork/ConduitNetworkManagerTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManagerTest.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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 com.mcmoddev.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/com/mcmoddev/poweradvantage/conduitnetwork/LoadedConduitNetworkTest.java b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/LoadedConduitNetworkTest.java
similarity index 99%
rename from src/test/java/com/mcmoddev/poweradvantage/conduitnetwork/LoadedConduitNetworkTest.java
rename to src/test/java/zone/moddev/mc/basepower/conduitnetwork/LoadedConduitNetworkTest.java
index 55c9da6f..ba5baada 100644
--- a/src/test/java/com/mcmoddev/poweradvantage/conduitnetwork/LoadedConduitNetworkTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/LoadedConduitNetworkTest.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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 com.mcmoddev.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/com/mcmoddev/poweradvantage/conduitnetwork/PowerTransferAccountingTest.java b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/PowerTransferAccountingTest.java
similarity index 97%
rename from src/test/java/com/mcmoddev/poweradvantage/conduitnetwork/PowerTransferAccountingTest.java
rename to src/test/java/zone/moddev/mc/basepower/conduitnetwork/PowerTransferAccountingTest.java
index 66c63eb3..709e5940 100644
--- a/src/test/java/com/mcmoddev/poweradvantage/conduitnetwork/PowerTransferAccountingTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/PowerTransferAccountingTest.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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/basepower/init/LegacyOreSpawnMigrationTest.java b/src/test/java/zone/moddev/mc/basepower/init/LegacyOreSpawnMigrationTest.java
new file mode 100644
index 00000000..eeece284
--- /dev/null
+++ b/src/test/java/zone/moddev/mc/basepower/init/LegacyOreSpawnMigrationTest.java
@@ -0,0 +1,36 @@
+package zone.moddev.mc.basepower.init;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import zone.moddev.mc.basepower.compat.LegacyWorldgenIdentity;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class LegacyOreSpawnMigrationTest {
+ @Rule
+ public final TemporaryFolder temporary = new TemporaryFolder();
+
+ @Test
+ public void legacyOilIsOneRetainedRuleAndOverridesFreshApiDefaults() throws Exception {
+ 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"));
+ assertEquals(2, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower"));
+ JsonObject converted = new JsonParser().parse(new String(Files.readAllBytes(
+ config.resolve("orespawn3/basepower.json")), StandardCharsets.UTF_8)).getAsJsonObject();
+ assertEquals(1, converted.getAsJsonObject("spawns").entrySet().size());
+ assertEquals(1, OreSpawnWorldGen.createProvider().toJson()
+ .getAsJsonObject("fluid_deposits").entrySet().size());
+
+ assertTrue(OreSpawnWorldGen.describeOverride(config).contains("legacy importer authority"));
+ }
+}
diff --git a/src/test/java/com/mcmoddev/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/com/mcmoddev/poweradvantage/machines/conveyors/ConveyorTransferTest.java
rename to src/test/java/zone/moddev/mc/basepower/machines/conveyors/ConveyorTransferTest.java
index 1c9fa1c7..ba04e438 100644
--- a/src/test/java/com/mcmoddev/poweradvantage/machines/conveyors/ConveyorTransferTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/machines/conveyors/ConveyorTransferTest.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.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 com.mcmoddev.poweradvantage.util.InventoryWrapper;
+import zone.moddev.mc.basepower.util.InventoryWrapper;
import static org.junit.Assert.*;
public class ConveyorTransferTest {
diff --git a/src/test/java/com/mcmoddev/poweradvantage/machines/conveyors/SmeltableFilterTest.java b/src/test/java/zone/moddev/mc/basepower/machines/conveyors/SmeltableFilterTest.java
similarity index 94%
rename from src/test/java/com/mcmoddev/poweradvantage/machines/conveyors/SmeltableFilterTest.java
rename to src/test/java/zone/moddev/mc/basepower/machines/conveyors/SmeltableFilterTest.java
index d99345ea..0000d100 100644
--- a/src/test/java/com/mcmoddev/poweradvantage/machines/conveyors/SmeltableFilterTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/machines/conveyors/SmeltableFilterTest.java
@@ -1,4 +1,4 @@
-package com.mcmoddev.poweradvantage.machines.conveyors;
+package zone.moddev.mc.basepower.machines.conveyors;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
diff --git a/src/test/java/com/mcmoddev/poweradvantage/registry/MachineGuiTitleTest.java b/src/test/java/zone/moddev/mc/basepower/registry/MachineGuiTitleTest.java
similarity index 82%
rename from src/test/java/com/mcmoddev/poweradvantage/registry/MachineGuiTitleTest.java
rename to src/test/java/zone/moddev/mc/basepower/registry/MachineGuiTitleTest.java
index 69c52c64..f83eb264 100644
--- a/src/test/java/com/mcmoddev/poweradvantage/registry/MachineGuiTitleTest.java
+++ b/src/test/java/zone/moddev/mc/basepower/registry/MachineGuiTitleTest.java
@@ -1,7 +1,7 @@
-package com.mcmoddev.poweradvantage.registry;
+package zone.moddev.mc.basepower.registry;
-import com.mcmoddev.poweradvantage.machines.fluidmachines.MetalTankTileEntity;
-import com.mcmoddev.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
new file mode 100644
index 00000000..861b8d11
--- /dev/null
+++ b/src/test/resources/orespawn-legacy/poweradvantage.json
@@ -0,0 +1,18 @@
+{
+ "dimensions": [
+ {
+ "dimension": 0,
+ "ores": [
+ {
+ "blockID": "poweradvantage:crude_oil",
+ "size": 64,
+ "variation": 50,
+ "frequency": 0.25,
+ "minHeight": 16,
+ "maxHeight": 64,
+ "biomes": []
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-rig/build.gradle b/test-rig/build.gradle
index 714b1fe4..aa9b8471 100644
--- a/test-rig/build.gradle
+++ b/test-rig/build.gradle
@@ -30,7 +30,7 @@ repositories {
dependencies {
implementation minecraft.dependency("net.minecraftforge:forge:${project.minecraft_version}-${project.forge_version}")
compileOnly files(project.findProperty('powerAdvantageDeobfJar')
- ?: '../build/libs-dev/PowerAdvantage-2.4.1.112021-deobf.jar')
+ ?: '../build/libs-dev/basePower-2.4.4.112021-deobf.jar')
testImplementation 'junit:junit:4.13.2'
}
tasks.named('jar', Jar) {
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 6c821c18..4ea26ed0 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.112021",
clientSideOnly = true, acceptedMinecraftVersions = "[1.12.2]",
- dependencies = "required-after:poweradvantage;required-after:steamadvantage;required-after:electricadvantage")
+ dependencies = "required-after:basepower;required-after:basesteam;required-after:baseelectric")
@Mod.EventBusSubscriber(modid = ClientResourceProbe.MODID, 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 8e9eb67c..5829cb75 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 com.mcmoddev.poweradvantage.registry.MachineGUIRegistry;
+import zone.moddev.mc.basepower.registry.MachineGUIRegistry;
/** Renders every registered machine screen, not just its detached decorations. */
final class MachineGuiLayoutProbe {
@@ -162,11 +162,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, net.minecraft.item.ItemStack.EMPTY);
- if (block == com.mcmoddev.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 == com.mcmoddev.poweradvantage.init.Blocks.metal_storage_tank) {
+ if (block == zone.moddev.mc.basepower.init.Blocks.metal_storage_tank) {
verifyHelperLimits(screen);
}
row.addProperty("renders", renders);
@@ -388,10 +388,10 @@ private static void require(boolean value, String message) {
}
private static void verifyHelperLimits(RecordingScreen screen) throws Exception {
- for (String name : new String[]{"com.mcmoddev.electricadvantage.gui.GUIHelper",
- "com.mcmoddev.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 2f82b82b..bdbb23d8 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/gui-native-mappings.json b/test-rig/client-resources/resources/gui-native-mappings.json
index 39e245db..7099c348 100644
--- a/test-rig/client-resources/resources/gui-native-mappings.json
+++ b/test-rig/client-resources/resources/gui-native-mappings.json
@@ -12,8 +12,8 @@
"import net.minecraftforge.fluids.FluidTank;"
],
[
- "import zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry;",
- "import com.mcmoddev.poweradvantage.registry.MachineGUIRegistry;"
+ "import zone.moddev.mc.basepower.registry.MachineGUIRegistry;",
+ "import zone.moddev.mc.basepower.registry.MachineGUIRegistry;"
],
[
"net.minecraft.resources.IResource",
@@ -76,16 +76,16 @@
"net.minecraftforge.fluids.FluidRegistry.WATER"
],
[
- "zone.moddev.mc.poweradvantage.init.Blocks",
- "com.mcmoddev.poweradvantage.init.Blocks"
+ "zone.moddev.mc.basepower.init.Blocks",
+ "zone.moddev.mc.basepower.init.Blocks"
],
[
- "zone.moddev.mc.electricadvantage.gui.GUIHelper",
- "com.mcmoddev.electricadvantage.gui.GUIHelper"
+ "zone.moddev.mc.baseelectric.gui.GUIHelper",
+ "zone.moddev.mc.baseelectric.gui.GUIHelper"
],
[
- "zone.moddev.mc.steamadvantage.gui.GUIHelper",
- "com.mcmoddev.steamadvantage.gui.GUIHelper"
+ "zone.moddev.mc.basesteam.gui.GUIHelper",
+ "zone.moddev.mc.basesteam.gui.GUIHelper"
],
[
"net.minecraftforge.fml.ModList.get().isLoaded(",
diff --git a/test-rig/client-resources/resources/mcmod.info b/test-rig/client-resources/resources/mcmod.info
index 234e0480..2b147db8 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.112021",
"mcversion": "1.12.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 4c4ec735..c5725dad 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/native112.py b/test-rig/migration/native112.py
index a8075cb5..39ae6095 100644
--- a/test-rig/migration/native112.py
+++ b/test-rig/migration/native112.py
@@ -62,11 +62,13 @@ def pinned_profile(manifest_path, key):
actual = identity(path)
if actual != (jar["id"], jar["version"]):
raise ValueError("Wrong native mod identity/version: " + str(path))
- if jar["id"] in {"poweradvantage", "steamadvantage", "electricadvantage", "advantageworkstest"} and not jar["version"].endswith(".112021"):
+ if jar["id"] in {"poweradvantage", "steamadvantage", "electricadvantage",
+ "basepower", "basesteam", "baseelectric", "advantageworkstest"} and not jar["version"].endswith(".112021"):
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 != "target112" or target["launcher"] != LAUNCHER or not {"poweradvantage", "advantageworkstest"} <= ids:
+ if (key != "target112" or target["launcher"] != LAUNCHER or "advantageworkstest" not in ids
+ or len(ids & {"basepower", "poweradvantage"}) != 1):
raise ValueError("Incomplete/wrong native112 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/native112_base_worldgen.py b/test-rig/migration/native112_base_worldgen.py
new file mode 100644
index 00000000..48e688f5
--- /dev/null
+++ b/test-rig/migration/native112_base_worldgen.py
@@ -0,0 +1,124 @@
+"""Check actual saved ore and oil placements on sealed Forge 1.12.2 jars."""
+
+import argparse
+from collections import Counter
+from pathlib import Path
+import traceback
+
+import nbtlib
+
+from native112 import output_path, pinned_profile, require_disjoint
+from native112_code import verify_code
+from native112_lifecycle import read_json, require_native_boot, verify_staged
+from native112_rebrand import chunk, configure, nibble, registry, worldgen_rules
+from rig_transport import WORLD, Server, digest, stage, write_json
+
+
+OIL = "basepower:crude_oil"
+ORES = {"baseelectric:sulfur_ore", "baseelectric:li_ore"}
+SEED = "1739918491"
+
+
+def placements(world, dimension):
+ names = registry(nbtlib.load(world / "level.dat"), "blocks")
+ ids = {number for number, name in names.items() if name in ORES | {OIL}}
+ if len(ids) != 3:
+ raise AssertionError("World registry is missing an ore or crude oil")
+ folder = world if dimension == 0 else world / f"DIM{dimension}"
+ counts, heights, biomes = Counter(), {}, {}
+ populated = 0
+ for region in sorted((folder / "region").glob("r.*.mca")):
+ _, rx, rz, _ = region.name.split(".")
+ with region.open("rb") as stream:
+ header = stream.read(4096)
+ for slot in range(1024):
+ if not int.from_bytes(header[4 * slot:4 * slot + 3], "big"):
+ continue
+ x, z = 32 * int(rx) + slot % 32, 32 * int(rz) + slot // 32
+ data = chunk(folder, 16 * x, 16 * z)
+ if not int(data.get("TerrainPopulated", 0)):
+ continue
+ populated += 1
+ for section in data["Sections"]:
+ add = section.get("Add")
+ base_y = 16 * int(section["Y"])
+ for index, byte in enumerate(section["Blocks"]):
+ block = (int(byte) & 255) | (nibble(add, index) << 8)
+ if block not in ids:
+ continue
+ name = names[block]
+ counts[name] += 1
+ heights.setdefault(name, set()).add(base_y + index // 256)
+ biomes.setdefault(name, set()).add(int(data["Biomes"][index % 256]) & 255)
+ return dict(chunks=populated, blocks=dict(counts), heights={name: [min(ys), max(ys)] for name, ys in heights.items()},
+ biomes={name: sorted(values) for name, values in biomes.items()})
+
+
+def main():
+ cli = argparse.ArgumentParser(description=__doc__)
+ for name in ("manifest", "java8", "output"):
+ cli.add_argument("--" + name, type=Path, required=True)
+ cli.add_argument("--port", type=int, required=True)
+ args = cli.parse_args()
+ output = output_path(args.output)
+ manifest = read_json(args.manifest)
+ target = pinned_profile(args.manifest, "target112")
+ for path in (args.manifest, target[0], *target[2]):
+ require_disjoint(output, path)
+ output.mkdir()
+ report = dict(status="RUNNING", manifestSha256=digest(args.manifest), runnerSha256=digest(Path(__file__)),
+ seed=SEED, scope="Controlled populated desert and plains chunks with native stone hosts; not a normal-world frequency estimate",
+ worlds={})
+ try:
+ for label, biome in (("desert", 2), ("plains", 1)):
+ runtime = output / label
+ launcher = stage(runtime, target)
+ configure(runtime, args.port)
+ properties = runtime / "server.properties"
+ contents = [line for line in properties.read_text().splitlines()
+ if not line.startswith(("generator-settings=", "level-seed="))]
+ contents.extend(("level-seed=" + SEED,
+ f"generator-settings=3;minecraft:bedrock,60*minecraft:stone,3*minecraft:sand;{biome};"))
+ properties.write_text("\n".join(contents) + "\n", encoding="ascii")
+ verify_code(runtime, manifest["target112"]["serverCode"])
+ verify_staged(runtime, target)
+ first = None
+ world = runtime / WORLD
+ for phase in ("initial", "restart"):
+ server = Server(runtime, args.java8, launcher, phase, query_result="cancel")
+ try:
+ server.send("save-all flush")
+ server.wait("Saved the world", 90)
+ finally:
+ server.close()
+ require_native_boot(runtime / f"console-{phase}.log")
+ outcome = placements(world, 0)
+ if first is not None and outcome != first:
+ raise AssertionError(f"Saved ore or oil placements changed after restart in {label}")
+ first = outcome
+ verify_staged(runtime, target)
+ report["worlds"][label] = outcome
+ rules = worldgen_rules(runtime)
+ if (outcome["chunks"] < 100 or set(rules) != {"basepower:fluid_deposit/desert_crude_oil",
+ "baseelectric:ore/sulfur", "baseelectric:ore/lithium"}):
+ raise AssertionError(f"Missing populated chunks or fresh default rules in {label}")
+ for ore in ORES:
+ if outcome["blocks"].get(ore, 0) <= 0 or outcome["biomes"].get(ore) != [biome]:
+ raise AssertionError(f"No real {ore} was placed in {label}")
+ if label == "desert":
+ if outcome["blocks"].get(OIL, 0) <= 0 or outcome["biomes"].get(OIL) != [biome]:
+ raise AssertionError("No actual crude oil in sampled desert chunks")
+ if outcome["heights"][OIL][1] >= 61:
+ raise AssertionError("Oil breached the cover of the desert fixture")
+ elif outcome["blocks"].get(OIL, 0) != 0:
+ raise AssertionError("Oil generated outside the desert control")
+ report["status"] = "PASS"
+ except Exception as error:
+ report.update(status="FAIL", failure=str(error), traceback=traceback.format_exc())
+ write_json(output / "worldgen-results.json", report)
+ print(report["status"] + ": " + str(output / "worldgen-results.json"))
+ return int(report["status"] != "PASS")
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/test-rig/migration/native112_crusher_migration.py b/test-rig/migration/native112_crusher_migration.py
new file mode 100644
index 00000000..91286b7f
--- /dev/null
+++ b/test-rig/migration/native112_crusher_migration.py
@@ -0,0 +1,113 @@
+"""Open a copy of a legacy Advantage 1.12 save and verify its MMDLib crusher IDs."""
+
+import argparse
+from pathlib import Path
+import shutil
+import traceback
+
+import nbtlib
+
+from native112 import output_path, pinned_profile, require_disjoint
+from native112_code import verify_code
+from native112_lifecycle import read_json, require_native_boot, verify_staged
+from native112_rebrand import ALIASES, canonical, command, configure
+from rig_transport import WORLD, Server, digest, fingerprint, stage, write_json
+
+REGISTRY = "mmdlib:crusher_registry"
+UNKNOWN_RECIPE = "poweradvantage:advantageworks_unknown_crusher_recipe"
+
+
+def registry(world):
+ entries = nbtlib.load(world / "level.dat")["FML"]["Registries"][REGISTRY]
+ return {str(row["K"]): int(row["V"]) for row in entries["ids"]}
+
+
+def assert_unknown_recipe_is_not_dropped(output, source, config, profile, args):
+ runtime = output / "unknown-recipe-control"
+ launcher = stage(runtime, profile)
+ configure(runtime, args.port)
+ world = runtime / WORLD
+ shutil.copytree(source, world)
+ shutil.copytree(config, runtime / "config")
+ header = world / "level.dat"
+ document = nbtlib.load(header)
+ entries = document["FML"]["Registries"][REGISTRY]["ids"]
+ entries.append(nbtlib.Compound({"K": nbtlib.String(UNKNOWN_RECIPE),
+ "V": nbtlib.Int(max(int(entry["V"]) for entry in entries) + 1)}))
+ document.save(header, gzipped=True)
+ regions = fingerprint(world / "region")
+ try:
+ server = Server(runtime, args.java8, launcher, "unknown", query_result="cancel")
+ except RuntimeError:
+ pass
+ else:
+ server.close()
+ raise AssertionError("Forge opened a world with an unknown crusher recipe")
+ log = runtime / "console-unknown.log"
+ messages = log.read_text(encoding="utf-8", errors="replace")
+ if ("Missing " + REGISTRY + ":\n " + UNKNOWN_RECIPE not in messages or "Done (" in messages
+ or registry(world).get(UNKNOWN_RECIPE) is None or fingerprint(world / "region") != regions):
+ raise AssertionError("Forge did not refuse the unknown recipe without altering the save")
+ return dict(status="PASS", recipe=UNKNOWN_RECIPE, logSha256=digest(log))
+
+
+def run(args):
+ source = args.world.resolve(strict=True)
+ config = args.config.resolve(strict=True)
+ manifest = args.manifest.resolve(strict=True)
+ output = output_path(args.output)
+ profile = pinned_profile(manifest, "target112")
+ for path in (source, config, manifest, profile[0], *profile[2]):
+ require_disjoint(output, path)
+ source_world = fingerprint(source)
+ source_config = fingerprint(config)
+ expected = {canonical(name): number for name, number in registry(source).items()
+ if name.split(":", 1)[0] in ALIASES}
+ if not expected:
+ raise AssertionError("Source has no old Advantage recipes in " + REGISTRY)
+ output.mkdir()
+ runtime = output / "runtime"
+ report = dict(status="RUNNING", manifestSha256=digest(manifest), expected=expected, phases={})
+ try:
+ launcher = stage(runtime, profile)
+ configure(runtime, args.port)
+ shutil.copytree(source, runtime / WORLD)
+ shutil.copytree(config, runtime / "config")
+ if fingerprint(runtime / WORLD) != source_world or fingerprint(runtime / "config") != source_config:
+ raise AssertionError("Fixture changed while copying")
+ for phase in ("first", "restart"):
+ verify_code(runtime, read_json(manifest)["target112"]["serverCode"])
+ verify_staged(runtime, profile)
+ server = Server(runtime, args.java8, launcher, phase, query_result="cancel")
+ try:
+ command(server, "save-all flush", "Saved the world")
+ finally:
+ server.close()
+ log = runtime / f"console-{phase}.log"
+ require_native_boot(log)
+ saved = registry(runtime / WORLD)
+ observed = {name: saved.get(name) for name in expected}
+ report["phases"][phase] = dict(observed=observed, logSha256=digest(log))
+ if observed != expected:
+ raise AssertionError("Saved crusher IDs differ: " + str(observed))
+ if any(name.split(":", 1)[0] in ALIASES for name in saved):
+ raise AssertionError("Save still uses old Advantage crusher IDs")
+ report["unknownRecipeControl"] = assert_unknown_recipe_is_not_dropped(output, source, config, profile, args)
+ report["status"] = "PASS"
+ except Exception as error:
+ report.update(status="FAIL", failure=str(error), traceback=traceback.format_exc())
+ finally:
+ report["sourceUnchanged"] = source_world == fingerprint(source) and source_config == fingerprint(config)
+ if not report["sourceUnchanged"]:
+ report["status"] = "FAIL"
+ write_json(output / "crusher-migration-results.json", report)
+ print(report["status"] + ": " + str(output / "crusher-migration-results.json"))
+ return int(report["status"] != "PASS")
+
+
+if __name__ == "__main__":
+ cli = argparse.ArgumentParser(description=__doc__)
+ for option in ("world", "config", "manifest", "java8", "output"):
+ cli.add_argument("--" + option, type=Path, required=True)
+ cli.add_argument("--port", type=int, required=True)
+ raise SystemExit(run(cli.parse_args()))
diff --git a/test-rig/migration/native112_endurance_audit.py b/test-rig/migration/native112_endurance_audit.py
new file mode 100644
index 00000000..3020634d
--- /dev/null
+++ b/test-rig/migration/native112_endurance_audit.py
@@ -0,0 +1,91 @@
+"""Independently reconcile the native Steam endurance ledger and its saved endpoint."""
+
+import argparse
+import math
+from pathlib import Path
+import struct
+
+import nbtlib
+
+from native112_machine_operations import validate_restart
+from native112_lifecycle import read_json
+from rig_transport import digest
+from steam_control_audit import require
+
+TICKS = 36000
+TICKS_PER_CRUSH = 125
+STEAM_PER_TICK = 1.5
+MAX_IDLE_PER_TICK = 9 / 16
+
+
+def audit(runtime):
+ names = ["native112-machine-operation-results.json", "advantage-works-results/machine-operation-measured.json",
+ "machine-operation-fixture.json", "advantage-works-results/machine-inspection-restarted.json"]
+ paths = [runtime / name for name in names]
+ hashes = [digest(path) for path in paths]
+ suite, measured, fixture, cold = map(read_json, paths)
+ require(suite["status"] == "PASS" and suite["protocolUnchanged"]
+ and digest(Path(suite["manifest"])) == suite["manifestSha256"],
+ "Underlying native endurance qualification is not a pass")
+ require(suite["group"] == "endurance" and measured["held"] and len(measured["cases"]) == 1,
+ "Expected exactly one held, full-duration endurance case")
+ require(validate_restart(fixture, cold)["status"] == "PASS", "Independent cold comparison failed")
+ case = measured["cases"][0]
+ require(case["id"] == "steam/lifecycle/network-endurance-30min" and case["status"] == "PASS",
+ "Wrong or failed endurance witness")
+ require(case["finishTick"] - case["startTick"] == case["lifecycle.measuredTicks"] == TICKS,
+ "Not exactly 36,000 natural ticks")
+ seconds = case["lifecycle.measuredWallSeconds"]
+ require(math.isfinite(seconds) and seconds >= 1799, "Insufficient first-to-last wall time")
+ require(case["lifecycle.wallStartMeasuredTick"] == 1 and case["lifecycle.wallEndMeasuredTick"] == TICKS,
+ "The wall clock was not tied to the full measurement window")
+ frames = case["lifecycle.checkpoints"]
+ batches = case["lifecycle.completedBatches"]
+ require([frame["tick"] for frame in frames] == list(range(0, TICKS + 1, 1000)), "Missing checkpoints")
+ for frame in frames + batches:
+ require(frame["inputs"] + frame["products"] == 320, "Lost or created items")
+ require(len(frame["sourceSteam"]) == 8 and all(0 <= amount <= 10000 for amount in frame["sourceSteam"]),
+ "Invalid finite steam stock")
+ require(sum(frame["sourceSteam"]) + frame["machineSteam"] == frame["totalSteam"],
+ "Incorrect steam ledger total")
+ for ordinal, batch in enumerate(batches, 1):
+ require(batch["products"] == batch["ordinal"] == ordinal and batch["progress"] == 0,
+ "Invalid batch order")
+ if ordinal > 1:
+ require(batch["tick"] - batches[ordinal - 2]["tick"] == TICKS_PER_CRUSH,
+ "Processing stalled after warmup")
+ before, after = frames[0], frames[-1]
+ require(before["totalSteam"] == 80000 and before["inputs"] == 320 and before["products"] == 0,
+ "Wrong starting stock")
+ paid = after["products"] * TICKS_PER_CRUSH + after["progress"]
+ idle = before["totalSteam"] - after["totalSteam"] - paid * STEAM_PER_TICK
+ require(after["products"] == len(batches) == 287 and case["lifecycle.lostProgressTicks"] == 0,
+ "Expected 287 completed batches with no lost progress")
+ require(paid == case["lifecycle.paidWorkTicks"] and 0 <= idle <= TICKS * MAX_IDLE_PER_TICK
+ and idle == case["lifecycle.idleSteamLoss"], "Steam accounting does not reconcile")
+ raw = [(row["block"], nbtlib.parse_nbt(row["nbt"])) for row in case["after"] if "nbt" in row]
+ steam = sum(struct.unpack(">f", struct.pack(">i", int(data["Energy"][0])))[0]
+ for block, data in raw if block in ("basesteam:steam_crusher", "basesteam:steam_tank"))
+ crusher, = (data for block, data in raw if block == "basesteam:steam_crusher")
+ stacks = [entry for _, data in raw for entry in data.get("Items", ())]
+ stocks = {id: sum(int(entry["Count"]) for entry in stacks if str(entry["id"]) == id)
+ for id in ("minecraft:stone", "minecraft:cobblestone")}
+ require(steam == after["totalSteam"] and int(crusher["progress"]) == after["progress"]
+ and stocks == {"minecraft:stone": after["inputs"], "minecraft:cobblestone": after["products"]},
+ "Ledger does not match actual end-of-run machine and chest NBT")
+ require(hashes == [digest(path) for path in paths], "Evidence changed during the audit")
+ return dict(status="PASS", ticks=TICKS, seconds=seconds, completed=after["products"], paidTicks=paid,
+ remainingSteam=steam, idleSteamLoss=idle, manifestSha256=suite["manifestSha256"],
+ inputSha256=dict(zip(names, hashes)))
+
+
+if __name__ == "__main__":
+ import json
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--runtime", type=Path, required=True)
+ parser.add_argument("--output", type=Path, required=True)
+ args = parser.parse_args()
+ result = audit(args.runtime)
+ with args.output.open("x", encoding="utf-8") as stream:
+ json.dump(result, stream, indent=2, sort_keys=True, allow_nan=False)
+ print(json.dumps(result, indent=2, sort_keys=True, allow_nan=False))
diff --git a/test-rig/migration/native112_harvest.py b/test-rig/migration/native112_harvest.py
index 9a28fcb5..3a57fa07 100644
--- a/test-rig/migration/native112_harvest.py
+++ b/test-rig/migration/native112_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(), "target112")
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)["target112"].get("serverCode")
if not expected_code: raise AssertionError("Harvest requires an exact sealed server-code inventory")
diff --git a/test-rig/migration/native112_machine_operations.py b/test-rig/migration/native112_machine_operations.py
index 8c89380d..0f611c91 100644
--- a/test-rig/migration/native112_machine_operations.py
+++ b/test-rig/migration/native112_machine_operations.py
@@ -22,7 +22,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"},
@@ -165,14 +165,24 @@ def pin(args):
if destination.exists(): raise FileExistsError(destination)
destination.mkdir(parents=True)
replacements = {
- "poweradvantage": RIG.parent / "build/libs/PowerAdvantage-2.4.1.112021.jar",
- "steamadvantage": RIG.parent.parent / "SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.2.112021.jar",
- "electricadvantage": RIG.parent.parent / "ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.3.112021.jar",
+ "poweradvantage": RIG.parent / "build/libs/basePower-2.4.4.112021.jar",
+ "steamadvantage": RIG.parent.parent / "SteamAdvantage/SteamAdvantage/build/libs/baseSteam-2.2.6.112021.jar",
+ "electricadvantage": RIG.parent.parent / "ElectricAdvantage/ElectricAdvantage/build/libs/baseElectric-2.2.6.112021.jar",
"advantageworkstest": RIG / "build/gradle/libs/AdvantageWorksTestHarness-1.1.0.112021.jar",
}
if getattr(args, "original_production", False):
replacements = {key: value for key, value in replacements.items() if key == "advantageworkstest"}
target = copy.deepcopy(base["target112"])
+ from native112 import identity
+ for dependency in getattr(args, "dependency", ()):
+ key, separator, supplied = dependency.partition("=")
+ if (not separator or key in replacements or key not in {"basemetals", "mmdlib", "orespawn"}
+ or key not in {jar["id"] for jar in target["jars"]}):
+ raise ValueError("Unknown or duplicate dependency override: " + dependency)
+ path = Path(supplied).resolve()
+ if identity(path)[0] != key:
+ raise ValueError("Dependency override has the wrong mod ID: " + dependency)
+ replacements[key] = path
for jar in target["jars"]:
source = replacements.get(jar["id"], Path(jar["path"]))
checksum = digest(source)
@@ -182,10 +192,16 @@ 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
+ modid, version = identity(path)
+ jar.update(path=str(path), originPath=str(source), sha256=checksum, id=modid, version=version)
target["qualificationStatus"] = "UNQUALIFIED_OPERATING_CANDIDATE"
target["scope"] = args.label
+ if getattr(args, "seed", None):
+ seed = args.seed.resolve()
+ if digest(seed / LAUNCHER) != target["launcher_sha256"].upper() or not (seed / "libraries").is_dir():
+ raise ValueError("Replacement seed is not the pinned Forge launcher with installed libraries")
+ target["seed"] = str(seed)
target["serverCode"] = {"files": code_files(Path(target["seed"]))}
path = destination / "inputs.json"
write_json(path, {"target112": target, "baseManifest": str(args.base.resolve()), "baseSha256": digest(args.base)})
@@ -270,6 +286,8 @@ def main():
p = commands.add_parser("pin")
p.add_argument("--base", type=Path, required=True); p.add_argument("--output", type=Path, required=True)
p.add_argument("--label", required=True)
+ p.add_argument("--dependency", action="append", default=[], metavar="MODID=JAR")
+ p.add_argument("--seed", type=Path, help="Fresh installation of the same pinned Forge launcher")
p.add_argument("--original-production", action="store_true", help="Keep the original three production jars; replace only the test harness")
r = commands.add_parser("run")
r.add_argument("--manifest", type=Path, required=True); r.add_argument("--output", type=Path, required=True)
diff --git a/test-rig/migration/native112_rebrand.py b/test-rig/migration/native112_rebrand.py
new file mode 100644
index 00000000..4f73ad6f
--- /dev/null
+++ b/test-rig/migration/native112_rebrand.py
@@ -0,0 +1,422 @@
+"""Build finite witnesses with real 1.10 jars and read them after a native 1.12 upgrade."""
+
+import argparse
+import gzip
+import io
+from pathlib import Path
+import shutil
+import struct
+import time
+import traceback
+import zlib
+
+import nbtlib
+
+from native112 import output_path, pinned_profile, require_disjoint
+from native112_code import code_files, verify_code
+from native112_lifecycle import read_json, require_native_boot, verify_staged
+from rig_transport import WORLD, Server, digest, fingerprint, stage, write_json
+
+ALIASES = dict(poweradvantage="basepower", steamadvantage="basesteam", electricadvantage="baseelectric")
+SOURCE_LAUNCHER = "forge-1.10.2-12.18.3.2511-universal.jar"
+DIMENSIONS = {"minecraft:overworld", "minecraft:the_nether", "minecraft:the_end"}
+BARE_BLOCKS = {"steamPipe", "electricWire"}
+INVENTORIES = {"chest", "destination", "steamCrusher", "electricFurnace", "batteryArray"}
+ENERGY = {"steamCrusher", "electricFurnace", "batteryArray"}
+
+
+def registry(level, key):
+ return {int(row["V"]): str(row["K"]) for row in level["FML"]["Registries"]["minecraft:" + key]["ids"]}
+
+
+def chunk(world, x, z):
+ cx, cz = x // 16, z // 16
+ region = world / "region" / f"r.{cx // 32}.{cz // 32}.mca"
+ with region.open("rb") as stream:
+ stream.seek(4 * (cx % 32 + 32 * (cz % 32)))
+ sector = int.from_bytes(stream.read(4), "big") >> 8
+ if not sector:
+ raise AssertionError(f"Witness chunk is not present: {cx},{cz}")
+ stream.seek(sector * 4096)
+ length = int.from_bytes(stream.read(4), "big")
+ method = stream.read(1)
+ data = stream.read(length - 1)
+ if len(data) != length - 1 or method not in (b"\x01", b"\x02"):
+ raise AssertionError(f"Invalid chunk record: {region}")
+ return nbtlib.File.parse(io.BytesIO((gzip.decompress if method == b"\x01" else zlib.decompress)(data)))["Level"]
+
+
+def nibble(array, offset):
+ return 0 if array is None else (int(array[offset // 2]) >> (4 * (offset % 2))) & 15
+
+
+def read_block(world, level, pos):
+ x, y, z = pos
+ data = chunk(world, x, z)
+ section = next(row for row in data["Sections"] if int(row["Y"]) == y // 16)
+ offset = (y % 16) * 256 + (z % 16) * 16 + x % 16
+ block = (int(section["Blocks"][offset]) & 255) | (nibble(section.get("Add"), offset) << 8)
+ tile = next((row for row in data["TileEntities"] if tuple(int(row[k]) for k in "xyz") == pos), None)
+ return registry(level, "blocks")[block], nibble(section["Data"], offset), tile
+
+
+def canonical(id):
+ if id == "forge:bucketFilled":
+ return "forge:bucketfilled"
+ owner, sep, path = id.partition(":")
+ return ALIASES.get(owner, owner) + sep + path
+
+
+def item_witness(tile, enchantments, require_modern):
+ rows = []
+ for entry in tile["Items"]:
+ tag = entry.get("tag", {})
+ item = str(entry["id"])
+ enchant = [(enchantments[int(ench["id"])], int(ench["lvl"])) for ench in tag.get("ench", ())]
+ if require_modern and (canonical(item) != item or any(canonical(name) != name for name, _ in enchant)):
+ raise AssertionError(f"Inventory still contains an old registry identity: {item}, {enchant}")
+ rows.append(dict(slot=int(entry["Slot"]), item=canonical(item), count=int(entry["Count"]),
+ enchantments=[(canonical(name), rank) for name, rank in enchant],
+ damage=int(entry["Damage"]), charge=float(tag.get("energy", 0)),
+ label=str(tag.get("Witness", ""))))
+ if canonical(item) == "forge:bucketfilled":
+ rows[-1]["fluid"] = [str(tag["FluidName"]), int(tag["Amount"])]
+ return rows
+
+
+def observe_turbine(world, pos):
+ actors = chunk(world, pos[0], pos[2])["Entities"]
+ matched = [row for row in actors if "hydroturbine" in str(row["id"]).lower()]
+ if len(matched) != 1:
+ raise AssertionError(f"Expected one saved turbine, found {len(matched)}")
+ entity = matched[0]
+ return dict(id=str(entity["id"]), parent=[int(value) for value in entity["parentPos"]],
+ uuid=[int(entity[key]) for key in ("UUIDMost", "UUIDLeast")],
+ position=[float(value) for value in entity["Pos"]])
+
+
+def observe(world, positions, *, require_modern=False):
+ level = nbtlib.load(world / "level.dat")
+ ench = registry(level, "enchantments")
+ named = {}
+ for name, pos in positions.items():
+ id, meta, tile = read_block(world, level, pos)
+ if tile is None:
+ if name in BARE_BLOCKS:
+ named[name] = dict(block=id, meta=meta, tile=None)
+ continue
+ raise AssertionError(f"Missing witness tile {name} at {pos}")
+ result = dict(block=id, meta=meta, tile=str(tile["id"]))
+ if name == "tank":
+ result["fluid"] = [str(tile["Tank"]["FluidName"]), int(tile["Tank"]["Amount"])]
+ if name in INVENTORIES:
+ result["items"] = item_witness(tile, ench, require_modern)
+ if name in ENERGY:
+ result["energy"] = struct.unpack(">f", struct.pack(">i", int(tile["Energy"][0])))[0]
+ named[name] = result
+ forge = level.get("forge", level.get("Forge", {}))
+ return dict(witnesses=named, turbine=observe_turbine(world, positions["hydroGenerator"]),
+ oilOwners=[str(x) for x in forge.get("DefaultFluidList", ())],
+ registryBlocks=sorted(key for key in registry(level, "blocks").values()
+ if key.split(":", 1)[0] in set(ALIASES) | set(ALIASES.values())),
+ registryItems=sorted(key for key in registry(level, "items").values()
+ if key.split(":", 1)[0] in set(ALIASES) | set(ALIASES.values())))
+
+
+POSITIONS = {"tank": (0, 5, 4), "chest": (2, 5, 4), "steamDrill": (4, 5, 4),
+ "electricDrill": (6, 5, 4), "conveyor": (10, 5, 4), "destination": (11, 5, 4),
+ "sourceChest": (9, 5, 4), "steamSource": (0, 5, 9), "steamPipe": (1, 5, 9),
+ "steamCrusher": (2, 5, 9), "batteryArray": (6, 5, 9),
+ "electricWire": (7, 5, 9), "electricFurnace": (8, 5, 9), "hydroGenerator": (12, 5, 12)}
+
+
+def command(server, text, response):
+ server.send(text)
+ server.wait(response, 30)
+
+
+def create(source, profile, java, port, owners):
+ launcher = stage(source, profile)
+ configure(source, port)
+ with_server = Server(source, java, launcher, "source", query_result="cancel")
+ try:
+ command(with_server, "save-all", "Saved the world")
+ data = nbtlib.load(source / WORLD / "level.dat")
+ spawn_x, spawn_z = (int(data["Data"]["Spawn" + key]) & ~15 for key in ("X", "Z"))
+ positions = {name: (x + spawn_x, y, z + spawn_z) for name, (x, y, z) in POSITIONS.items()}
+ ench = {name: number for number, name in registry(data, "enchantments").items()}
+ musket_enchantment = ench.get(owners[1] + ":powderless", ench.get("steamadvantage:powderless"))
+ if musket_enchantment is None:
+ raise AssertionError("Source has no musket enchantment")
+ p, s, e = owners
+ inventory = ('{Items:[{Slot:0b,id:"%s:sprocket",Count:7b,Damage:0s},'
+ '{Slot:1b,id:"%s:musket",Count:1b,Damage:3s,tag:{ench:[{id:%ds,lvl:1s}],Witness:"musket"}},'
+ '{Slot:2b,id:"%s:lithium_battery",Count:1b,Damage:0s,tag:{energy:391.5f,Witness:"battery"}},'
+ '{Slot:3b,id:"forge:bucketFilled",Count:1b,Damage:0s,tag:{FluidName:"crude_oil",Amount:1000}}]}'
+ % (p, s, musket_enchantment, e))
+ fixtures = [
+ ("tank", p + ":fluid_metal_tank", 0, '{Tank:{FluidName:"crude_oil",Amount:1337}}'),
+ ("chest", "minecraft:chest", 2, inventory),
+ ("steamDrill", s + ":steam_drill", 2, '{Facing:2}'),
+ ("electricDrill", e + ":electric_drill", 3, '{}'),
+ ("conveyor", p + ":item_conveyor", 5, '{}'),
+ ("destination", "minecraft:chest", 2, '{}'),
+ ("steamSource", p + ":infinite_steam", 0, ''),
+ ("steamPipe", s + ":steam_pipe", 0, ''),
+ ("steamCrusher", s + ":steam_crusher", 0, '{}'),
+ ("batteryArray", e + ":electric_battery_array", 0,
+ '{Items:[{Slot:0b,id:"' + e + ':lithium_battery",Count:1b,Damage:0s,tag:{energy:4000f}}]}'),
+ ("electricWire", e + ":electric_conduit", 0, ''),
+ ("electricFurnace", e + ":electric_furnace", 0, ''),
+ ("hydroGenerator", e + ":hydroelectric_generator", 0, ''),
+ ]
+ fixtures.append(("sourceChest", "minecraft:chest", 2, '{}'))
+ for name, block, metadata, nbt in fixtures:
+ x, y, z = positions[name]
+ command(with_server, f"setblock {x} {y} {z} {block} {metadata} replace {nbt}", "Block placed")
+ time.sleep(3)
+ command(with_server, "save-all", "Saved the world")
+ finally:
+ with_server.close()
+ return positions
+
+
+def configure(runtime, port):
+ props = runtime / "server.properties"
+ lines = [line for line in props.read_text().splitlines() if not line.startswith("server-port=")]
+ props.write_text("\n".join(lines) + f"\nserver-port={port}\n", encoding="ascii")
+
+
+def worldgen_rules(root):
+ profile = read_json(root / WORLD / "serverconfig/orespawn-worldgen.json")
+ return {name: rule for kind in ("ores", "fluid_deposits")
+ for name, rule in profile.get(kind, {}).items()
+ if name.split(":", 1)[0] in set(ALIASES.values())}
+
+
+def change_legacy_oil(config):
+ path = config / "orespawn/poweradvantage.json"
+ document = read_json(path)
+ ore = document["dimensions"][0]["ores"][0]
+ ore.update(frequency=0.375, size=24, variation=6, minHeight=19, maxHeight=48)
+ write_json(path, document)
+
+
+def save_released_player_choices(source, source_seed, java, port):
+ path = source / WORLD / "serverconfig/orespawn-worldgen.json"
+ profile = read_json(path)
+ profile["ores"]["baseelectric:ore/sulfur"]["enabled"] = False
+ profile["ores"]["baseelectric:ore/lithium"]["dimensions"]["minecraft:overworld"]["frequency"] = 0.25
+ write_json(path, profile)
+ expected = worldgen_rules(source)
+ # Open and save with the released 1.10 mods before using this as a source.
+ server = Server(source, java, SOURCE_LAUNCHER, "source-player-choices", query_result="cancel")
+ try:
+ command(server, "save-all", "Saved the world")
+ finally:
+ server.close()
+ if code_files(source) != code_files(source_seed) or worldgen_rules(source) != expected:
+ raise AssertionError("Released 1.10 source did not retain the explicit world profile")
+ return expected
+
+
+def assert_legacy_worldgen(rules):
+ # OreSpawn draws from [size - variation, size + variation) in the legacy range.
+ expected = {"basepower:crude_oil": (0.375, 18, 29, 19, 47),
+ "baseelectric:li_ore": (0.125, 6, 9, 1, 31),
+ "baseelectric:sulfur_ore": (1, 8, 23, 1, 31)}
+ for block, settings in expected.items():
+ active = [rule for rule in rules.values() if rule.get("enabled", True) and rule.get("block") == block]
+ if len(active) != 1:
+ raise AssertionError(f"Expected one active legacy rule for {block}, found {len(active)}")
+ placements = active[0]["dimensions"]
+ if set(placements) != DIMENSIONS:
+ raise AssertionError(f"Legacy dimension selection changed for {block}: {list(placements)}")
+ for dimension, placement in placements.items():
+ actual = tuple(placement[key] for key in ("frequency", "min_quantity", "max_quantity", "min_y", "max_y"))
+ if actual != settings:
+ raise AssertionError(f"Legacy generation changed for {block} in {dimension}: {actual} != {settings}")
+
+
+def assert_preserved(before, after, *, operated):
+ for name, saved in before["witnesses"].items():
+ live = after["witnesses"][name]
+ if live["block"] != canonical(saved["block"]) or live["meta"] != saved["meta"]:
+ raise AssertionError(f"Block identity or metadata changed at {name}: {saved} -> {live}")
+ if name in BARE_BLOCKS and saved["tile"] is None:
+ if live["tile"] is not None:
+ raise AssertionError(f"An unexpected tile appeared at {name}")
+ continue
+ old_tile = saved["tile"].removeprefix("minecraft:")
+ expected_tile = old_tile
+ for old, new in ALIASES.items():
+ for owner in (old, new):
+ if old_tile.startswith(owner + "."):
+ expected_tile = new + ":" + old_tile[len(owner) + 1:]
+ if old_tile.startswith(old + ":"):
+ expected_tile = canonical(old_tile)
+ if expected_tile == "Chest":
+ expected_tile = "minecraft:chest"
+ if live["tile"] != expected_tile:
+ raise AssertionError(f"Unexpected tile identity at {name}: {live['tile']}")
+ if live["block"].split(":", 1)[0] in ALIASES.values() and ":" not in live["tile"]:
+ raise AssertionError(f"Tile was not saved with a canonical ID at {name}")
+ if name == "tank" and live["fluid"] != saved["fluid"]:
+ raise AssertionError(f"Tank changed: {saved['fluid']} -> {live['fluid']}")
+ if name == "chest" and live["items"] != saved["items"]:
+ raise AssertionError(f"Item, charge or enchantment changed: {saved['items']} -> {live['items']}")
+ if name == "destination":
+ wanted = [] if not operated else [dict(slot=0, item="minecraft:dirt", count=8, damage=0,
+ charge=0.0, enchantments=[], label="")]
+ if live["items"] != wanted:
+ raise AssertionError(f"Unexpected conveyor output: {live['items']}")
+ output = {"steamCrusher": "minecraft:cobblestone", "electricFurnace": "minecraft:iron_ingot"}.get(name)
+ if output:
+ items = [(row["item"], row["count"]) for row in live["items"]]
+ if items != ([(output, 1)] if operated else []):
+ raise AssertionError(f"Unexpected operation at {name}: {items}")
+ saved, live = before["witnesses"], after["witnesses"]
+ initial = saved["batteryArray"]["energy"] + saved["electricFurnace"]["energy"]
+ remaining = live["batteryArray"]["energy"] + live["electricFurnace"]["energy"]
+ if initial != 4000 or abs(initial - remaining - (1600 if operated else 0)) > 0.01:
+ raise AssertionError(f"Electric migration lost or created charge: {initial} -> {remaining}")
+ if live["steamCrusher"]["energy"] <= 0:
+ raise AssertionError("The migrated steam pipe did not supply the crusher")
+ for key in ("registryBlocks", "registryItems"):
+ missing = {canonical(id) for id in before[key]} - set(after[key])
+ if missing:
+ raise AssertionError(f"Saved {key} missing: {sorted(missing)}")
+ if "basepower:crude_oil" not in after["oilOwners"] or "basepower:refined_oil" not in after["oilOwners"]:
+ raise AssertionError("World does not use the new fluid owners")
+ expected_turbine = dict(before["turbine"], id="baseelectric:hydroturbine")
+ if after["turbine"] != expected_turbine:
+ raise AssertionError(f"Saved turbine changed or was replaced: {expected_turbine} -> {after['turbine']}")
+
+
+def run(args):
+ output = output_path(args.output)
+ source_pin = read_json(args.source_manifest)
+ source_seed = Path(source_pin["seed"])
+ jars = [Path(row["path"]) for row in source_pin["jars"]]
+ for row, path in zip(source_pin["jars"], jars):
+ if digest(path) != row["sha256"]:
+ raise AssertionError(f"Source mod input changed: {path}")
+ if code_files(source_seed) != source_pin["serverCode"]:
+ raise AssertionError("Source engine changed")
+ target = pinned_profile(args.target_manifest, "target112")
+ for path in [source_seed, args.source_manifest, args.target_manifest, *jars, target[0], *target[2]]:
+ require_disjoint(output, path)
+ output.mkdir()
+ receipt = output / "rebrand-upgrade-results.json"
+ source = output / "source"
+ runtime = output / "target"
+ helpers = [Path(__file__)] + [Path(__file__).with_name(name) for name in (
+ "native112.py", "native112_code.py", "native112_lifecycle.py", "native112_diagnostics.py", "rig_transport.py")]
+ seals = {str(path): digest(path) for path in helpers}
+ report = dict(status="RUNNING", sourceManifestSha256=digest(args.source_manifest),
+ targetManifestSha256=digest(args.target_manifest), protocolSha256=seals, phases={})
+ source_hashes = None
+ config_hashes = None
+ try:
+ positions = create(source, (source_seed, SOURCE_LAUNCHER, jars), args.java8, args.port, source_pin["owners"])
+ original_cyano = source_pin["owners"][0] == "poweradvantage"
+ source_rules = None if original_cyano else save_released_player_choices(source, source_seed, args.java8, args.port)
+ if {jar.name: digest(jar) for jar in (source / "mods").glob("*.jar")} != {
+ jar.name: row["sha256"] for jar, row in zip(jars, source_pin["jars"])}:
+ raise AssertionError("Staged 1.10 mods differ from the source manifest")
+ if code_files(source) != source_pin["serverCode"]:
+ raise AssertionError("Staged 1.10 engine differs from the source manifest")
+ source_log = source / "console-source.log"
+ log = source_log.read_text(encoding="utf-8")
+ report["sourceLog"] = dict(sha256=digest(source_log),
+ errorLines=[line for line in log.splitlines() if "/ERROR]" in line])
+ if ("Forge Mod Loader version 12.18.3.2511 for Minecraft 1.10.2 loading" not in log
+ or any(marker in log for marker in ("Encountered an unexpected exception",
+ "Couldn't process command", "NoSuchMethodError", "NoSuchFieldError"))):
+ raise AssertionError("Source Forge 1.10 runtime did not build the fixture cleanly")
+ source_hashes = fingerprint(source / WORLD)
+ config_hashes = fingerprint(source / "config")
+ original = observe(source / WORLD, positions)
+ write_json(output / "source-world-hashes.json", source_hashes)
+ report["phases"]["source"] = original
+ report["positions"] = positions
+ if source_rules is not None:
+ original["worldgenRules"] = source_rules
+ if original["witnesses"]["tank"]["fluid"] != ["crude_oil", 1337]:
+ raise AssertionError("Source did not save the finite fluid witness")
+ if original["witnesses"]["chest"]["items"][-1].get("fluid") != ["crude_oil", 1000]:
+ raise AssertionError("Source did not save a full universal bucket")
+ if original["turbine"]["parent"] != list(positions["hydroGenerator"]):
+ raise AssertionError("Source did not save a turbine connected to its generator")
+ launcher = stage(runtime, target)
+ configure(runtime, args.port)
+ shutil.copytree(source / WORLD, runtime / WORLD)
+ shutil.copytree(source / "config", runtime / "config")
+ if original_cyano:
+ change_legacy_oil(runtime / "config")
+ verify_staged(runtime, target)
+ verify_code(runtime, read_json(args.target_manifest)["target112"]["serverCode"])
+ first_rules = None
+ for label in ("converted", "restarted"):
+ server = Server(runtime, args.java8, launcher, label, query_result="cancel")
+ try:
+ if label == "restarted":
+ for name, item, count in (("sourceChest", "dirt", 8), ("steamCrusher", "stone", 1),
+ ("electricFurnace", "iron_ore", 1)):
+ x, y, z = positions[name]
+ command(server, f'blockdata {x} {y} {z} ' +
+ ('{Items:[{Slot:0b,id:"minecraft:%s",Count:%db,Damage:0s}]}' % (item, count)),
+ "Block data updated")
+ # Only add raw inputs; no machine, pipe, wiring, or power supply is replaced.
+ time.sleep(15)
+ else:
+ # Let the normal initial chunk ticks persist their converted tile data.
+ time.sleep(3)
+ command(server, "save-all flush", "Saved the world")
+ finally:
+ server.close()
+ require_native_boot(runtime / f"console-{label}.log")
+ result = observe(runtime / WORLD, positions, require_modern=True)
+ rules = worldgen_rules(runtime)
+ result["worldgenRules"] = rules
+ report["phases"][label] = result
+ write_json(receipt, report)
+ assert_preserved(original, result, operated=label == "restarted")
+ if original_cyano:
+ assert_legacy_worldgen(rules)
+ elif rules != source_rules:
+ raise AssertionError("Explicit released 1.10 OreSpawn rules changed during the upgrade")
+ if first_rules is not None and rules != first_rules:
+ raise AssertionError("Owned OreSpawn profile changed across the cold restart")
+ header = source / WORLD / "level.dat"
+ header_backup = runtime / WORLD / "basepower-migration-backups" / (
+ "level.dat." + digest(header).lower() + ".before-base-identity-migration")
+ if not header_backup.is_file() or digest(header_backup) != digest(header):
+ raise AssertionError("Original Forge header backup is missing or changed")
+ first_rules = rules
+ verify_staged(runtime, target)
+ report["status"] = "PASS"
+ except Exception as error:
+ report.update(status="FAIL", failure=str(error), traceback=traceback.format_exc())
+ finally:
+ if source_hashes is not None:
+ report["sourceUnchanged"] = (source_hashes == fingerprint(source / WORLD)
+ and config_hashes == fingerprint(source / "config"))
+ if not report["sourceUnchanged"]:
+ report["status"] = "FAIL"
+ report["protocolUnchanged"] = seals == {str(path): digest(path) for path in helpers}
+ report["manifestsUnchanged"] = (report["sourceManifestSha256"] == digest(args.source_manifest)
+ and report["targetManifestSha256"] == digest(args.target_manifest))
+ if not report["protocolUnchanged"] or not report["manifestsUnchanged"]:
+ report["status"] = "FAIL"
+ write_json(receipt, report)
+ print(report["status"] + ": " + str(receipt), flush=True)
+ return int(report["status"] != "PASS")
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description=__doc__)
+ for name in ("source-manifest", "target-manifest", "java8", "output"):
+ parser.add_argument("--" + name, type=Path, required=True)
+ parser.add_argument("--port", type=int, required=True)
+ raise SystemExit(run(parser.parse_args()))
diff --git a/test-rig/migration/native112_recipe_progression.py b/test-rig/migration/native112_recipe_progression.py
index 4105699f..d0be6a94 100644
--- a/test-rig/migration/native112_recipe_progression.py
+++ b/test-rig/migration/native112_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")!="PASS":
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/rig_transport.py b/test-rig/migration/rig_transport.py
index 1615bc89..7e3621bc 100644
--- a/test-rig/migration/rig_transport.py
+++ b/test-rig/migration/rig_transport.py
@@ -28,11 +28,11 @@ def write_json(path, value):
class Server:
- def __init__(self, runtime, java, launcher, label):
+ def __init__(self, runtime, java, launcher, label, *, query_result="confirm"):
self.lines = queue.Queue()
self.log = (runtime / f"console-{label}.log").open("w", encoding="utf-8")
self.process = subprocess.Popen(
- [str(java), "-Xms512M", "-Xmx2G", "-Dfml.queryResult=confirm", "-jar", launcher, "nogui"],
+ [str(java), "-Xms512M", "-Xmx2G", "-Dfml.queryResult=" + query_result, "-jar", launcher, "nogui"],
cwd=runtime, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
text=True, encoding="utf-8", errors="replace", creationflags=getattr(subprocess, "CREATE_NO_WINDOW", 0),
)
diff --git a/test-rig/migration/steam_control_audit.py b/test-rig/migration/steam_control_audit.py
index 2c513211..6bbc5f58 100644
--- a/test-rig/migration/steam_control_audit.py
+++ b/test-rig/migration/steam_control_audit.py
@@ -155,7 +155,7 @@ def progress(data):
return int(value)
-def control_case(row, saved, declaration, base, line):
+def control_case(row, saved, declaration, base, line, steam_modid="steamadvantage"):
index = saved.get("index")
require(type(index) is int and index >= 0, "Missing station index")
require(type(row.get("startTick")) is int and type(row.get("finishTick")) is int
@@ -185,15 +185,15 @@ 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_modid + (":steam_furnace" if row["id"] in FURNACES
+ else ":steam_crusher"),
"Held tile is not the measured native machine")
actual.add(point)
require(actual == expected, "Incomplete measured tile hold coverage")
return at
-def audit_documents(catalog, operation, fixture, cold, line):
+def audit_documents(catalog, operation, fixture, cold, line, steam_modid="steamadvantage"):
report = {"status": "FAIL", "line": line, "scope": "Six Steam first-tick/control cases plus full declared operation/cold checks",
"cases": {}, "failures": []}
try:
@@ -214,7 +214,7 @@ def audit_documents(catalog, operation, fixture, cold, line):
require(report["cold"]["status"] == "PASS", "Base exact cold-restart audit failed")
for case_id in sorted(IDS):
row = observed[case_id]
- at = control_case(row, saved[case_id], declared[case_id], base, line)
+ at = control_case(row, saved[case_id], declared[case_id], base, line, steam_modid)
require(positions(saved[case_id]["positions"], base, line)
== positions(restarted[case_id]["positions"], base, line),
"Control typed NBT changed across cold restart")
@@ -228,7 +228,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_modid + ":steam_crusher", 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 +245,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_modid + (":steam_crusher" if is_crusher else ":steam_furnace")
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"
@@ -287,11 +287,11 @@ def unique_object(pairs):
return result
-def audit(runtime, line):
+def audit(runtime, line, steam_modid="steamadvantage"):
runtime = Path(runtime).resolve()
raw = {name: (runtime / path).read_bytes() for name, path in INPUTS.items()}
documents = {name: json.loads(value, object_pairs_hook=unique_object) for name, value in raw.items()}
- report = audit_documents(**documents, line=line)
+ report = audit_documents(**documents, line=line, steam_modid=steam_modid)
report["runtime"] = str(runtime)
report["inputSha256"] = {INPUTS[name]: hashlib.sha256(value).hexdigest().upper() for name, value in raw.items()}
report["auditorSha256"] = hashlib.sha256(Path(__file__).read_bytes()).hexdigest().upper()
@@ -305,9 +305,10 @@ def main(argv=None):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--runtime", type=Path, required=True)
parser.add_argument("--line", choices=LINES, required=True)
+ parser.add_argument("--steam-modid", choices=("steamadvantage", "basesteam"), default="steamadvantage")
args = parser.parse_args(argv)
try:
- report = audit(args.runtime, args.line)
+ report = audit(args.runtime, args.line, args.steam_modid)
except Exception as error:
report = {"status": "FAIL", "line": args.line, "runtime": str(args.runtime), "failures": [str(error)]}
print(json.dumps(report, indent=2, sort_keys=True, allow_nan=False))
diff --git a/test-rig/migration/test_native112_recipe_progression.py b/test-rig/migration/test_native112_recipe_progression.py
index 3ea35c28..a9c17e53 100644
--- a/test-rig/migration/test_native112_recipe_progression.py
+++ b/test-rig/migration/test_native112_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="PASS"))
- 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/src/main/java/zone/moddev/mc/advantageworks/AdvantageWorksMod.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/AdvantageWorksMod.java
index 62d19f6e..3eb5028a 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
@@ -5,7 +5,7 @@
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
@Mod(modid = "advantageworkstest", name = "Advantage Works Test Harness", version = "1.1.0.112021",
- acceptableRemoteVersions = "*", dependencies = "required-after:poweradvantage")
+ acceptableRemoteVersions = "*", dependencies = "required-after:basepower")
public final class AdvantageWorksMod {
@Mod.Instance("advantageworkstest") public static AdvantageWorksMod instance;
@Mod.EventHandler public void preInit(FMLPreInitializationEvent 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 a32a8d32..be92d72d 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 69bd5a38..38e2fe45 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
@@ -65,10 +65,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/DrillOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/DrillOperationalCases.java
index a4101e91..0ff1dc0a 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 e12a0763..c8ac82a2 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 3762c54a..921177f2 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
@@ -24,7 +24,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";
@@ -166,7 +166,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);
@@ -190,15 +190,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);
@@ -211,7 +211,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()) {
@@ -225,12 +225,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);
}
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 f303650b..57536b98 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 357e79d1..c687770c 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 1248becf..f2eac7c3 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 46b204fd..bb4feba4 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/NativeRecipeProgressionProbe.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeRecipeProgressionProbe.java
index e5b6fada..7567d979 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeRecipeProgressionProbe.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeRecipeProgressionProbe.java
@@ -51,7 +51,7 @@ private static String token(ItemStack stack) {
return empty(stack) ? null : stack.getItem().getRegistryName() + "@" + stack.getMetadata();
}
private static boolean owned(String token) {
- return token != null && (token.startsWith("poweradvantage:") || token.startsWith("steamadvantage:") || token.startsWith("electricadvantage:"));
+ return token != null && (token.startsWith("basepower:") || token.startsWith("basesteam:") || token.startsWith("baseelectric:"));
}
private static void add(JsonArray target, String value) { target.add(value == null ? JsonNull.INSTANCE : new JsonPrimitive(value)); }
private static Object invoke(Object value, String method) throws Exception {
@@ -193,7 +193,7 @@ private static void audit(MinecraftServer server, WorldServer world, String labe
@Override public void sendPacket(Packet> packet) {}
};
player.interactionManager.setGameType(net.minecraft.world.GameType.SURVIVAL);
- Class> power=Class.forName("com.mcmoddev.poweradvantage.PowerAdvantage");
+ Class> power=Class.forName("zone.moddev.mc.basepower.PowerAdvantage");
JsonObject report=new JsonObject();
report.addProperty("minecraft","1.12.2"); report.addProperty("label",label);
report.addProperty("mode",power.getField("recipeMode").get(null).toString());
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/PowerOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/PowerOperationalCases.java
index 20972bd4..0a069a28 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/PowerOperationalCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/PowerOperationalCases.java
@@ -7,6 +7,9 @@
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
+import net.minecraftforge.fluids.capability.IFluidHandler;
final class PowerOperationalCases {
static void register(List cases) {
@@ -15,7 +18,7 @@ static void register(List cases) {
"power/conveyor/locked-" + (sourceLocked ? "source" : "destination"),
"Automation must not bypass a vanilla chest lock, at either end of the belt", 160,
c -> {
- conveyor(c, "poweradvantage:item_conveyor"); c.put(4, 2, 5, 0, "minecraft:dirt", 16);
+ conveyor(c, "basepower:item_conveyor"); c.put(4, 2, 5, 0, "minecraft:dirt", 16);
net.minecraft.nbt.NBTTagCompound lock = new net.minecraft.nbt.NBTTagCompound(); lock.setString("Lock", "Works key");
c.seed(sourceLocked ? 4 : 6, 2, 5, lock);
}, c -> {
@@ -28,7 +31,7 @@ static void register(List cases) {
"A finite 16 dirt reaches the chest in the declared direction, without loss or extra items", 200,
c -> {
BlockPos offset = BlockPos.ORIGIN.offset(direction);
- c.block(8, 6, 8, "poweradvantage:item_conveyor"); c.facing(8, 6, 8, direction.getName());
+ c.block(8, 6, 8, "basepower:item_conveyor"); c.facing(8, 6, 8, direction.getName());
c.block(8 - offset.getX(), 6 - offset.getY(), 8 - offset.getZ(), "minecraft:chest");
c.block(8 + offset.getX(), 6 + offset.getY(), 8 + offset.getZ(), "minecraft:chest");
c.put(8 - offset.getX(), 6 - offset.getY(), 8 - offset.getZ(), 0, "minecraft:dirt", 16);
@@ -40,14 +43,14 @@ static void register(List cases) {
}));
}
cases.add(new MachineScenario("power/conveyor/blocked", "Full output retains every dirt item in source or belt", 200,
- c -> { conveyor(c, "poweradvantage:item_conveyor"); c.put(4, 2, 5, 0, "minecraft:dirt", 16); full(c, 6, 2, 5); },
+ c -> { conveyor(c, "basepower:item_conveyor"); c.put(4, 2, 5, 0, "minecraft:dirt", 16); full(c, 6, 2, 5); },
c -> {
c.require(c.count(4, 2, 5, "minecraft:dirt") + c.count(5, 2, 5, "minecraft:dirt") == 16, "blocked conveyor retains all inputs");
c.require(c.count(6, 2, 5, "minecraft:cobblestone") == 1728, "full output contents unchanged");
}));
cases.add(new MachineScenario("power/conveyor/item-entity", "Dropped dirt is collected and delivered without a duplicate entity", 200,
c -> {
- c.block(5, 2, 5, "poweradvantage:item_conveyor"); c.facing(5, 2, 5, "east");
+ c.block(5, 2, 5, "basepower:item_conveyor"); c.facing(5, 2, 5, "east");
c.block(6, 2, 5, "minecraft:chest"); c.block(4, 1, 5, "minecraft:stone");
c.block(3, 2, 5, "minecraft:stone"); c.block(4, 2, 4, "minecraft:stone"); c.block(4, 2, 6, "minecraft:stone");
BlockPos p = c.at(4, 2, 5);
@@ -60,7 +63,7 @@ static void register(List cases) {
}));
cases.add(new MachineScenario("power/conveyor/nbt-preserved", "Distinct custom item data must not merge into or overwrite another stack", 200,
c -> {
- conveyor(c, "poweradvantage:item_conveyor");
+ conveyor(c, "basepower:item_conveyor");
c.put(4, 2, 5, 0, "minecraft:dirt", 3); c.put(4, 2, 5, 1, "minecraft:dirt", 3);
NativeStacks.tag(c.inventory(4, 2, 5).getStackInSlot(0)).setString("Witness", "A");
NativeStacks.tag(c.inventory(4, 2, 5).getStackInSlot(1)).setString("Witness", "B");
@@ -87,14 +90,14 @@ static void register(List cases) {
};
for (String[] filter : filters) cases.add(new MachineScenario("power/filter/" + filter[0],
"Eight matching items go down; eight nonmatching items go forward; bounded inputs exhaust", 300,
- c -> { filter(c, "poweradvantage:item_filter_" + filter[0]); c.put(4, 2, 5, 0, filter[1], 8); c.put(4, 2, 5, 1, filter[2], 8); },
+ c -> { filter(c, "basepower:item_filter_" + filter[0]); c.put(4, 2, 5, 0, filter[1], 8); c.put(4, 2, 5, 1, filter[2], 8); },
c -> filterOutcome(c, filter[1], filter[2], true)));
for (int ghosts = 0; ghosts <= 3; ghosts++) {
final int slots = ghosts;
cases.add(new MachineScenario("power/filter/inventory-" + slots,
"Zero references pass all; one or several references sort matching dirt, retaining reference slots", 300,
c -> {
- filter(c, "poweradvantage:item_filter_inventory");
+ filter(c, "basepower:item_filter_inventory");
c.put(4, 2, 5, 0, "minecraft:dirt", 8); c.put(4, 2, 5, 1, "minecraft:apple", 8);
if (slots > 0) c.put(5, 2, 5, 1, "minecraft:dirt", 1);
if (slots > 1) { c.put(5, 2, 5, 2, "minecraft:cobblestone", 1); c.put(5, 2, 5, 3, "minecraft:coal", 1); }
@@ -108,7 +111,7 @@ static void register(List cases) {
cases.add(new MachineScenario("power/filter/overflow-" + flags,
"Use lower output first, overflow forward when lower is full, retain input when both are full", 300,
c -> {
- filter(c, "poweradvantage:item_filter_overflow"); c.put(4, 2, 5, 0, "minecraft:dirt", 16);
+ filter(c, "basepower:item_filter_overflow"); c.put(4, 2, 5, 0, "minecraft:dirt", 16);
if (lowerFull) full(c, 5, 1, 5); if (forwardFull) full(c, 6, 2, 5);
}, c -> {
int lower = c.count(5, 1, 5, "minecraft:dirt"), forward = c.count(6, 2, 5, "minecraft:dirt");
@@ -117,10 +120,10 @@ static void register(List cases) {
c.require(c.count(4, 2, 5, "minecraft:dirt") + c.count(5, 2, 5, "minecraft:dirt") + lower + forward == 16, "overflow conservation even with both outputs blocked");
}));
}
- for (String fluid : new String[]{"minecraft:water", "poweradvantage:crude_oil", "poweradvantage:refined_oil"}) {
+ for (String fluid : new String[]{"minecraft:water", "basepower:crude_oil", "basepower:refined_oil"}) {
cases.add(new MachineScenario("power/drain/" + fluid.replace(':', '_'),
"Exactly one native fluid source travels through drain and pipe to storage with registry identity intact", 80,
- c -> { drain(c, fluid, "poweradvantage:fluid_storage_tank", false); },
+ c -> { drain(c, fluid, "basepower:fluid_storage_tank", false); },
c -> {
c.require(c.world.isAirBlock(c.at(5, 2, 5)), "native source collected");
c.require(c.fluidAmount(7, 1, 5) == 1000 && c.fluidAmount(5, 1, 5) == 0, "exact source volume delivered");
@@ -129,24 +132,24 @@ static void register(List cases) {
}
cases.add(new MachineScenario("power/drain/non-source", "Flowing water without a source cannot create a bucket", 80,
c -> {
- drain(c, "minecraft:water", "poweradvantage:fluid_storage_tank", false);
+ drain(c, "minecraft:water", "basepower:fluid_storage_tank", false);
c.world.setBlockState(c.at(5, 2, 5), net.minecraft.init.Blocks.WATER.getDefaultState()
.withProperty(net.minecraft.block.BlockLiquid.LEVEL, 7), 3);
}, c -> c.require(c.fluidAmount(5, 1, 5) + c.fluidAmount(7, 1, 5) == 0, "no source means no collected millibuckets")));
for (boolean matching : new boolean[]{true, false}) cases.add(new MachineScenario("power/tank/filter-" + matching,
"A bucket reference admits matching water or rejects it without losing the source volume", 80,
- c -> { drain(c, "minecraft:water", "poweradvantage:fluid_metal_tank", false); c.put(7, 1, 5, 0, matching ? "minecraft:water_bucket" : "minecraft:lava_bucket", 1); },
+ c -> { drain(c, "minecraft:water", "basepower:fluid_metal_tank", false); c.put(7, 1, 5, 0, matching ? "minecraft:water_bucket" : "minecraft:lava_bucket", 1); },
c -> {
c.require(c.fluidAmount(7, 1, 5) == (matching ? 1000 : 0), "bucket filter controls actual network acceptance");
c.require(c.fluidAmount(7, 1, 5) + c.fluidAmount(5, 1, 5) == 1000, "rejected water is retained rather than deleted");
}));
cases.add(new MachineScenario("power/tank/full", "Full metal storage never overfills or deletes the extra source bucket", 80,
- c -> { drain(c, "minecraft:water", "poweradvantage:fluid_metal_tank", false); c.tank(7, 1, 5, "minecraft:water", 10000); },
+ c -> { drain(c, "minecraft:water", "basepower:fluid_metal_tank", false); c.tank(7, 1, 5, "minecraft:water", 10000); },
c -> c.require(c.fluidAmount(7, 1, 5) == 10000 && c.fluidAmount(5, 1, 5) == 1000, "full output applies backpressure and conserves 11000 mB")));
for (boolean signal : new boolean[]{true, false}) cases.add(new MachineScenario("power/fluid-switch/" + signal,
"Redstone isolates the fluid path; removing it permits transfer without replacing machinery", 100,
c -> {
- drain(c, "minecraft:water", "poweradvantage:fluid_storage_tank", true);
+ drain(c, "minecraft:water", "basepower:fluid_storage_tank", true);
if (signal) c.block(6, 2, 5, "minecraft:redstone_block");
}, c -> {
c.require(c.fluidAmount(7, 1, 5) == (signal ? 0 : 1000), "redstone controls fluid delivery");
@@ -155,7 +158,7 @@ static void register(List cases) {
for (boolean blocked : new boolean[]{true, false}) cases.add(new MachineScenario("power/discharge/" + blocked,
"A discharge places one bucket into air, but must never replace solid bedrock", 80,
c -> {
- c.block(5, 2, 5, "poweradvantage:fluid_discharge");
+ c.block(5, 2, 5, "basepower:fluid_discharge");
for (EnumFacing direction : EnumFacing.values()) if (direction != EnumFacing.UP) {
BlockPos p = BlockPos.ORIGIN.offset(direction);
c.block(5 + p.getX(), 1 + p.getY(), 5 + p.getZ(), "minecraft:bedrock");
@@ -176,19 +179,39 @@ private static void stills(List cases) {
cases.add(new MachineScenario("power/still/" + mode,
"Finite crude oil produces refined oil at 2:1; fuel, valid input, capacity and redstone govern useful work", 620,
c -> {
- c.block(8, 4, 8, "poweradvantage:still");
- com.mcmoddev.poweradvantage.machines.fluidmachines.StillTileEntity still =
- (com.mcmoddev.poweradvantage.machines.fluidmachines.StillTileEntity)c.tile(8, 4, 8);
- still.getInputTank().setFluid(new net.minecraftforge.fluids.FluidStack(
- NativeFluids.get(mode.equals("invalid") ? "minecraft:water" : "poweradvantage:crude_oil"), 1000));
+ c.block(8, 4, 8, "basepower:still");
+ zone.moddev.mc.basepower.machines.fluidmachines.StillTileEntity still =
+ (zone.moddev.mc.basepower.machines.fluidmachines.StillTileEntity)c.tile(8, 4, 8);
+ FluidStack stock = new FluidStack(
+ NativeFluids.get(mode.equals("invalid") ? "minecraft:water" : "basepower:crude_oil"), 1000);
+ if (mode.equals("production")) {
+ IFluidHandler port = still.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.WEST);
+ c.require(port != null && port.fill(stock, false) == 1000
+ && still.getInputTank().getFluidAmount() == 0
+ && still.getTank().getFluidAmount() == 0, "simulated input leaves both tanks unchanged");
+ c.require(port.fill(new FluidStack(NativeFluids.get("minecraft:water"), 1000), false) == 0,
+ "capability rejects invalid input");
+ c.require(port.fill(stock, true) == 1000 && still.getInputTank().getFluidAmount() == 1000
+ && still.getTank().getFluidAmount() == 0 && stock.amount == 1000,
+ "capability fills only the raw input tank without changing the offer");
+ } else {
+ still.getInputTank().setFluid(stock);
+ }
if (!mode.equals("no-fuel")) c.put(8, 4, 8, 0, "minecraft:coal", 1);
- if (output > 0) c.tank(8, 4, 8, "poweradvantage:refined_oil", output);
+ if (output > 0) c.tank(8, 4, 8, "basepower:refined_oil", output);
if (mode.equals("redstone")) c.block(9, 4, 8, "minecraft:redstone_block");
}, c -> {
- com.mcmoddev.poweradvantage.machines.fluidmachines.StillTileEntity still =
- (com.mcmoddev.poweradvantage.machines.fluidmachines.StillTileEntity)c.tile(8, 4, 8);
+ zone.moddev.mc.basepower.machines.fluidmachines.StillTileEntity still =
+ (zone.moddev.mc.basepower.machines.fluidmachines.StillTileEntity)c.tile(8, 4, 8);
c.require(still.getInputTank().getFluidAmount() == 1000 - product * 2, "exact raw input debit");
c.require(c.fluidAmount(8, 4, 8) == output + product, "exact bounded distillation product");
+ if (mode.equals("production")) {
+ IFluidHandler port = still.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.EAST);
+ FluidStack simulated = port.drain(1000, false);
+ c.require(simulated != null && simulated.amount == 500
+ && simulated.getFluid() == NativeFluids.get("basepower:refined_oil")
+ && still.getTank().getFluidAmount() == 500, "only refined output is drainable");
+ }
if (product == 0 && !mode.equals("no-fuel"))
c.require(c.count(8, 4, 8, "minecraft:coal") == 1, "blocked job does not consume fresh fuel");
}));
@@ -208,12 +231,12 @@ private static void filterOutcome(MachineContext c, String matching, String othe
c.require(c.count(4, 2, 5, matching) + c.count(4, 2, 5, other) == 0 && c.inventory(5, 2, 5).getStackInSlot(0).isEmpty(), "finite source and filter buffer exhausted");
}
private static void drain(MachineContext c, String fluid, String tank, boolean switched) {
- c.block(5, 1, 5, "poweradvantage:fluid_drain");
+ c.block(5, 1, 5, "basepower:fluid_drain");
for (EnumFacing d : new EnumFacing[]{EnumFacing.NORTH, EnumFacing.SOUTH, EnumFacing.WEST, EnumFacing.EAST}) {
BlockPos p = BlockPos.ORIGIN.offset(d); c.block(5 + p.getX(), 2, 5 + p.getZ(), "minecraft:bedrock");
}
c.block(5, 2, 5, fluid);
- c.block(6, 1, 5, switched ? "poweradvantage:fluid_switch" : "poweradvantage:fluid_pipe");
+ c.block(6, 1, 5, switched ? "basepower:fluid_switch" : "basepower:fluid_pipe");
c.block(7, 1, 5, tank);
}
}
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamNetworkLifecycleCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamNetworkLifecycleCases.java
index ab4da9c0..a70621a2 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamNetworkLifecycleCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamNetworkLifecycleCases.java
@@ -48,10 +48,10 @@ private static void shortCase(List cases, boolean gap, boolean
c.steamSupply(3, 4, 8, 6000);
c.block(11, 5, 8, negative && !gap ? "minecraft:redstone_block" : "minecraft:air");
for (int x = 4; x <= 18; x++) {
- c.block(x, 4, 8, x == 11 ? "steamadvantage:steam_switch"
- : gap && negative && x == 15 ? "minecraft:air" : "steamadvantage:steam_pipe");
+ c.block(x, 4, 8, x == 11 ? "basesteam:steam_switch"
+ : gap && negative && x == 15 ? "minecraft:air" : "basesteam:steam_pipe");
}
- c.block(19, 4, 8, "steamadvantage:steam_crusher");
+ c.block(19, 4, 8, "basesteam:steam_crusher");
c.put(19, 4, 8, 0, "minecraft:stone", 8);
c.require(c.inventory(19, 4, 8).isItemValidForSlot(0, c.inventory(19, 4, 8).getStackInSlot(0)),
"The active native crushing registry accepts the finite stone stock");
@@ -75,10 +75,10 @@ private static void endurance(List cases, int ticks, String id)
ticks, c -> {
for (int z = 2; z <= 9; z++) {
c.steamSupply(3, 4, z, 10000);
- c.block(4, 4, z, "steamadvantage:steam_pipe");
+ c.block(4, 4, z, "basesteam:steam_pipe");
}
- for (int x = 5; x <= 21; x++) c.block(x, 4, 8, "steamadvantage:steam_pipe");
- c.block(22, 4, 8, "steamadvantage:steam_crusher");
+ for (int x = 5; x <= 21; x++) c.block(x, 4, 8, "basesteam:steam_pipe");
+ c.block(22, 4, 8, "basesteam:steam_crusher");
c.block(22, 5, 8, "minecraft:hopper");
c.block(22, 6, 8, "minecraft:chest");
c.block(23, 3, 8, "minecraft:chest");
@@ -193,9 +193,9 @@ void tick(MachineContext c) {
void control(MachineContext c, int elapsed, boolean interrupt) {
BlockPos local = gap ? new BlockPos(15, 4, 8) : new BlockPos(11, 5, 8);
- String before = gap ? interrupt ? "steamadvantage:steam_pipe" : "minecraft:air"
+ String before = gap ? interrupt ? "basesteam:steam_pipe" : "minecraft:air"
: interrupt ? "minecraft:air" : "minecraft:redstone_block";
- String after = gap ? interrupt ? "minecraft:air" : "steamadvantage:steam_pipe"
+ String after = gap ? interrupt ? "minecraft:air" : "basesteam:steam_pipe"
: interrupt ? "minecraft:redstone_block" : "minecraft:air";
BlockPos pos = c.at(local.getX(), local.getY(), local.getZ());
if (c.settingUp || !c.positions.contains(pos)) throw new IllegalStateException("Undeclared timed control location");
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalActors.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalActors.java
index 52896a25..1ee288a7 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalActors.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalActors.java
@@ -41,7 +41,7 @@ private static void elevator(List cases) {
"A real passenger moves to the physical stop, one move costs exactly 32 steam, "
+ "a steady signal never repeats the move, and insufficient steam leaves passenger/shaft unchanged.",
80, c -> {
- c.block(8, 0, 8, "steamadvantage:steam_elevator");
+ c.block(8, 0, 8, "basesteam:steam_elevator");
c.block(8, 9, 8, "minecraft:stone");
boolean down = mode.equals("down");
if (down) {
@@ -77,7 +77,7 @@ private static void elevator(List cases) {
IBlockState state = c.world.getBlockState(c.at(8, y, 8));
c.record("shaft/" + y, state.toString());
if (movedUp && y <= 6) {
- c.require("steamadvantage:platform".equals(String.valueOf(state.getBlock().getRegistryName())),
+ c.require("basesteam:platform".equals(String.valueOf(state.getBlock().getRegistryName())),
"Raised shaft contains physical platform segment " + y);
PropertyInteger height = (PropertyInteger) state.getBlock().getBlockState().getProperty("height");
c.require(height != null && state.getValue(height) == (y == 6 ? 4 : 0),
@@ -93,7 +93,7 @@ private static void elevator(List cases) {
}
private static void platform(MachineContext c, int y, int height) {
- c.block(8, y, 8, "steamadvantage:platform");
+ c.block(8, y, 8, "basesteam:platform");
IBlockState state = c.world.getBlockState(c.at(8, y, 8));
PropertyInteger property = (PropertyInteger) state.getBlock().getBlockState().getProperty("height");
if (property == null) throw new IllegalStateException("Missing native platform height");
@@ -127,15 +127,15 @@ private static void musket(List cases) {
};
shot.player.interactionManager.setGameType(GameType.SURVIVAL);
shot.player.setPositionAndRotation(muzzle.getX() + 0.5, muzzle.getY(), muzzle.getZ() + 0.5, 0, 0);
- Item weapon = ForgeRegistries.ITEMS.getValue(new ResourceLocation("steamadvantage:musket"));
+ Item weapon = ForgeRegistries.ITEMS.getValue(new ResourceLocation("basesteam:musket"));
c.require(weapon != null && weapon != net.minecraft.init.Items.AIR, "Native musket is registered");
shot.weapon = new ItemStack(weapon);
shot.player.setHeldItem(EnumHand.MAIN_HAND, shot.weapon);
- if (!mode.equals("no-ammo")) enchant(c, shot.weapon, "steamadvantage:rapid_reload");
- if (mode.equals("powderless")) enchant(c, shot.weapon, "steamadvantage:powderless");
+ if (!mode.equals("no-ammo")) enchant(c, shot.weapon, "basesteam:rapid_reload");
+ if (mode.equals("powderless")) enchant(c, shot.weapon, "basesteam:powderless");
if (mode.equals("infinity")) enchant(c, shot.weapon, "minecraft:infinity");
if (mode.equals("last-cartridge") || mode.equals("infinity")) {
- Item cartridge = ForgeRegistries.ITEMS.getValue(new ResourceLocation("steamadvantage:blackpowder_cartridge"));
+ Item cartridge = ForgeRegistries.ITEMS.getValue(new ResourceLocation("basesteam:blackpowder_cartridge"));
c.require(cartridge != null && cartridge != net.minecraft.init.Items.AIR, "Cartridge is registered");
shot.player.inventory.setInventorySlotContents(1, new ItemStack(cartridge));
}
@@ -190,7 +190,7 @@ private static void musket(List cases) {
private static float shotDamage() {
try {
- float damage = Class.forName("com.mcmoddev.steamadvantage.SteamAdvantage", false,
+ float damage = Class.forName("zone.moddev.mc.basesteam.SteamAdvantage", false,
SteamOperationalActors.class.getClassLoader()).getDeclaredField("MUSKET_DAMAGE").getFloat(null);
if (!Float.isFinite(damage) || damage <= 0 || damage >= 1000) throw new IllegalStateException("Unsupported configured musket damage");
return damage;
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalCases.java
index fcf71bea..8a9b87b4 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalCases.java
@@ -35,7 +35,7 @@ private static void add(List cases, String id, String contract,
}
private static void machine(MachineContext c, String id) {
- c.block(X, Y, Z, "steamadvantage:" + id);
+ c.block(X, Y, Z, "basesteam:" + id);
}
private static void supply(MachineContext c, float amount) {
@@ -126,23 +126,23 @@ private static void boilers(List cases) {
add(cases, "oil-production", "A finite 100 mB crude-oil charge converts 64 water to 80 steam at the historical 25-percent bonus.", 160,
c -> { machine(c, "steam_boiler_oil"); fill(c, "minecraft:water", 64);
- fill(c, "poweradvantage:crude_oil", 100); },
+ fill(c, "basepower:crude_oil", 100); },
c -> { fluid(c, "getWaterTank", "minecraft:water", 0);
- fluid(c, "getFuelTank", "poweradvantage:crude_oil", 0);
+ fluid(c, "getFuelTank", "basepower:crude_oil", 0);
c.require(steam(c) == 80, "64 debited water produces exactly 80 steam at the oil boiler's 1.25 ratio"); });
add(cases, "oil-water-not-fuel", "Water is not liquid fuel and cannot burn itself.", 120,
c -> { machine(c, "steam_boiler_oil"); fill(c, "minecraft:water", 64); },
c -> { fluid(c, "getWaterTank", "minecraft:water", 64);
- fluid(c, "getFuelTank", "poweradvantage:crude_oil", 0);
+ fluid(c, "getFuelTank", "basepower:crude_oil", 0);
c.require(steam(c) == 0, "Nonflammable water does not produce steam without fuel"); });
add(cases, "oil-dry", "Liquid fuel is preserved when no water is available.", 120,
- c -> { machine(c, "steam_boiler_oil"); fill(c, "poweradvantage:crude_oil", 100); },
- c -> { fluid(c, "getFuelTank", "poweradvantage:crude_oil", 100);
+ c -> { machine(c, "steam_boiler_oil"); fill(c, "basepower:crude_oil", 100); },
+ c -> { fluid(c, "getFuelTank", "basepower:crude_oil", 100);
c.require(steam(c) == 0, "Dry oil boiler does not ignite"); });
add(cases, "oil-small-charge", "A 1 mB fuel aliquot can boil a finite three-water charge without inventing water.", 100,
c -> { machine(c, "steam_boiler_oil"); fill(c, "minecraft:water", 3);
- fill(c, "poweradvantage:crude_oil", 1); },
- c -> { fluid(c, "getFuelTank", "poweradvantage:crude_oil", 0);
+ fill(c, "basepower:crude_oil", 1); },
+ c -> { fluid(c, "getFuelTank", "basepower:crude_oil", 0);
fluid(c, "getWaterTank", "minecraft:water", 0);
float value = steam(c); c.require(value >= 0 && value <= 3.75F,
"Three water cannot create more than 3.75 steam at the historical oil bonus (including idle loss)");
@@ -262,31 +262,31 @@ private static void crusherAndStorage(List cases) {
private static void still(List cases) {
add(cases, "still-production", "Steam distills finite crude oil at the historical 2:1 ratio.", 180,
- c -> { machine(c, "steam_still"); supply(c, 500); fill(c, "poweradvantage:crude_oil", 200); },
- c -> { fluid(c, "getInputTank", "poweradvantage:crude_oil", 0);
- fluid(c, "getOutputTank", "poweradvantage:refined_oil", 100);
+ c -> { machine(c, "steam_still"); supply(c, 500); fill(c, "basepower:crude_oil", 200); },
+ c -> { fluid(c, "getInputTank", "basepower:crude_oil", 0);
+ fluid(c, "getOutputTank", "basepower:refined_oil", 100);
c.require(remainingSteam(c) <= 500 - 50 * 1.5F, "50 two-application distillations debit 75 steam"); });
add(cases, "still-no-power", "Valid crude oil remains untouched without steam.", 160,
- c -> { machine(c, "steam_still"); fill(c, "poweradvantage:crude_oil", 200); },
- c -> { fluid(c, "getInputTank", "poweradvantage:crude_oil", 200);
- fluid(c, "getOutputTank", "poweradvantage:refined_oil", 0); });
+ c -> { machine(c, "steam_still"); fill(c, "basepower:crude_oil", 200); },
+ c -> { fluid(c, "getInputTank", "basepower:crude_oil", 200);
+ fluid(c, "getOutputTank", "basepower:refined_oil", 0); });
add(cases, "still-full-output", "A full output cannot destroy crude oil or spend productive steam.", 160,
- c -> { machine(c, "steam_still"); supply(c, 500); fill(c, "poweradvantage:crude_oil", 200);
- reserve(c, "TankOut", "poweradvantage:refined_oil", 1000); },
- c -> { fluid(c, "getInputTank", "poweradvantage:crude_oil", 200);
- fluid(c, "getOutputTank", "poweradvantage:refined_oil", 1000);
+ c -> { machine(c, "steam_still"); supply(c, 500); fill(c, "basepower:crude_oil", 200);
+ reserve(c, "TankOut", "basepower:refined_oil", 1000); },
+ c -> { fluid(c, "getInputTank", "basepower:crude_oil", 200);
+ fluid(c, "getOutputTank", "basepower:refined_oil", 1000);
c.require(remainingSteam(c) >= 500 - 2 * 160 * 0.0625F, "Full still spends no productive steam"); });
add(cases, "still-one-output-space", "The final single output space accepts one recipe, never discarding a second recipe.", 160,
- c -> { machine(c, "steam_still"); supply(c, 500); fill(c, "poweradvantage:crude_oil", 200);
- reserve(c, "TankOut", "poweradvantage:refined_oil", 999); },
- c -> { fluid(c, "getInputTank", "poweradvantage:crude_oil", 198);
- fluid(c, "getOutputTank", "poweradvantage:refined_oil", 1000);
+ c -> { machine(c, "steam_still"); supply(c, 500); fill(c, "basepower:crude_oil", 200);
+ reserve(c, "TankOut", "basepower:refined_oil", 999); },
+ c -> { fluid(c, "getInputTank", "basepower:crude_oil", 198);
+ fluid(c, "getOutputTank", "basepower:refined_oil", 1000);
c.require(remainingSteam(c) <= 498.5F, "The single accepted operation debits steam"); });
add(cases, "still-incomplete-input", "An incomplete 2-mB recipe cannot turn one mB into product.", 160,
c -> { machine(c, "steam_still"); supply(c, 500);
- reserve(c, "TankIn", "poweradvantage:crude_oil", 1); },
- c -> { fluid(c, "getInputTank", "poweradvantage:crude_oil", 1);
- fluid(c, "getOutputTank", "poweradvantage:refined_oil", 0); });
+ reserve(c, "TankIn", "basepower:crude_oil", 1); },
+ c -> { fluid(c, "getInputTank", "basepower:crude_oil", 1);
+ fluid(c, "getOutputTank", "basepower:refined_oil", 0); });
add(cases, "still-invalid-fluid", "A real capability rejects water as still feedstock.", 120,
c -> { machine(c, "steam_still"); supply(c, 500);
NativeFluidPort handler = new NativeFluidPort(c.tile(X, Y, Z), EnumFacing.UP);
@@ -294,7 +294,7 @@ private static void still(List cases) {
c.record("capability/rejected-water", accepted);
c.require(accepted == 0, "Water is rejected by the still input capability"); },
c -> { fluid(c, "getInputTank", "minecraft:water", 0);
- fluid(c, "getOutputTank", "poweradvantage:refined_oil", 0); });
+ fluid(c, "getOutputTank", "basepower:refined_oil", 0); });
}
private static void basin(MachineContext c) {
@@ -324,18 +324,18 @@ private static boolean blockIs(MachineContext c, int x, int y, int z, String id)
private static void pump(List cases) {
add(cases, "pump-3x3-intake-lift", "The pump builds its lift, removes finite real sources and delivers matching fluid at elevation.", 320,
c -> { machine(c, "steam_pump"); basin(c); supply(c, 600);
- c.block(X + 1, Y, Z, "poweradvantage:fluid_storage_tank"); },
+ c.block(X + 1, Y, Z, "basepower:fluid_storage_tank"); },
c -> { int removed = 9 - sources(c); int stored = c.fluidAmount(X + 1, Y, Z);
int internal = amount(c, "getTank");
c.require(removed > 0 && stored >= 1000, "Real intake removal delivers at least a bucket four blocks above the intake");
c.require(stored + internal == removed * 1000, "Every removed source is conserved between receiver and pump");
- for (int y = 1; y <= 3; y++) c.require(blockIs(c, X, y, Z, "steamadvantage:pump_pipe_steam"),
+ for (int y = 1; y <= 3; y++) c.require(blockIs(c, X, y, Z, "basesteam:pump_pipe_steam"),
"Natural pump ticks build lift segment " + y);
c.require(remainingSteam(c) <= 600 - 3 * 5 - removed * (32 + 4),
"Finite steam debits pipe placement and four-block lifting for every removed bucket"); });
add(cases, "pump-no-power", "A real 3x3 intake remains untouched without steam, including lift construction.", 180,
c -> { machine(c, "steam_pump"); basin(c);
- c.block(X + 1, Y, Z, "poweradvantage:fluid_storage_tank"); },
+ c.block(X + 1, Y, Z, "basepower:fluid_storage_tank"); },
c -> { c.require(sources(c) == 9 && amount(c, "getTank") == 0 && c.fluidAmount(X + 1, Y, Z) == 0,
"No power means no source removal or fluid output");
c.require(blockIs(c, X, Y - 1, Z, "minecraft:air"), "No steam means no lift construction"); });
@@ -345,7 +345,7 @@ private static void pump(List cases) {
c.require(blockIs(c, X, Y - 1, Z, "minecraft:air"), "Insufficient steam cannot place the first pipe"); });
add(cases, "pump-full-output", "A full connected receiver cannot delete pump fluid or debit a new source.", 160,
c -> { machine(c, "steam_pump"); basin(c); supply(c, 600); fill(c, "minecraft:lava", 1000);
- c.block(X + 1, Y, Z, "poweradvantage:fluid_storage_tank");
+ c.block(X + 1, Y, Z, "basepower:fluid_storage_tank");
c.tank(X + 1, Y, Z, "minecraft:lava", 4000); },
c -> { fluid(c, "getTank", "minecraft:lava", 1000);
c.require(c.fluidAmount(X + 1, Y, Z) == 4000 && sources(c) == 9,
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalSupplementalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalSupplementalCases.java
index 07737736..57a89b20 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalSupplementalCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamOperationalSupplementalCases.java
@@ -42,11 +42,11 @@ private static void priority(List cases) {
"A finite source fills a normal consumer before backup storage. Disabling backup discharge "
+ "prevents later relay masking the original allocation; a full-consumer control proves backup connectivity.",
80, c -> {
- c.block(8, 4, 8, "steamadvantage:steam_boiler_coal");
- c.block(9, 4, 8, "steamadvantage:steam_furnace");
- c.block(7, 4, 8, "steamadvantage:steam_pipe");
- c.block(6, 4, 8, "steamadvantage:steam_pipe");
- c.block(5, 4, 8, "steamadvantage:steam_tank");
+ c.block(8, 4, 8, "basesteam:steam_boiler_coal");
+ c.block(9, 4, 8, "basesteam:steam_furnace");
+ c.block(7, 4, 8, "basesteam:steam_pipe");
+ c.block(6, 4, 8, "basesteam:steam_pipe");
+ c.block(5, 4, 8, "basesteam:steam_tank");
c.block(4, 4, 8, "minecraft:redstone_block");
c.power(8, 4, 8, "steam", 40);
if (consumerFull) c.power(9, 4, 8, "steam", 200);
@@ -93,7 +93,7 @@ private static void recoil(List cases, int level) {
+ "only when enchanted. This measures impulse/packet delivery, not a manually ticked fake player's travel.",
40, c -> {
prepareShot(c, shot, "recoil-" + level, false);
- if (level > 0) enchant(c, shot.weapon, "steamadvantage:recoil", level);
+ if (level > 0) enchant(c, shot.weapon, "basesteam:recoil", level);
fire(c, shot);
}, c -> {
verifyShot(c, shot, false, false);
@@ -115,7 +115,7 @@ private static void explosive(List cases, int level) {
+ "Finite targets and the level-one blast remain inside the bay; no TNT or flammable terrain is seeded.",
40, c -> {
prepareShot(c, shot, "explosive-" + level, true);
- if (level > 0) enchant(c, shot.weapon, "steamadvantage:high_explosive", level);
+ if (level > 0) enchant(c, shot.weapon, "basesteam:high_explosive", level);
fire(c, shot);
shot.immediateCollateralFire = savedFireTicks(shot.collateral);
shot.immediateCollateralHealth = shot.collateral.getHealth();
@@ -168,12 +168,12 @@ private static void prepareShot(MachineContext c, Shot shot, String id, boolean
shot.player.interactionManager.setGameType(GameType.SURVIVAL);
shot.player.setPositionAndRotation(muzzle.getX() + 0.5, muzzle.getY(), muzzle.getZ() + 0.5, 0, 0);
shot.player.motionX = shot.player.motionY = shot.player.motionZ = 0;
- shot.weapon = new ItemStack(item(c, "steamadvantage:musket"));
+ shot.weapon = new ItemStack(item(c, "basesteam:musket"));
shot.player.setHeldItem(EnumHand.MAIN_HAND, shot.weapon);
- shot.player.inventory.setInventorySlotContents(1, new ItemStack(item(c, "steamadvantage:blackpowder_cartridge"), 2));
- enchant(c, shot.weapon, "steamadvantage:rapid_reload", 1);
+ shot.player.inventory.setInventorySlotContents(1, new ItemStack(item(c, "basesteam:blackpowder_cartridge"), 2));
+ enchant(c, shot.weapon, "basesteam:rapid_reload", 1);
try {
- shot.configuredDamage = Class.forName("com.mcmoddev.steamadvantage.SteamAdvantage", false,
+ shot.configuredDamage = Class.forName("zone.moddev.mc.basesteam.SteamAdvantage", false,
SteamOperationalSupplementalCases.class.getClassLoader()).getDeclaredField("MUSKET_DAMAGE").getFloat(null);
} catch (ReflectiveOperationException error) {
throw new IllegalStateException("Musket configuration contract is unavailable", error);
diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamReloadControlCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamReloadControlCases.java
index 9138de53..4db38b67 100644
--- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamReloadControlCases.java
+++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/SteamReloadControlCases.java
@@ -16,7 +16,7 @@ static void register(List cases) {
int[] stock = {0, 1, 32, 64};
for (int i = 0; i < stock.length; i++) {
int x = 3 + i * 6;
- c.block(x, Y, Z, "steamadvantage:steam_crusher");
+ c.block(x, Y, Z, "basesteam:steam_crusher");
c.put(x, Y, Z, 0, "minecraft:stone", stock[i]);
}
}, holding(new int[]{3, 9, 15, 21}, c -> {
@@ -41,7 +41,7 @@ private static void crusher(List cases, String name, boolean si
cases.add(new MachineScenario("steam/lifecycle/crusher-first-loaded-" + name,
"One native tick observes live redstone before touching saved crusher progress; no reload grace or replacement.", 1,
c -> {
- c.block(X, Y, Z, "steamadvantage:steam_crusher");
+ c.block(X, Y, Z, "basesteam:steam_crusher");
if (signalled) c.block(X - 1, Y, Z, "minecraft:redstone_block");
c.put(X, Y, Z, 0, "minecraft:stone", 1);
NBTTagCompound tag = new NBTTagCompound(); tag.setShort("progress", (short)106); c.seed(X, Y, Z, tag);
@@ -66,7 +66,7 @@ private static void furnace(List cases, boolean signalled) {
cases.add(new MachineScenario("steam/lifecycle/furnace-first-loaded-" + (signalled ? "signalled" : "unpowered"),
"A burning, partly completed furnace uses the real control signal for its first steam heat bonus and work increment.", 1,
c -> {
- c.block(X, Y, Z, "steamadvantage:steam_furnace");
+ c.block(X, Y, Z, "basesteam:steam_furnace");
if (signalled) c.block(X - 1, Y, Z, "minecraft:redstone_block");
c.put(X, Y, Z, 1, "minecraft:sand", 1);
NBTTagCompound tag = new NBTTagCompound();
diff --git a/test-rig/src/main/resources/mcmod.info b/test-rig/src/main/resources/mcmod.info
index 63eac976..b7857cc0 100644
--- a/test-rig/src/main/resources/mcmod.info
+++ b/test-rig/src/main/resources/mcmod.info
@@ -6,6 +6,6 @@
"version": "1.1.0.112021",
"mcversion": "1.12.2",
"authorList": ["MMD"],
- "dependencies": ["poweradvantage"]
+ "dependencies": ["basepower"]
}
]