diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 57bc1a7..16a7b78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Power Advantage 1.10 CI +name: basePower 1.10 CI on: push: @@ -13,7 +13,7 @@ permissions: contents: read concurrency: - group: poweradvantage-1.10-${{ github.workflow }}-${{ github.ref }} + group: basepower-1.10-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: @@ -81,16 +81,32 @@ jobs: -PoreSpawnDeobfJar=${{ steps.orespawn.outputs.jar }} --no-daemon --stacktrace + - name: Check the isolated test harness + run: >- + ./gradlew -p test-rig clean check assemble + -PpowerAdvantageDeobfJar=${{ github.workspace }}/build/libs-dev/basePower-2.4.4.110021-deobf.jar + --no-daemon --stacktrace + + - name: Install Python for migration contract tests + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6 + with: + python-version: '3.12.14' + + - name: Check migration and progression contracts + run: | + python -m pip install -r test-rig/migration/requirements.txt + python -m unittest discover -s test-rig/migration -p 'test_*.py' + - name: Upload audited release candidate uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: PowerAdvantage-1.10.2-${{ github.sha }} + name: basePower-1.10.2-${{ github.sha }} if-no-files-found: error retention-days: 30 path: | - build/libs/PowerAdvantage-2.4.3.110021.jar - build/libs/PowerAdvantage-2.4.3.110021-sources.jar - build/libs/PowerAdvantage-2.4.3.110021-javadoc.jar + build/libs/basePower-2.4.4.110021.jar + build/libs/basePower-2.4.4.110021-sources.jar + build/libs/basePower-2.4.4.110021-javadoc.jar build/release/SHA256SUMS CHANGELOG.txt @@ -98,7 +114,7 @@ jobs: if: failure() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: PowerAdvantage-1.10.2-diagnostics-${{ github.sha }} + name: basePower-1.10.2-diagnostics-${{ github.sha }} if-no-files-found: ignore retention-days: 14 path: | @@ -106,3 +122,5 @@ jobs: build/reports/** build/*-run/logs/** build/problems/** + test-rig/build/gradle/test-results/** + test-rig/build/gradle/reports/** diff --git a/.github/workflows/release-on-tag.yml b/.github/workflows/release-on-tag.yml index af9cd1a..1063725 100644 --- a/.github/workflows/release-on-tag.yml +++ b/.github/workflows/release-on-tag.yml @@ -1,4 +1,4 @@ -name: Validate Power Advantage release tag +name: Validate basePower release tag on: push: @@ -10,13 +10,13 @@ permissions: contents: read concurrency: - group: poweradvantage-release-tag-${{ github.ref_name }} + group: basepower-release-tag-${{ github.ref_name }} cancel-in-progress: false jobs: validate-release-tag: name: Validate tag for manual release confirmation - if: github.repository == 'MinecraftModDevelopmentMods/PowerAdvantage' + if: github.repository == 'MinecraftModDevelopmentMods/basePower' runs-on: ubuntu-latest timeout-minutes: 10 @@ -37,6 +37,11 @@ jobs: minecraft_version="$(value minecraft_version)" loader_name="$(value loader_name)" loader_code="$(value loader_code)" + project_id="$(value curseforge_project_id)" + if [[ ! "$project_id" =~ ^[1-9][0-9]*$ || "$project_id" == '240982' ]]; then + echo "basePower publication requires a new assigned CurseForge project; refusing $project_id" >&2 + exit 1 + fi IFS=. read -r mc_major mc_minor mc_patch extra <<<"$minecraft_version" if [[ -n "${extra:-}" || -z "${mc_major:-}" || -z "${mc_minor:-}" ]]; then diff --git a/.gitignore b/.gitignore index 22b1d0e..1c4c442 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ /classes/ /logs/ /mcmodsrepo/ +/.ci-dependencies/ /test-rig/.cache/ /test-rig/.gradle/ /test-rig/build/ @@ -77,6 +78,13 @@ !/libs/RF-API.zip /secret.json + +# Packaged output; only the wrapper and the pinned RF API belong in source control. +*.jar +*.zip +!/gradle/wrapper/gradle-wrapper.jar +!/libs/RF-API.jar +!/libs/RF-API.zip # Nested local tooling and generated output AGENTS.md AGENT.md diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 4e4bce2..4e55e89 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,4 +1,20 @@ -Unreleased +basePower 2.4.4.110021 + +- Continue Power Advantage as basePower, with the new basepower mod ID and namespace. +- Read released Cyano 1.10 block, item and tile identities without rebuilding machines. +- Import existing configuration and loot settings without overwriting base customisations. +- Translate saved Forge mod and oil-owner records before world loading, with byte-for-byte header backups. +- Keep OreSpawn choices during the identity change and stop on conflicting old and new settings. +- Keep fluid identities, processing rules and the legacy add-on API available. +- Restore translated portable-tank descriptions and retain the empty tank's description on its item. +- Check upgrades on copies of released Cyano worlds, including Sylvester, and retain machine contents across full restarts. +- Add finite-material recipe progression checks, including returned buckets, obtainable ingredient alternatives, villager trades and connected starter machines across full restarts. +- Route Forge fluid capability calls through each machine's fluid handler, so stills fill their input tank and tank restrictions are respected. +- Keep current OreSpawn global and saved-world profiles readable after a full restart, without resetting generation choices or accepting unknown future schemas. +- Add the basePower project logo and updated installation, migration and CurseForge descriptions. +- Run the migration-contract checks in clean checkouts and CI without depending on local folder names. + +Earlier unreleased Advantage fixes, retained in basePower - Restore missing carbon-dust and steel-block recipe names when equivalent registered materials are available. Keep existing Ore Dictionary entries and recipe amounts unchanged. - Enable Forge's universal bucket during mod construction so oil buckets work without another mod enabling them first. diff --git a/README.md b/README.md index c608618..46bbb98 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,40 @@ -# PowerAdvantage +# basePower -Power Advantage provides shared power, fluid, and item transport systems for its Minecraft 1.10.2 expansion mods. +basePower continues DrCyano's Power Advantage as a Base Metals expansion for Minecraft 1.10.2. It provides conveyors, filters, fluid pipes, tanks, oil processing and the shared power systems used by baseSteam and baseElectric. The original Advantage repositories remain available as historical references. -The [test coverage backport notes](TEST-COVERAGE-BACKPORT.md#final-recorded-candidate) record the final machine, restart, control, partial-network, GUI, endurance, connected-world and reproducibility results alongside exact candidate hashes. The bounded legacy checks pass; the recipe progression graph is still partial. Earlier failures, modern follow-up findings and manual-testing limits are kept in the notes. This is not an all-machines or all-worlds guarantee. +The new mod ID is `basepower`, with implementation packages under `zone.moddev.mc.basepower`. This is a coordinated replacement, not an add-on to the old Power Advantage jar. Read the [world migration instructions](docs/1.10/base-migration.md) before replacing mods in an existing world. -The maintained implementation namespace is `zone.moddev.mc.poweradvantage`. The legacy +## Playing And Upgrading + +Use Java 8, Forge `12.18.3.2511` or a compatible later 1.10.2 build, Base Metals and MMD OreSpawn. The maintained dependency pack was tested with Base Metals `2.5.1.110021` and OreSpawn `4.1.2.110021`. + +Back up the complete world and configuration, then try the upgrade on a copy. Replace Power Advantage with basePower. Replace Steam and Electric Advantage with matching baseSteam and baseElectric builds if they are installed; do not mix the old and new families. Existing machines and their saved contents migrate without rebuilding. Check the copy again after closing Minecraft completely and restarting it. + +The supported historical source is the released Cyano 1.10.2 line. Old third-party integrations which check the original mod IDs may need an update. In particular, IAF's plumbing provider detection needs its separate basePower update; the preserved API alone cannot change that check. + +## Validation And Guides + +The [current candidate checks](docs/1.10/base-qualification.md) list the exact tested jars, results and remaining release gates. + +The [recipe progression checks](docs/1.10/recipe-progression-checks.md) explain how the test rig verifies finite crafting chains, returned buckets, trading and a connected starter plant across full restarts. + +The [historical test coverage notes](TEST-COVERAGE-BACKPORT.md#final-recorded-candidate) record the earlier Advantage candidates, including their exact hashes and remaining limits. They do not qualify the renamed jars. The base migration uses fresh disposable-world, operating, restart, GUI and endurance checks. The bounded recipe audit is separate from its still-partial crafting progression graph; neither is an all-machines or all-worlds guarantee. + +The maintained implementation namespace is `zone.moddev.mc.basepower`. The legacy `cyano.poweradvantage.api` package remains the supported add-on API. -External fluid producers can offer fluid to an adjacent Power Advantage pipe through +External fluid producers can offer fluid to an adjacent basePower pipe through `cyano.poweradvantage.api.fluid.FluidNetworkApi.offerFluid(...)`. The method reports the exact accepted amount without draining the caller's tank, allowing optional integrations to remain in control of their own fluid state. The [Advantage Works 1.10.2 Handbook](docs/1.10/README.md) documents every machine and component across Power, Steam, and Electric Advantage, including commissioning layouts and known investigation points. The [MMD material and fluid compatibility specification](docs/1.10/mmd-material-fluid-compatibility.md) defines OreSpawn ownership, legacy migration, crude-oil aliases, and Ore Dictionary names. -The source-controlled [Advantage Works test rig](test-rig/README.md) turns those commissioning cards into a disposable, walkable Forge server world with repeatable save/restart checkpoints. It is a separate test mod and is never packaged with PowerAdvantage. +The source-controlled [Advantage Works test rig](test-rig/README.md) turns those commissioning cards into a disposable, walkable Forge server world with repeatable save/restart checkpoints. It is a separate test mod and is never packaged with basePower. ## Building Minecraft 1.10.2 -The rig profiles use Steam and Electric Advantage `2.2.5.110021`, which retain unfinished -drill work after a restart. The machine repairs and their verification scope are -described in the test coverage notes above; this work does not bump the version. +The candidate versions are basePower `2.4.4.110021` and baseSteam/baseElectric `2.2.6.110021`. Local qualification includes 188 operating cases and 188 cold-state comparisons in each dependency pack, original Cyano fixtures, a disposable Sylvester upgrade, and two finite-supply Steam endurance runs. These are not a promise that every machine has run for 30 minutes or that every third-party integration has been tested. The `master-1.10.2` build uses ForgeGradle 7.0.34 and Gradle 9.6.1. Run Gradle with Java 17; Gradle resolves the Java 8 toolchain used for compilation. @@ -30,6 +44,16 @@ Build the pinned OreSpawn commit `5a50df1158e948c8db55814e819090b34c12d765` firs gradlew.bat clean check build verifyReleaseDependencies verifyReleaseArtifacts writeReleaseChecksums ``` +The separate harness and migration-contract checks are also run in CI. With Python 3.12 installed: + +```text +gradlew.bat -p test-rig clean check assemble +python -m pip install -r test-rig/migration/requirements.txt +python -m unittest discover -s test-rig/migration -p "test_*.py" +``` + +These contract tests do not start the full native server matrix. Its copied-world, operating and endurance results are recorded in the qualification notes. + Release jars are written to `build/libs`. The deobfuscated development jar for sibling mod compilation is written to `build/libs-dev` by `deobfJar` or `build`. For Eclipse, import the repository as an existing Gradle project and run: @@ -39,3 +63,9 @@ gradlew.bat cleanEclipse verifyEclipseProductionClasspath ``` Base Metals remains a required distribution dependency and is absent from the compile classpath. OreSpawn is a required runtime dependency whose pinned public API is used at compile time; it is never bundled. Optional RF and RebornCore integrations compile against pinned API inputs and are not bundled. + +## Publishing + +Source delivery and CurseForge publication are separate. The new CurseForge project ID is still `0`, which deliberately blocks uploads; the original Power Advantage project must not be reused. No tag or release is created by the ordinary CI build. + +The [project-page copy](docs/curseforge-description.md) and [logo](docs/branding/README.md) are kept with the source. The logo is not part of the mod jar, so it does not change the tested artifacts. diff --git a/build.gradle b/build.gradle index ce740eb..d53a87f 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,7 @@ tasks.register('clientResourceProbeJar', Jar) { group = project.mod_group version = project.mod_version -base.archivesName = 'PowerAdvantage' +base.archivesName = 'basePower' def versionParts = project.mod_version.toString().tokenize('.') if (versionParts.size() != 4 || !versionParts.every { it ==~ /\d+/ }) { @@ -310,7 +310,7 @@ tasks.register('verifyReleaseConfiguration') { group = 'verification' description = 'Validates release identity, target metadata, and optional integration policy.' doLast { - if (project.mod_version != '2.4.3.110021') { + if (project.mod_version != '2.4.4.110021') { throw new GradleException("Unexpected PowerAdvantage release version: ${project.mod_version}") } if (project.minecraft_version != '1.10.2' @@ -325,10 +325,10 @@ tasks.register('verifyReleaseConfiguration') { || project.gradle_java_version != '17') { throw new GradleException('Unexpected release dispatcher target metadata') } - if (project.mod_id != 'poweradvantage' - || project.group.toString() != 'zone.moddev.mc.poweradvantage' - || base.archivesName.get() != 'PowerAdvantage' - || project.curseforge_project_id != '240982') { + if (project.mod_id != 'basepower' + || project.group.toString() != 'zone.moddev.mc.basepower' + || base.archivesName.get() != 'basePower' + || project.curseforge_project_id != '0') { throw new GradleException('Unexpected Forge, Maven, archive, or CurseForge identity') } if (project.cf_requirements != 'base-metals,mmd-orespawn' @@ -356,10 +356,10 @@ tasks.register('verifyReleaseConfiguration') { } } String mainSource = file( - 'src/main/java/zone/moddev/mc/poweradvantage/PowerAdvantage.java').getText('UTF-8') - if (!mainSource.contains('MODID = "poweradvantage"') - || !mainSource.contains('VERSION = "2.4.3.110021"') - || !mainSource.contains('required-after:orespawn@[4.0.6,5.0.0);after:basemetals')) { + 'src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java').getText('UTF-8') + if (!mainSource.contains('MODID = "basepower"') + || !mainSource.contains('VERSION = "2.4.4.110021"') + || !mainSource.contains('required-before:orespawn@[4.0.6,5.0.0)')) { throw new GradleException('PowerAdvantage source identity or dependency policy changed') } if (!file('src/main/java/cyano/poweradvantage/api/PoweredEntity.java').isFile()) { @@ -367,12 +367,26 @@ tasks.register('verifyReleaseConfiguration') { } def metadata = new JsonSlurper().parse(file('src/main/resources/mcmod.info')) def mod = metadata instanceof List ? metadata.first() : metadata - if (mod.modid != 'poweradvantage') { + if (mod.modid != 'basepower') { throw new GradleException('Source mcmod.info does not use the stable poweradvantage mod id') } } } +def publicationTargetAllowed = { String projectId -> + (projectId ==~ /[1-9][0-9]*/) && projectId != '240982' +} + +tasks.register('verifyPublicationTarget') { + group = 'verification' + description = 'Refuses publication until the new basePower CurseForge project is assigned.' + doLast { + if (!publicationTargetAllowed(project.curseforge_project_id.toString())) { + throw new GradleException('Assign the new basePower CurseForge project ID before publishing; never reuse Power Advantage 240982.') + } + } +} + tasks.register('verifyReleaseDependencies') { group = 'verification' description = 'Resolves and audits Forge plus the exact optional compile APIs.' @@ -493,14 +507,14 @@ tasks.register('verifyReleaseArtifacts') { new ZipFile(mainJar).withCloseable { zip -> List names = zip.entries().collect { it.name } ['mcmod.info', 'pack.mcmeta', - 'zone/moddev/mc/poweradvantage/PowerAdvantage.class', + 'zone/moddev/mc/basepower/PowerAdvantage.class', 'cyano/poweradvantage/api/PoweredEntity.class', 'cyano/poweradvantage/api/fluid/FluidNetworkApi.class', 'com/mcmoddev/poweradvantage/math/Integer2D.class', 'com/mcmoddev/poweradvantage/registry/ITileEntityGUI.class', 'com/mcmoddev/poweradvantage/conduitnetwork/ConduitRegistry.class', 'com/mcmoddev/poweradvantage/init/Fluids.class', - 'assets/poweradvantage/lang/en_US.lang'].each { required -> + 'assets/basepower/lang/en_US.lang'].each { required -> if (!names.contains(required)) { throw new GradleException("Release jar is missing ${required}") } @@ -557,7 +571,7 @@ tasks.register('verifyReleaseArtifacts') { } new ZipFile(new File(libs, expectedReleaseFiles.get()[1])).withCloseable { sourceZip -> - if (sourceZip.getEntry('zone/moddev/mc/poweradvantage/PowerAdvantage.java') == null + if (sourceZip.getEntry('zone/moddev/mc/basepower/PowerAdvantage.java') == null || sourceZip.getEntry('cyano/poweradvantage/api/PoweredEntity.java') == null || sourceZip.getEntry('cyano/poweradvantage/api/fluid/FluidNetworkApi.java') == null) { throw new GradleException('Sources jar is missing implementation or legacy API sources') @@ -598,6 +612,7 @@ tasks.register('writeReleaseChecksums') { tasks.register('verifyPreparedReleaseArtifacts') { group = 'verification' description = 'Audits an immutable release bundle before Maven publication.' + dependsOn tasks.named('verifyReleaseConfiguration') doLast { if (!preparedReleaseDir.isPresent()) { throw new GradleException('preparedReleaseDir is required for prepared artifact publication') @@ -655,9 +670,9 @@ publishing { artifact(tasks.named('javadocJar')) } pom { - name = 'Power Advantage' + name = 'basePower' description = project.mod_description - url = 'https://github.com/MinecraftModDevelopmentMods/PowerAdvantage' + url = 'https://github.com/MinecraftModDevelopmentMods/basePower' licenses { license { name = 'GNU Lesser General Public License, Version 3' @@ -665,9 +680,9 @@ publishing { } } scm { - connection = 'scm:git:https://github.com/MinecraftModDevelopmentMods/PowerAdvantage.git' - developerConnection = 'scm:git:ssh://git@github.com/MinecraftModDevelopmentMods/PowerAdvantage.git' - url = 'https://github.com/MinecraftModDevelopmentMods/PowerAdvantage' + connection = 'scm:git:https://github.com/MinecraftModDevelopmentMods/basePower.git' + developerConnection = 'scm:git:ssh://git@github.com/MinecraftModDevelopmentMods/basePower.git' + url = 'https://github.com/MinecraftModDevelopmentMods/basePower' } } } @@ -700,12 +715,71 @@ tasks.register('validateMavenReleaseCredentials') { } tasks.withType(PublishToMavenRepository).configureEach { + dependsOn tasks.named('verifyPublicationTarget') + dependsOn tasks.named('verifyReleaseConfiguration') dependsOn tasks.named('validateMavenReleaseCredentials') dependsOn preparedReleaseDir.isPresent() ? tasks.named('verifyPreparedReleaseArtifacts') : tasks.named('verifyReleaseArtifacts') } +tasks.register('verifyPublicationGuards') { + group = 'verification' + description = 'Checks publication policy and task dependencies without executing publication.' + inputs.files('build.gradle', '.github/workflows/release-on-tag.yml') + doLast { + ['', '0', '240982', '-1', 'unassigned'].each { rejectedId -> + if (publicationTargetAllowed(rejectedId)) { + throw new GradleException("Publication target must reject '${rejectedId}'") + } + } + if (!publicationTargetAllowed('999999')) { + throw new GradleException('Publication target must accept an assigned non-legacy numeric ID') + } + if (publishing.publications.named('mavenJava', MavenPublication).get().pom.name.get() != 'basePower') { + throw new GradleException('Maven POM must use the basePower name') + } + def requireDependencies = { Task candidate, List required -> + Set actual = candidate.taskDependencies.getDependencies(candidate).collect { it.name } as Set + if (!actual.containsAll(required)) { + throw new GradleException("${candidate.name} is missing guards: ${required - actual}") + } + } + requireDependencies(tasks.named('verifyPreparedReleaseArtifacts').get(), ['verifyReleaseConfiguration']) + def publicationTasks = tasks.withType(PublishToMavenRepository).toList() + if (publicationTasks.isEmpty()) { + throw new GradleException('No external Maven publication task was inspected') + } + publicationTasks.each { publicationTask -> + requireDependencies(publicationTask, ['verifyPublicationTarget', 'verifyReleaseConfiguration', + 'validateMavenReleaseCredentials', preparedReleaseDir.isPresent() + ? 'verifyPreparedReleaseArtifacts' : 'verifyReleaseArtifacts']) + } + // Inspect dependencies only; never invoke publication or its rejecting guard actions. + def pending = [tasks.named('check').get()] + Set inspected = [] as Set + while (!pending.isEmpty()) { + Task candidate = pending.remove(pending.size() - 1) + if (!inspected.add(candidate)) continue + if (candidate instanceof PublishToMavenRepository || candidate.name == 'verifyPublicationTarget') { + throw new GradleException("Normal check must not execute ${candidate.name}") + } + pending.addAll(candidate.taskDependencies.getDependencies(candidate)) + } + String tagWorkflow = file('.github/workflows/release-on-tag.yml').readLines('UTF-8') + .collect { it.trim() }.join('\n') + String tagGuard = '''project_id="$(value curseforge_project_id)" +if [[ ! "$project_id" =~ ^[1-9][0-9]*$ || "$project_id" == '240982' ]]; then +echo "basePower publication requires a new assigned CurseForge project; refusing $project_id" >&2 +exit 1 +fi'''.replace('\r\n', '\n') + if (!tagWorkflow.contains(tagGuard) + || tagWorkflow.indexOf(tagGuard) > tagWorkflow.indexOf('successful_ci=')) { + throw new GradleException('Release tag must reject unassigned and legacy project IDs before checking CI') + } + } +} + idea { module { downloadSources = true @@ -837,7 +911,7 @@ tasks.register('verifyEclipseProductionClasspath') { || contents.contains('src/test') || contents.contains('bin/test')) { throw new GradleException("${name} does not isolate production code") } - if (!contents.contains('PROJECT_ATTR" value="PowerAdvantage"')) { + if (!contents.contains('PROJECT_ATTR" value="basePower"')) { throw new GradleException("${name} targets the wrong Eclipse project") } } @@ -846,6 +920,7 @@ tasks.register('verifyEclipseProductionClasspath') { tasks.named('check') { dependsOn tasks.named('verifyReleaseConfiguration') + dependsOn tasks.named('verifyPublicationGuards') } tasks.register('prepareGuiProbeLaunch') { diff --git a/docs/1.10/README.md b/docs/1.10/README.md index 35c398d..1efdc0e 100644 --- a/docs/1.10/README.md +++ b/docs/1.10/README.md @@ -18,6 +18,7 @@ This handbook serves two audiences at once. A player should be able to build and | [Inspector's Register of Possible Legacy Bugs](possible-legacy-bugs.md) | Intent-versus-code discrepancies waiting for gameplay investigation | | [MMD Material And Fluid Compatibility](mmd-material-fluid-compatibility.md) | OreSpawn ownership, migration authority, crude-oil aliases, and Ore Dictionary standards | | [Advantage Works test rig](../../test-rig/README.md) | Source-controlled generator and runner for the 20 commissioning cards | +| [Recipe Progression Checks](recipe-progression-checks.md) | Finite raw-material routes, real crafting/trading, returned containers and a restart-tested starter plant | ## Edition authority diff --git a/docs/1.10/base-migration.md b/docs/1.10/base-migration.md new file mode 100644 index 0000000..acbad08 --- /dev/null +++ b/docs/1.10/base-migration.md @@ -0,0 +1,42 @@ +# Moving From Advantage To basePower + +basePower, baseSteam and baseElectric continue the released Minecraft 1.10.2 Advantage mods under new names. The original repositories have not been renamed or removed. + +## Before Opening A World + +1. Close Minecraft and make a complete backup of the world and its configuration. +2. Remove the old Power Advantage, Steam Advantage and Electric Advantage jars. Install the matching base replacements together; do not mix old and new expansion jars. +3. Keep the required Base Metals and OreSpawn dependencies installed. Optional converter content still needs the corresponding power mod. +4. Test a copy first. Check inventories, fluids, batteries, machine directions and ongoing jobs, then close Minecraft completely and open the copy again. + +The supported historical source is the released Cyano Minecraft 1.10.2 line. Later base releases will migrate from the base identities. Unpublished intermediate Advantage ports are not a separate compatibility promise. + +## What Changes + +| Original mod ID | Replacement mod ID | Display name | +| --- | --- | --- | +| `poweradvantage` | `basepower` | basePower | +| `steamadvantage` | `basesteam` | baseSteam | +| `electricadvantage` | `baseelectric` | baseElectric | + +Existing block and item names retain their path, with the new namespace. Forge's registry remapping retains the saved numeric IDs and metadata rather than rebuilding machines. Tile entities accept the released IDs and write their new canonical IDs on save. An unknown owned component is a migration failure, not permission to replace it with air. + +Fluid registry names such as `crude_oil` and `refined_oil`, machine NBT keys, quantities and processing rules are not being renamed for branding. The legacy `cyano.poweradvantage.api` and supported compatibility facades remain available to integrations. + +The four musket enchantments also keep their original `steamadvantage` registry keys. Forge 1.10 cannot remap that registry in the same way as blocks and items. Keeping those keys and their registration order preserves enchantments on existing weapons; it does not mean the old Steam Advantage jar should remain installed. + +Forge also saves the owning mod for each default fluid in the world header. The migration converts the two Power oil owners before Forge reads that header and retains byte-for-byte copies of changed headers in `basepower-migration-backups`. These header copies are an audit trail, not a substitute for backing up the complete world. Restore the complete original backup to roll back an upgrade, not an old header alongside converted chunks. + +The saved mod list is also translated, but only for replacement mods actually installed. Other mods are not relabelled or hidden. Legacy read aliases must remain available in later base ports: unvisited chunks and offline players can still contain old tile or item IDs even after the world's header has been updated. + +If a new base configuration does not exist, the matching old `.cfg` is copied. The old file is kept, and an existing base configuration wins. Additional Loot Tables files are imported without overwriting base customisations; old copies are retained under inactive backup suffixes so both sets do not inject loot. + +OreSpawn configuration requires the same care: user choices must remain authoritative and an old rule must not be activated alongside a new default for the same deposit. Provider migration is covered separately from block remapping. + +## Validation Boundary + +The regression work uses disposable, hash-checked copies of original-release fixtures. It checks saved state, real machine operation, full process restarts and a measured 30-minute finite-resource endurance job. Generated worlds and reports are local evidence, never release contents. + +Automated checks do not replace visual and gameplay acceptance. A build or server-start pass alone is not proof that a world migrated without losing contents. Current candidate results and any remaining gaps must be reported against the exact tested jars before release. + +The new CurseForge projects have not been assigned numeric project IDs in this source yet. Publication must remain blocked until those IDs are supplied; the old Advantage upload targets must never be reused. diff --git a/docs/1.10/base-qualification.md b/docs/1.10/base-qualification.md new file mode 100644 index 0000000..9660c8f --- /dev/null +++ b/docs/1.10/base-qualification.md @@ -0,0 +1,131 @@ +# base 1.10.2 Candidate Checks + +This is the local basePower/baseSteam/baseElectric identity-migration candidate, not a published release. The old Advantage repositories remain intact. Tests use disposable copies; the original Sylvester world has not been converted. + +The results below record exact-artifact qualification before source delivery. Git commits, hosted checks and CurseForge publication are separate steps. Both expansions must pin the approved basePower source commit and development-jar checksum before their guarded release checks can pass. New CurseForge project IDs remain unassigned, so publication stays blocked. + +## Current OreSpawn Restart Repair + +The current basePower jar repairs the combined Sylvester restart failure recorded below. Global and saved-world OreSpawn profiles have separate supported schema limits: global schema 8 and world schema 7 are accepted without downgrading either file. Unknown future schemas still stop before any write. The earlier fluid-capability repair remains included; Steam and Electric release bytes are unchanged. + +| Current jar | SHA-256 | +| --- | --- | +| `basePower-2.4.4.110021.jar` | `164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31` | +| `baseSteam-2.2.6.110021.jar` | `728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D` | +| `baseElectric-2.2.6.110021.jar` | `05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1` | + +This is a replacement of an unreleased candidate, not a new published version. The failed jar and its reports are retained under their original checksum. + +| Requalification check | Result and limit | +| --- | --- | +| Schema regressions | Three new preservation/restart tests fail before repair and pass afterwards. A fourth test requires unknown global/world schemas to fail before any write or backup. Current settings, disabled rules, provider records, retrogen controls and exact no-op bytes are retained. | +| Build | Power's full build, dependency, archive, Javadoc and Eclipse checks pass. Steam/Electric tests and assembly pass against the new development jar, with unchanged release bytes. Their exact-source pin checks are completed separately during source delivery. | +| Unit tests | Power: 87 tests, one Windows symlink-privilege skip; Steam: 135; Electric: 70; harness: 92; Python contracts: 189. No failures in the final runs. | +| Operating rigs | All 188 natural-tick cases and all 188 cold-state comparisons pass in both the older API pack and the maintained Base Metals `2.5.1.110021` / OreSpawn `4.1.2.110021` pack. | +| Independent controls | All nine partial-network cases and six first-tick/comparator cases pass independent raw-evidence checks in each dependency pack. | +| Endurance | Both dependency packs complete 36,000 natural ticks and a full process restart. Each finite Steam network/crusher reconciles 320 input stones as 287 products and 33 remaining inputs, with 116 ticks of partial work retained and zero lost progress. All 80,000 initial steam units reconcile as 53,986.5 productive use, 15,201.4375 idle loss and 10,812.0625 remaining. No refills or rebuilding. | +| Endurance limits | All 37 checkpoints and 287 batch receipts reconcile per pack; shortened and lost-progress records are rejected. The measured first-to-last tick intervals are 1,799.946 and 1,799.950 seconds. These are two Steam network/crusher jobs, not 30-minute tests of every machine. | +| Progression | All six mode/rubber configurations pass with maintained dependencies: 24 server processes and 10,576 finite-stock actions. Independent checks reconcile hammer wear, paid trades, real oil/plastic processing and cold inventory state. The unused lithium nugget remains unproven; complete progression is still labelled `PARTIAL`. | +| Original-release fixtures | The six connected setups, all 355 passive state witnesses and the separate synthetic serializers pass again on the rebuilt jar. This route deliberately retains the original Base Metals registry; its known bucket diagnostic has fresh, exact-candidate evidence. | +| Sylvester preservation | A disposable copy of the actual world passes first load and full restart with maintained Base Metals/OreSpawn. All 1,200 Advantage tile records retain exact typed state, including heat, fluids, energy and inventories. All 87,759 saved chunk states and 18,184 stack records match the old-mod control after the documented identity aliases; all 27,686 saved entity identities and four player records remain. | +| Sylvester operation | Two 2,048-tick operating intervals, separated by a full process restart, complete without construction or refills. Machine NBT and inventory contents match exactly across that restart. Nine boilers stay hot, four already-connected steam tanks retain pressure, and the full water/crude-oil tanks retain their contents. Two pre-existing empty steam tanks remain empty. | +| Sylvester limits | Its crusher has no input and the conveyors remain idle, so this world does not prove their throughput. Three real offline player files provide 104 successful native inventory/ender-stack reads; no authenticated player login was performed. Electric is not installed in this historical world. | +| Worldgen choices | Sylvester's global schema-8 and world schema-7 profiles remain byte-for-byte unchanged across all five repaired boots, including the operating restart. The saved world remains in `legacy` geology mode. | +| Third-party controls | The exact same 275 obsolete, inventory-free BuildingBricks dirt-helper records disappear on the old-mod and repaired cold boots. The replacement Sky's Grass Slabs blocks remain unchanged. Raw strict failures stay available; the explanation is restricted to the exact matching records and rejects unmatched positions or inventory-bearing records. | +| Packaging and reproducibility | Independent source exports in paths with spaces reproduce all four Power artifacts using a shared dependency cache, not a fresh empty cache. All 12 current release/development/source/Javadoc archives pass isolation checks. Only the worldgen identity helper and its nested classes differ in the main jar; three nested classes differ only in debug positions. Public API classes and assets are unchanged. | + +The original Sylvester installation and earlier failed evidence remain unchanged. Broader player login, client visuals and optional third-party integrations still need their own acceptance; these results do not turn a server-start pass into an all-worlds guarantee. The earlier GUI/world-generation profile runs below retain their older checksums. + +## Earlier Fluid-Capability Candidate + +This earlier basePower jar repaired `PA-110-002`: Forge capability calls use the machine's own fluid handler instead of bypassing it through the output tank. The native starter-plant test exposed this defect; its failed runs remain available. Steam and Electric release bytes were unchanged. + +| Earlier jar | SHA-256 | +| --- | --- | +| `basePower-2.4.4.110021.jar` | `9941893C0F536D97E3305212F3083C663F2F0BE30EF56B12AA5E6BEE3C2AE00C` | +| `baseSteam-2.2.6.110021.jar` | `728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D` | +| `baseElectric-2.2.6.110021.jar` | `05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1` | + +The version number is unchanged because this is still the same unreleased candidate. Use the checksum to distinguish it from the earlier jar below. + +| Follow-up check | Result and limit | +| --- | --- | +| Focused capability regressions | Four pass; three failed before repair. They cover input/output routing, side and fluid restrictions, simulation/capacity, and output-only draining. | +| Unit tests | Power: 83 tests, one Windows symlink-privilege skip; Steam: 135; Electric: 70; harness: 92; Python contracts: 189. No failures in the final runs. Profile JSON files are now declared Gradle test inputs. | +| Native operating suite | All 188 operating cases and all 188 strict cold-state comparisons pass against the rebuilt Power jar. Independent partial-network and Steam control audits also pass. | +| Survival progression | Normal, Tech Progression and Apocalyptic each pass with rubber equivalence both enabled and disabled: six configurations, 24 server processes and 10,592 finite-stock actions. | +| Real processing | Each configuration collects crude oil with a bucket, distils 1,000 mB into 500 mB refined oil, and produces five plastic ingots using only naturally generated hydroelectricity. A separately fuelled furnace receives boiler steam and exceeds coal-only temperature. | +| Trading and wear | The two Apocalyptic cases each execute 71 paid native trades. An independent audit reconciles merchant use counts and actual typed hammer-damage NBT with the recorded actions. | +| Restart | Crafting stock survives a process restart. The plant's exact block states and typed tile NBT survive a mid-cycle restart before ticking, and completed products and typed item state survive a final restart. No rebuilding or reseeding. | +| Coverage | All 88 registered item/block-item identities in the pinned pack have a route, a justified exclusion or a visible gap. The unused lithium nugget remains unproven; no new recipe was added for it. | +| Reproducibility and packaging | Two clean source exports in paths containing spaces reproduce all four Power artifacts. Twelve current release/development/source/Javadoc archives pass structural isolation checks. Only one main-jar class changed; resources and public API descriptors are identical. The dependency cache was shared. | +| Original connected world | Fresh rerun against these exact jars: all six released-Cyano setups preserve unticked state, then pass two 2,048-tick work intervals across a complete process restart. No machines are rebuilt or replaced. The Steam drill finishes its finite target before restart; the restarted check accounts for that exhausted target rather than inventing more work. | +| Original passive world | Fresh conversion and cold restart preserve all 355 block-state witnesses, 332 tiles, 272 inventory stacks (2,654 items) and four enchantment entries. The original fixture has no saved player or entity witnesses. | +| Additional serializers | Three synthetic native serializer cases pass again on each boot: detached player inventories, enchanted dropped items and nested item payloads. These remain separate from real player login, respawn and historical entity acceptance. | +| Migration evidence | Independent hash verification covers 904 retained raw migration/proof files. Original fixtures, test protocols and all three manual-test jars remain unchanged. The original Base Metals 2.4 registry is retained to isolate the Advantage rename; this is not also a Base Metals upgrade test. | +| Endurance rerun | The same manual-test jars complete 36,000 natural ticks in 1,799.948 measured seconds, followed by a full process restart and exact saved-state comparison. The finite Steam network supplies 35,991 paid work ticks with zero lost progress: 320 input stones reconcile as 287 finished products plus 33 remaining inputs, with 116 ticks of partial work retained. All 80,000 initial steam units reconcile as 53,986.5 productive use, 15,201.4375 idle loss and 10,812.0625 remaining. No refills or rebuilding. | +| Independent endurance audit | All 37 checkpoints and 287 batch receipts reconcile. Deliberately shortened, altered-steam and lost-progress records are rejected. This is one Steam network/crusher endurance job, not a 30-minute test of every machine. | + +The progression matrix uses the pinned Base Metals `2.5.0-beta4.238` and OreSpawn `4.0.8.110021` pack. It does not establish optional Additional Loot Tables integration, every third-party ingredient provider, resource-gathering balance, villager encounter/levelling, or later Minecraft recipe advancements. Read [Recipe Progression Checks](recipe-progression-checks.md) for the exact method and limits. + +The GUI images and optional-dependency/world-generation profiles below still belong to the earlier Power checksum. They are preserved evidence, not freshly rerun claims for this replacement jar. Original-release migration and the finite Steam endurance job have now been rerun as recorded above; the new 188-case suite separately checks restart preservation. Endurance timing runs from the first measured tick to the last: 36,000 observations span approximately 1,799.95 seconds at 20 ticks per second. + +The remaining source-commit, publication and manual-acceptance gates still apply. The new files have not been committed, pushed or published. + +## Earlier Sylvester Upgrade Failure + +A separate test replaced released Cyano Power/Steam and Base Metals 2.4 in a disposable copy of the actual Sylvester world. It used the earlier fluid-capability candidate checksums above, maintained Base Metals `2.5.1.110021`, OreSpawn `4.1.2.110021` and Forge `12.18.3.2511`. Electric was not installed because it is not part of this source world. The original save and configuration remain unchanged. + +The first load visits 2,346 existing chunks without ticking or rebuilding machines. All 1,200 Advantage tile records preserve their complete typed saved state, including all nine geothermal temperatures. An offline scan covers all 87,759 saved chunks. Compared with the old-mod control, block states match throughout, all 18,184 saved item-stack records match after the documented Advantage/Base Metals identity aliases, all 27,686 saved entity identities remain, and all four saved player records retain their state. Native item deserialization also preserves 104 inventory/ender-chest stacks from the three actual player files; this is not a player-login test. + +Both the control and upgrade perform the same existing BuildingBricks-to-Sky's Grass Slabs conversions and HarvestCraft item-name normalizations. Their raw source-comparison failures are retained. The nine tile differences between the two runs are the already-repaired geothermal reload defect: the old Steam jar resets heat, while baseSteam retains the original values. + +**That earlier candidate failed qualification.** Its full-process restart fails during basePower initialization: `LegacyWorldgenIdentity` rejects profile schemas above 6, but the selected maintained OreSpawn writes global schema 8 and world schema 7. No worldgen configuration was removed or downgraded to bypass the failure. The candidate jars and failed boot remain preserved. The replacement's fresh results are recorded at the top of this page. The old-mod operating control completed 2,048 natural ticks. + +## Earlier Identity-Migration Candidate + +| Jar | SHA-256 | +| --- | --- | +| `basePower-2.4.4.110021.jar` | `5F29C9D4A473F15881C782853256A8409ACFA17EC2A6C3AE2F3CD1DC64EF0405` | +| `baseSteam-2.2.6.110021.jar` | `728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D` | +| `baseElectric-2.2.6.110021.jar` | `05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1` | + +Earlier Advantage results do not qualify these jars. The native runs pin the production files, server code, fixtures and test protocol. Migration-specific harness repairs have their own inputs; the three production jars stay unchanged. + +## Completed Checks + +| Check | Result and limit | +| --- | --- | +| Unit tests | Power: 79 tests, one Windows symlink-privilege skip; Steam: 135; Electric: 70. No failures. | +| Test-harness contracts | 91 Java tests and 167 Python tests passed, including checks that reject incorrect migration evidence. | +| Native operating suite | All 188 cases passed, followed by 188 exact block/state/typed-NBT comparisons after a complete server restart. | +| Independent controls | All nine partial-network cases and six first-tick/comparator control cases passed independent raw-evidence audits. | +| Endurance | Steam-network job: 36,000 natural ticks, 1,799.958 measured seconds, 35,991 paid work ticks and zero lost-progress ticks. The saved result survived a full process restart. This is not a 30-minute endurance claim for every machine. | +| Harvest | 272 executed checks on each of two cold boots; version-inapplicable cases stay explicitly excluded. | +| Client GUIs | All 39 machine screens passed 351 caption cases and rejected 355 negative controls. This checks layout and text, not every world model or manual interaction. | +| Original connected world | Six released-Cyano setups preserved unticked state, then completed paid work on both converted and restarted boots without replacing machines. | +| Original passive world | All 355 block-state witnesses, 332 tile records, 272 inventory stacks (2,654 items) and four enchantment entries passed unticked conversion/restart comparisons. The source has no saved players or entities. | +| Additional serializers | Three synthetic native serializer cases passed on each boot: detached player inventories, enchanted dropped items and nested item payloads. They do not prove actual player login, respawn or historical entity spawning. | +| Packaged profile protocols | Current Base Metals, decoupled, Mineralogy oil processing, optional-power discovery, both fresh world-generation profiles and legacy OS1 import passed save/restart protocols. Station-specific `MANUAL_REQUIRED` results remain manual checks, not automatic passes. | +| Recipes | Bounded native matching, consumption and recipe-mode assertions passed. The conservative complete-progression graph remains `PARTIAL`; this is not a claim that every survival route has been proven. | +| Reproducibility | Six builds in two independent source directories containing spaces reproduced all 12 release, development, source and Javadoc jars. The Gradle dependency cache was shared, not freshly downloaded. | +| Archive isolation | Independent inspection found Java 8 classes, the expected mod IDs/assets and no embedded dependency, harness or agent content. This does not bypass the guarded release tasks. | +| Eclipse | Production classpath checks passed for all three projects. | + +The passive fixture retains its exact original test-observer jar. Its startup handlers freeze ticking; building is an explicit command which the migration runner forbids. This fixes an omitted fixture dependency without changing production migration, rebuilding the fixture or hiding a missing-mod error. + +## Preserved Failures + +Failed logs and receipts have not been replaced. They include the initial migration/header failures, stale harness expectations and the known original Base Metals 2.4 late-universal-bucket diagnostic. The latter is classified only with fresh dependency-only boots and bucket/restart behaviour checks bound to the exact candidate. Other startup errors remain failures. + +The drill's compatible new `Facing` field is compared against its original metadata, not ignored. Wrong facings, extra state changes and missing inventory remain failures. Retained musket enchantment keys are checked explicitly. + +## Before Release + +- Require an approved exact basePower source commit and development-jar checksum in both expansions, then run their complete guarded release suites. Local runtime results do not substitute for those source and dependency checks. +- Assign new CurseForge project IDs. The old Advantage projects must not be upload targets; `0` is an intentional publication block. +- Complete manual gameplay/visual acceptance on copies of real worlds. +- Update IAF's optional provider detection separately. Its current 1.10 plumbing bridge checks `poweradvantage`, so it does not offer fluid to `basepower` despite the retained typed API. Failed offers do not drain IAF's fluid. +- Keep the old and new Advantage jars out of the same instance. Read [the migration instructions](base-migration.md) and back up the complete world and configuration first. + +No claim is made here for unported third-party mods, original player login/respawn behaviour, every possible world, or unpublished intermediate Advantage identities. Legacy read aliases must remain available for unvisited chunks and offline players in later base ports. diff --git a/docs/1.10/possible-legacy-bugs.md b/docs/1.10/possible-legacy-bugs.md index 7fbf1bf..e1070e8 100644 --- a/docs/1.10/possible-legacy-bugs.md +++ b/docs/1.10/possible-legacy-bugs.md @@ -16,6 +16,7 @@ | `PA-110-001` | Refined-oil contact effect | None: original release behaviour confirmed | Closed; historical wording uncertainty | | `EA-110-002` | Growth controller soil capacity | None: whole-block refill hysteresis works coherently | Closed by runtime characterization | | `SA-110-003` | Steam crusher comparator output | Low: automation signal cannot distinguish input quantity | Repaired in `2.2.2.110021`; automated signal regression passes | +| `PA-110-002` | Forge fluid capability bypasses machine routing | High: raw oil enters the still's output tank and processing stops | Repaired in the local basePower `2.4.4.110021` candidate; focused and packaged-machine regressions pass | ## SA-110-001: steam pump reads a different tank key @@ -124,6 +125,18 @@ - **Required layout:** Steam crusher, comparator and dust/readout line, valid input item at four stack levels; [Card S-04](commissioning-and-fault-finding.md#card-s-04-blast-furnace-and-crusher). - **Versions to check:** Original and maintained 1.10.2, then 1.12.2. +## PA-110-002: Forge fluid capability bypasses machine routing + +- **Component:** The shared `TileEntitySimpleFluidMachine` capability bridge, particularly `basepower:still`. +- **Intended behaviour:** A Forge fluid capability must use the machine's fluid handler, including its input/output routing and side restrictions. A still accepts crude oil into its input reserve and exposes refined oil as output. +- **Implemented behaviour before repair:** `getCapability` returned the raw output `FluidTank`. This bypassed the still's overridden `fill` method and any overridden handler restrictions. +- **Runtime confirmation:** The new finite-material progression test collected a real crude-oil bucket and transferred its 1,000 mB through the native capability. The saved still held `Tank:{FluidName:"crude_oil",Amount:1000}` while `InputTank` remained empty; its coal was untouched and no distillation occurred. The full restart preserved this wrong routing rather than repairing it. +- **Focused controls:** Three of four initial capability tests failed: overridden input routing, side/fluid restrictions, and input capacity/properties. The output-only drain control already passed. +- **Repair:** Delegate the capability through Forge's `FluidHandlerWrapper(this, facing)`. No recipe, processing ratio, registry identity or NBT key changes. +- **Regression:** All four focused tests pass. The packaged starter plant now turns exactly 1,000 mB crude into 500 mB refined oil and five plastic ingots, with real fuel and hydroelectric generation. The rebuilt Power jar also passes all 188 operating cases and 188 cold-state comparisons. See [recipe progression checks](recipe-progression-checks.md) for the wider matrix and its limits. +- **Source:** `src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java`, method `getCapability`; `StillTileEntity.fill` and `getTankInfo` define the required routing. +- **Versions to check:** Maintained 1.10.2 confirmed and repaired locally. Other Minecraft lines and the original release's capability behaviour have not been requalified by this repair. + ## Reviewed differences not presently classified as bugs | Observation | Disposition | diff --git a/docs/1.10/recipe-progression-checks.md b/docs/1.10/recipe-progression-checks.md new file mode 100644 index 0000000..56378e1 --- /dev/null +++ b/docs/1.10/recipe-progression-checks.md @@ -0,0 +1,70 @@ +# Recipe Progression Checks + +The individual-recipe audit and the survival-progression test answer different questions. A recipe can match perfectly while requiring a component that a player cannot obtain. Neither test substitutes for the operating-machine suite or manual gameplay checks. + +## What The New Test Does + +The runner starts with a finite account of harvested resources: wood, crops, vanilla minerals and the registered copper, tin, zinc, lead, nickel, silver, lithium and sulfur ores. It does not start with ingots, tools, batteries, machine parts or stored energy. Resource gathering and mining time are outside this test. + +It plans a route through the registered recipes, then replays the chosen route inside a packaged Forge 1.10.2 server: + +- Crafting uses the native recipe manager and `SlotCrafting`. The selected ingredient alternatives must really match; a missing ingredient and a bedrock substitute must fail. +- Every craft debits its ingredients. Returned buckets are checked against a separate, explicit rule: the lead-acid and nickel-hydride recipes must each return one empty bucket. +- Vanilla smelting uses a previously crafted furnace and real coal. Bounded native furnace updates accelerate preparation; these are not wall-clock or natural-tick timing tests. Unused heat is discarded rather than credited as free energy. +- Crushing uses a crafted hammer on a real dropped item, collects its real products, and retains tool damage. A crusher-registry lookup alone cannot satisfy this step. +- Ore Dictionary alternatives are selected from obtainable materials, not simply the first registered entry. A proposed alternative is credited only after native replay succeeds. +- Apocalyptic routes may buy parts from the registered villager offers. Native merchant transactions debit currency and advance the offer's use count. No free restocking is assumed. Encountering villagers and levelling their careers are not simulated. +- Actual chest inventories are sampled in Apocalyptic mode, with nonempty vanilla chests as the positive control. Generated Additional Loot Tables configuration is not treated as proof of loot integration. + +The runner stops the server after half the crafting steps. On the next process it restores the saved stock, including tool state and merchant offer uses, and finishes preparation without reseeding resources. + +## The Starter Plant + +The plant is assembled from the items made by that progression. Its terrain and bounded natural fluid sources are declared fixtures, not crafted machine components. + +```text +1,000 mB crude oil -> coal-fired still -> 500 mB refined oil + | +water stream -> hydroelectric generator -> plastic refinery -> 5 plastic ingots + +water bucket + coal -> steam boiler -> steam pipe -> steam furnace + coal -> 1 iron ingot +``` + +Buckets collect actual source blocks. Container and machine fluid handlers transfer the resulting packets. The still consumes coal; the refinery receives only naturally generated hydroelectric power. No creative source, stored-energy injection, progress seeding or direct machine-update call is used in this plant. + +The steam furnace also consumes its own coal. Merely finishing a coal-fired smelt would not prove that the steam connection worked: the test additionally requires received steam and a temperature above 800, beyond this furnace's coal-only heating limit. + +After 120 natural ticks, the server saves and shuts down completely. Before any resumed machine tick, the next process compares exact block states and typed tile NBT with the checkpoint. It then finishes the work, checking fluid and product quantities. A final process restart checks the completed plant and retained products again. + +Typed item NBT is checked as well as item counts. Resetting hammer damage, losing a container tag or reseeding a merchant offer is not an acceptable restart result. + +## Matrix And Evidence + +Run Normal, Tech Progression and Apocalyptic with `plastic_equals_rubber` both enabled and disabled. Each combination has four independent server processes: initial preparation, continued preparation/plant start, mid-cycle restart, and final cold inspection. + +From `test-rig/migration`, using an exact pinned manifest and a new output directory: + +```powershell +& native110_survival_progression.py ` + --target-manifest ` + --java8 ` + --output +``` + +The manifest pins the server and every jar by SHA-256. The runner archives its protocol sources, records every stock debit and credit, checks them independently, and refuses to reuse an output directory. Do not replace a failed receipt with a later passing run. + +The coverage ledger includes every registered item, including block items. Creative sources, raw world fluids and hidden helper blocks have explicit exclusions. An unproven item remains visible as a gap; it is not silently removed to make the result green. + +## Known Limits + +The candidate's qualification results are recorded in [Current Candidate Checks](base-qualification.md). + +The final matrix passed all six configurations and the independent stock/tool/trading audit. The overall progression ledger deliberately retains a `PARTIAL` completeness label because the unused lithium nugget below has no demonstrated producer. + +The lithium nugget is registered in the original Electric Advantage release as well as this candidate, but the tested pack has no producer or recipe consumer for it. Examination of the original `2.2.0` jar finds its three lithium-nugget identifiers only in the item-registration class. That supports treating it as an unused legacy item, not a missing prerequisite for lithium batteries. It remains a reported progression gap; this test does not add a recipe or remove its identity. + +Additional Loot Tables is not installed in the pinned pack. The test can demonstrate the trading route without it, but cannot claim that optional loot integration works when absent. No conclusion about loot rarity follows from sampling a bounded set of chest seeds. + +Offers with missing currency or non-positive prices are listed as uncredited rather than used as free prerequisites. This is not a repair or qualification of third-party villager-trade balance. Optional RF/Reborn converter progression is outside this pack's recipe matrix. + +Minecraft 1.10.2 has neither the later recipe book nor ingredient-triggered recipe advancements. Those require separate tests in later ports. This test also does not cover player-facing crafting interaction, shift-crafting, villager availability, mining balance or every third-party ingredient provider. diff --git a/docs/branding/README.md b/docs/branding/README.md new file mode 100644 index 0000000..31b9390 --- /dev/null +++ b/docs/branding/README.md @@ -0,0 +1,21 @@ +# basePower Artwork + +![basePower logo](basepower-logo.png) + +`basepower-logo.png` is the square project logo for the basePower CurseForge listing. It is a 1,254 by 1,254 pixel PNG, meeting [CurseForge's current minimum](https://support.curseforge.com/support/solutions/articles/9000199552) of 400 by 400 pixels. Keep the square composition and its margins when exporting smaller copies. + +The copper and white pixel lettering, dark metal background and copper fasteners follow the [Base Metals project logo](https://www.curseforge.com/minecraft/mc-mods/base-metals). The new sprocket, pipework and BASE POWER wordmark distinguish the expansion from its parent. The reference artwork is [Base Metals' project avatar](https://media.forgecdn.net/avatars/thumbnails/49/301/256/256/636076086007754248.png); it is not the upload file. + +This artwork is outside the mod's resources. Adding it does not change the qualified jars or their checksums. Uploading the project logo and publishing a mod release are separate steps. + +## Creation + +Created on 2 November 2026 with the built-in image-generation tool, using the Base Metals avatar as a visual reference. No generated-image edits or resampling were applied to the saved file. + +Generation prompt: + +```text +Use case: logo-brand. Create ONE finished square 1024x1024 raster logo for the Minecraft mod basePower, marketed as a Base Metals expansion. Input image 1 is the actual Base Metals CurseForge logo: use it as the visual family reference, not as text to retain. Match its deliberately simple, low-resolution Minecraft-era pixel-art branding: charcoal pixel-metal background, gray steel plates, restrained warm copper rivets, blocky copper upper word and off-white lower word, dark pixel drop shadows. Exact text: two centered stacked lines, "BASE" on the first line and "POWER" on the second line. POWER must be large, highly readable and spelled correctly. Use crisp squared bitmap lettering with generous separation between letters; not smooth modern vector lettering. Replace the reference's generic ingot shapes with a compact, clearly recognizable steel sprocket and short squared industrial pipe/coupling shapes above and below the wordmark. Keep mechanical details secondary to the lettering and leave a clear quiet dark area behind both words. This is shared industrial infrastructure, not the Steam or Electric expansion: no lightning bolt, no flames, no steam clouds. Composition: full-bleed square dark gray backdrop, logo centered, generous safe margin of at least 8 percent on all sides, no clipping; recognizable and readable as a 64px project icon. Keep the whole drawing coherent on a chunky pixel grid with hard pixel edges and a small gray/copper/white palette. No photographic material, no gradients, no smooth 3D bevels, no tiny captions, no additional words, no watermark, no mockup or surrounding UI. An original sibling logo visibly related to the supplied Base Metals mark. +``` + +The generator returned the saved 1,254-pixel square rather than the requested 1,024-pixel square. The delivered file is retained unchanged. diff --git a/docs/branding/basepower-logo.png b/docs/branding/basepower-logo.png new file mode 100644 index 0000000..e3f66fc Binary files /dev/null and b/docs/branding/basepower-logo.png differ diff --git a/docs/curseforge-description.md b/docs/curseforge-description.md new file mode 100644 index 0000000..1ec7e1e --- /dev/null +++ b/docs/curseforge-description.md @@ -0,0 +1,55 @@ +# basePower + +**A Base Metals expansion continuing DrCyano's Power Advantage, with backwards-compatible upgrades for existing Minecraft 1.10.2 worlds.** + +basePower brings item transport, fluid handling and the shared foundation for steam and electrical machinery to your workshop. It continues [DrCyano's original Power Advantage](https://www.curseforge.com/minecraft/mc-mods/power-advantage), keeping its familiar machines and approach to automation while fixing bugs and maintaining compatibility with existing saves. + +This is the continuation under a new name, not an extra mod to install alongside Power Advantage. + +## What Does It Add? + +- **Conveyors:** Move items between inventories, collect dropped items and carry them upwards. No power supply needed. +- **Sorting and filters:** Separate items into different storage routes, filter by category or selected items, and handle overflow. +- **Fluid transport:** Collect water, lava and other fluids with drains, move them through pipes, and return them to the world with discharges. +- **Storage and control:** Store fluids in portable or metal tanks, select accepted fluids and control pipe connections with redstone switches. +- **Workshop materials:** Make sprockets, steel frames and bioplastic for your machinery. +- **Oil processing:** Collect crude oil and distil it into refined oil. OreSpawn handles underground desert deposits, and Mineralogy's crude oil is accepted by the appropriate processing machinery too. + +basePower is useful by itself. Its companion mods add the steam and electrical equipment; installing basePower alone does not add their generators, drills or processing machines. + +## Expand Your Workshop + +- **[baseSteam](https://github.com/MinecraftModDevelopmentMods/baseSteam):** The continuation of Steam Advantage, adding boilers, steam pipes, tanks and steam-powered machinery. +- **[baseElectric](https://github.com/MinecraftModDevelopmentMods/baseElectric):** The continuation of Electric Advantage, adding generators, batteries, wiring and electrically powered machinery. + +Both use basePower as their shared foundation. Install matching versions for your Minecraft release. + +## Requirements + +- **Minecraft 1.10.2 with Forge 12.18.3.2511 or a compatible later 1.10.2 Forge build.** +- **Java 8.** +- **[Base Metals](https://www.curseforge.com/minecraft/mc-mods/base-metals).** +- **[MMD OreSpawn](https://www.curseforge.com/minecraft/mc-mods/mmd-orespawn).** + +The current 1.10.2 build has been tested with Base Metals `2.5.1.110021` and OreSpawn `4.1.2.110021`, including existing-world upgrades and full restarts. Steam and Electric are optional companions, not requirements for basePower's conveyors and fluid equipment. + +## Moving An Existing Power Advantage World + +basePower supports upgrading worlds made with the original released Cyano Minecraft 1.10.2 Power Advantage. Existing blocks, items, inventories, stored fluids and machine state are migrated to the new identities without needing to rebuild your installations. + +1. Back up the complete world and its configuration before changing any mods. +2. Remove Power Advantage and install basePower. Do not keep both jars installed. +3. If the world also uses Steam Advantage or Electric Advantage, replace them with matching baseSteam and baseElectric versions at the same time. Do not mix the old and new families. +4. Open a copy first, check your machines and contents, then close Minecraft completely and reopen it to check the saved result. + +Existing configuration is carried forward when no new base configuration exists, and saved OreSpawn settings remain authoritative. Keep your original backup: rolling back means restoring the complete backup, not putting old jars back into an already converted world. + +This compatibility applies to the released 1.10.2 worlds. It is not a promise that every old third-party add-on works unchanged; integrations which look for the old mod IDs may need an update. + +## Credits, Modpacks And Development + +Power Advantage was created by **DrCyano (Cyanobacterium)**. basePower continues that work as part of **Minecraft Mod Development**, alongside Base Metals, baseSteam and baseElectric. + +Modpack inclusion is welcome. The project remains open source under **LGPL-3.0**. Its developer API includes the preserved `cyano.poweradvantage.api` package for the 1.10.2 line. + +[Source code](https://github.com/MinecraftModDevelopmentMods/basePower) | [Original Power Advantage](https://www.curseforge.com/minecraft/mc-mods/power-advantage) diff --git a/gradle.properties b/gradle.properties index 83a1b2e..334e3b4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,13 +19,13 @@ java_version=8 java_toolchain_version=8.0.502+7 java_setup_version=8.0.502+7 gradle_java_version=17 -curseforge_project_id=240982 +curseforge_project_id=0 -mod_id=poweradvantage -mod_name=Power Advantage +mod_id=basepower +mod_name=basePower mod_license=LGPL-3.0-only -mod_version=2.4.3.110021 -mod_group=zone.moddev.mc.poweradvantage +mod_version=2.4.4.110021 +mod_group=zone.moddev.mc.basepower mod_authors=DrCyano (aka Cyanobacterium) mod_description=API and shared machines for pressure, electricity, quantum power, fluids, and item transport. diff --git a/make-it.PS1 b/make-it.PS1 index b4573ec..f45efc8 100644 --- a/make-it.PS1 +++ b/make-it.PS1 @@ -1,49 +1,10 @@ -# Windows Power-Shell Build Script -$PROJECT_FOLDER="$PSScriptRoot" -$NAME="PowerAdvantage" -Set-Location "$PROJECT_FOLDER" -Add-Type -A System.IO.Compression.FileSystem -# make dev folders -mkdir -p "$PROJECT_FOLDER/build/dev" -mkdir -p "$PROJECT_FOLDER/build/dist" - -# remove stale files and build API jar -rm -v -Recurse build/libs/*.jar -rm -v -Recurse build/dev/* -rm -v -Recurse build/dist/* -echo "Compiling API" -Start-Process -wait gradlew.bat jar -# remove stale files and build mod jar and javadoc -cp -v build/libs/*.jar build/dev/ -echo "Compiling Mod" -Start-Process -wait gradlew.bat build -rm -v build/libs/*-sources.jar -echo "Compiling JavaDocs" -Start-Process -wait gradlew.bat javadoc - -# zip the sourcecode and javadoc -[IO.Compression.ZipFile]::CreateFromDirectory("$PROJECT_FOLDER/build/docs/javadoc", "$PROJECT_FOLDER/build/dev/$NAME-javadoc.zip") -[IO.Compression.ZipFile]::CreateFromDirectory("$PROJECT_FOLDER/src/main/java", "$PROJECT_FOLDER/build/dev/$NAME-src.zip") - -# remove assets from API jar -$array=Get-ChildItem "$PROJECT_FOLDER/build/dev" -Filter "$NAME*.jar" -$myFile=$array[0] -echo "Removing assets from $myFile" -mkdir -p "$PROJECT_FOLDER/build/dev/extract" -[IO.Compression.ZipFile]::ExtractToDirectory("$PROJECT_FOLDER/build/dev/$myfile","$PROJECT_FOLDER/build/dev/extract") -rm -Recurse $PROJECT_FOLDER/build/dev/extract/assets/* -rmdir "$PROJECT_FOLDER/build/dev/extract/assets" -rm "$PROJECT_FOLDER/build/dev/$myfile" -$myAPIfile=$myFile -replace "-","-API-" -& $env:JAVA_HOME\bin\jar.exe c0f "$PROJECT_FOLDER/build/dev/$myAPIfile" -C "$PROJECT_FOLDER/build/dev/extract" . -rm -Recurse $PROJECT_FOLDER/build/dev/extract - -# copy final files to dist folder -cp -v build/libs/*.jar build/dist -cp -v build/dev/*.jar build/dist -cp -v build/dev/*.zip build/dist - - -#done -$time=date -echo "Build script competed on $time" \ No newline at end of file +param([string[]] $GradleArguments = @()) +$ErrorActionPreference = 'Stop' + +# Use the same audited tasks as CI; never strip or repack a published jar here. +Push-Location $PSScriptRoot +try { + & ./gradlew.bat clean check build javadoc verifyReleaseDependencies verifyReleaseArtifacts ` + writeReleaseChecksums verifyEclipseProductionClasspath @GradleArguments + exit $LASTEXITCODE +} finally { Pop-Location } diff --git a/settings.gradle b/settings.gradle index 49735d0..4c5f6e5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,4 +2,4 @@ plugins { id('org.gradle.toolchains.foojay-resolver-convention') version '1.0.0' } -rootProject.name = 'PowerAdvantage' +rootProject.name = 'basePower' diff --git a/src/main/java/com/mcmoddev/poweradvantage/conduitnetwork/ConduitRegistry.java b/src/main/java/com/mcmoddev/poweradvantage/conduitnetwork/ConduitRegistry.java index e3089dd..0f070dd 100644 --- a/src/main/java/com/mcmoddev/poweradvantage/conduitnetwork/ConduitRegistry.java +++ b/src/main/java/com/mcmoddev/poweradvantage/conduitnetwork/ConduitRegistry.java @@ -35,14 +35,14 @@ public List getRequestsForPower(World world, BlockPos position, Co public static float transmitPowerToConsumers(float availableEnergy, ConduitType powerType, byte minimumPriority, TileEntity provider) { - return zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry.transmitPowerToConsumers( + return zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry.transmitPowerToConsumers( availableEnergy, powerType, minimumPriority, provider); } public static float transmitPowerToConsumers(float availableEnergy, ConduitType networkType, ConduitType powerType, byte minimumPriority, World world, BlockPos sourcePosition, Object provider) { - return zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry.transmitPowerToConsumers( + return zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry.transmitPowerToConsumers( availableEnergy, networkType, powerType, minimumPriority, world, sourcePosition, provider); } @@ -66,7 +66,7 @@ public void conduitBlockRemovedEvent(World world, int dimension, BlockPos positi delegate().conduitBlockRemovedEvent(world, dimension, position, types); } - private zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry delegate() { - return zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry.getInstance(); + private zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry delegate() { + return zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry.getInstance(); } } diff --git a/src/main/java/com/mcmoddev/poweradvantage/init/Fluids.java b/src/main/java/com/mcmoddev/poweradvantage/init/Fluids.java index 1d287c0..86c4d69 100644 --- a/src/main/java/com/mcmoddev/poweradvantage/init/Fluids.java +++ b/src/main/java/com/mcmoddev/poweradvantage/init/Fluids.java @@ -8,5 +8,5 @@ * {@code cyano.poweradvantage.api.fluid}. */ @Deprecated -public abstract class Fluids extends zone.moddev.mc.poweradvantage.init.Fluids { +public abstract class Fluids extends zone.moddev.mc.basepower.init.Fluids { } diff --git a/src/main/java/com/mcmoddev/poweradvantage/math/Integer2D.java b/src/main/java/com/mcmoddev/poweradvantage/math/Integer2D.java index d612bdb..4d76079 100644 --- a/src/main/java/com/mcmoddev/poweradvantage/math/Integer2D.java +++ b/src/main/java/com/mcmoddev/poweradvantage/math/Integer2D.java @@ -5,7 +5,7 @@ * {@code cyano.poweradvantage.api.simple.SimpleMachineGUI} constructor. * * @deprecated New code should use - * {@link zone.moddev.mc.poweradvantage.math.Integer2D}. + * {@link zone.moddev.mc.basepower.math.Integer2D}. */ @Deprecated public class Integer2D { diff --git a/src/main/java/cyano/poweradvantage/api/ConduitBlock.java b/src/main/java/cyano/poweradvantage/api/ConduitBlock.java index 2c92a40..e606221 100644 --- a/src/main/java/cyano/poweradvantage/api/ConduitBlock.java +++ b/src/main/java/cyano/poweradvantage/api/ConduitBlock.java @@ -1,6 +1,6 @@ package cyano.poweradvantage.api; -import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry; +import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/cyano/poweradvantage/api/ConduitType.java b/src/main/java/cyano/poweradvantage/api/ConduitType.java index f782afc..8ed905a 100644 --- a/src/main/java/cyano/poweradvantage/api/ConduitType.java +++ b/src/main/java/cyano/poweradvantage/api/ConduitType.java @@ -1,6 +1,6 @@ package cyano.poweradvantage.api; -import zone.moddev.mc.poweradvantage.util.HashCodeHelper; +import zone.moddev.mc.basepower.util.HashCodeHelper; import java.util.Locale; diff --git a/src/main/java/cyano/poweradvantage/api/PoweredEntity.java b/src/main/java/cyano/poweradvantage/api/PoweredEntity.java index c85875f..b715faf 100644 --- a/src/main/java/cyano/poweradvantage/api/PoweredEntity.java +++ b/src/main/java/cyano/poweradvantage/api/PoweredEntity.java @@ -1,6 +1,6 @@ package cyano.poweradvantage.api; -import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry; +import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/cyano/poweradvantage/api/fluid/FluidConduitBlock.java b/src/main/java/cyano/poweradvantage/api/fluid/FluidConduitBlock.java index 4159652..77e331b 100644 --- a/src/main/java/cyano/poweradvantage/api/fluid/FluidConduitBlock.java +++ b/src/main/java/cyano/poweradvantage/api/fluid/FluidConduitBlock.java @@ -3,7 +3,7 @@ import cyano.poweradvantage.api.ConduitBlock; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PowerConnectorContext; -import zone.moddev.mc.poweradvantage.init.Fluids; +import zone.moddev.mc.basepower.init.Fluids; import net.minecraft.block.material.Material; /** diff --git a/src/main/java/cyano/poweradvantage/api/fluid/FluidNetworkApi.java b/src/main/java/cyano/poweradvantage/api/fluid/FluidNetworkApi.java index b6d809c..f8ca76e 100644 --- a/src/main/java/cyano/poweradvantage/api/fluid/FluidNetworkApi.java +++ b/src/main/java/cyano/poweradvantage/api/fluid/FluidNetworkApi.java @@ -10,8 +10,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; -import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry; -import zone.moddev.mc.poweradvantage.init.Fluids; +import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry; +import zone.moddev.mc.basepower.init.Fluids; /** * Stable entry point for offering fluid from another mod to a PowerAdvantage diff --git a/src/main/java/cyano/poweradvantage/api/fluid/FluidPoweredEntity.java b/src/main/java/cyano/poweradvantage/api/fluid/FluidPoweredEntity.java index fcdd47b..f6fc167 100644 --- a/src/main/java/cyano/poweradvantage/api/fluid/FluidPoweredEntity.java +++ b/src/main/java/cyano/poweradvantage/api/fluid/FluidPoweredEntity.java @@ -3,8 +3,8 @@ import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PowerRequest; import cyano.poweradvantage.api.PoweredEntity; -import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry; -import zone.moddev.mc.poweradvantage.init.Fluids; +import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry; +import zone.moddev.mc.basepower.init.Fluids; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.fluids.*; diff --git a/src/main/java/cyano/poweradvantage/api/modsupport/LightWeightPowerRegistry.java b/src/main/java/cyano/poweradvantage/api/modsupport/LightWeightPowerRegistry.java index 2415254..fee9def 100644 --- a/src/main/java/cyano/poweradvantage/api/modsupport/LightWeightPowerRegistry.java +++ b/src/main/java/cyano/poweradvantage/api/modsupport/LightWeightPowerRegistry.java @@ -18,7 +18,7 @@ * considered "external" power systems because their power implementation is not controlled by Power * Advantage.

*

For example, you can add Power Advantage compatibility to an existing mod like this:

-	if(Loader.isModLoaded("poweradvantage")){
+	if(Loader.isModLoaded("basepower")){
 		LightWeightPowerRegistry.registerLightWeightPowerAcceptor(Blocks.myMachine, 
 				new ILightWeightPowerAcceptor(){
 
diff --git a/src/main/java/cyano/poweradvantage/api/modsupport/package-info.java b/src/main/java/cyano/poweradvantage/api/modsupport/package-info.java
index b86dd02..16d362d 100644
--- a/src/main/java/cyano/poweradvantage/api/modsupport/package-info.java
+++ b/src/main/java/cyano/poweradvantage/api/modsupport/package-info.java
@@ -1,7 +1,7 @@
 /**
 This package contains the light-weight API for people interested in adding Power Advantage support 
 to existing mods (instead of making a Power Advantage add-on mod). Typically, you achieve this be 
-first checking whether Power Advantage exists with if(Loader.isModLoaded("poweradvantage")){ ... }. 
+first checking whether basePower exists with if(Loader.isModLoaded("basepower")){ ... }.
 Then if you detect that Power Advantage is installed, you can add an ad-hoc power handler for each 
 of your machines like this:
 LightWeightPowerRegistry.registerLightWeightPowerAcceptor(Blocks.myMachine, 
@@ -28,4 +28,4 @@ public float addEnergy(TileEntity yourMachine,
 The above example is for registerring a machine that should accept steam and electricity power from 
 Power Advantage add-on mods.
 */
-package cyano.poweradvantage.api.modsupport;
\ No newline at end of file
+package cyano.poweradvantage.api.modsupport;
diff --git a/src/main/java/cyano/poweradvantage/api/modsupport/rf/TileEntityRFConverter.java b/src/main/java/cyano/poweradvantage/api/modsupport/rf/TileEntityRFConverter.java
index 9cd3980..a7a62c2 100644
--- a/src/main/java/cyano/poweradvantage/api/modsupport/rf/TileEntityRFConverter.java
+++ b/src/main/java/cyano/poweradvantage/api/modsupport/rf/TileEntityRFConverter.java
@@ -1,6 +1,6 @@
 package cyano.poweradvantage.api.modsupport.rf;
 
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
 import cyano.poweradvantage.api.ConduitType;
 import cyano.poweradvantage.api.modsupport.TileEntityConverter;
 import net.minecraft.entity.player.EntityPlayer;
diff --git a/src/main/java/cyano/poweradvantage/api/modsupport/techreborn/TileEntityTRConverter.java b/src/main/java/cyano/poweradvantage/api/modsupport/techreborn/TileEntityTRConverter.java
index de840dd..a9c55b8 100644
--- a/src/main/java/cyano/poweradvantage/api/modsupport/techreborn/TileEntityTRConverter.java
+++ b/src/main/java/cyano/poweradvantage/api/modsupport/techreborn/TileEntityTRConverter.java
@@ -1,6 +1,6 @@
 package cyano.poweradvantage.api.modsupport.techreborn;
 
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
 import cyano.poweradvantage.api.ConduitType;
 import cyano.poweradvantage.api.modsupport.TileEntityConverter;
 import net.minecraft.tileentity.TileEntity;
diff --git a/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidConduit.java b/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidConduit.java
index 73034fa..d169c22 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidConduit.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidConduit.java
@@ -3,7 +3,7 @@
 import cyano.poweradvantage.api.ConduitType;
 import cyano.poweradvantage.api.PowerConnectorContext;
 import cyano.poweradvantage.api.fluid.FluidConduitBlock;
-import zone.moddev.mc.poweradvantage.util.PowerHelper;
+import zone.moddev.mc.basepower.util.PowerHelper;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.properties.IProperty;
 import net.minecraft.block.properties.PropertyBool;
diff --git a/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidMachine.java b/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidMachine.java
index 0e376c8..3fdbc7a 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidMachine.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/BlockSimpleFluidMachine.java
@@ -1,6 +1,6 @@
 package cyano.poweradvantage.api.simple;
 
-import zone.moddev.mc.poweradvantage.init.Fluids;
+import zone.moddev.mc.basepower.init.Fluids;
 import net.minecraft.block.material.Material;
 
 /**
@@ -8,7 +8,7 @@
  * block with an inventory and user interface that gives fluids to connected 
  * fluid consumers.
* Example usage:
-int guiID = zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry.addGUI(new MySimpleMachineGUI());
+int guiID = zone.moddev.mc.basepower.registry.MachineGUIRegistry.addGUI(new MySimpleMachineGUI());
 Block myMachineBlock = new MyBlockSimpleFluidSource(guiID,PowerAdvantage.getInstance());
 myMachineBlock.setUnlocalizedName(MODID+"."+"my_machine");
 GameRegistry.registerBlock(myMachineBlock,"my_machine");
diff --git a/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerConduit.java b/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerConduit.java
index ddd7780..17f18bb 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerConduit.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerConduit.java
@@ -3,7 +3,7 @@
 import cyano.poweradvantage.api.ConduitBlock;
 import cyano.poweradvantage.api.ConduitType;
 import cyano.poweradvantage.api.PowerConnectorContext;
-import zone.moddev.mc.poweradvantage.util.PowerHelper;
+import zone.moddev.mc.basepower.util.PowerHelper;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.properties.IProperty;
 import net.minecraft.block.properties.PropertyBool;
diff --git a/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerMachine.java b/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerMachine.java
index 2d90210..65fc812 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerMachine.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/BlockSimplePowerMachine.java
@@ -1,7 +1,7 @@
 package cyano.poweradvantage.api.simple;
 
 import cyano.poweradvantage.api.*;
-import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry;
+import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry;
 import net.minecraft.block.BlockHorizontal;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.properties.IProperty;
@@ -28,7 +28,7 @@
  * block with an inventory and user interface that gives power to connected 
  * machines.
* Example usage:
-int guiID = zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry.addGUI(new MySimpleMachineGUI());
+int guiID = zone.moddev.mc.basepower.registry.MachineGUIRegistry.addGUI(new MySimpleMachineGUI());
 Block myMachineBlock = new MyBlockSimplePowerSource(guiID,PowerAdvantage.getInstance());
 myMachineBlock.setUnlocalizedName(MODID+"."+"my_machine");
 GameRegistry.registerBlock(myMachineBlock,"my_machine");
diff --git a/src/main/java/cyano/poweradvantage/api/simple/SimpleMachineGUI.java b/src/main/java/cyano/poweradvantage/api/simple/SimpleMachineGUI.java
index 1540445..2c4d62c 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/SimpleMachineGUI.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/SimpleMachineGUI.java
@@ -1,10 +1,10 @@
 package cyano.poweradvantage.api.simple;
 
 
-import zone.moddev.mc.poweradvantage.PowerAdvantage;
+import zone.moddev.mc.basepower.PowerAdvantage;
 import com.mcmoddev.poweradvantage.math.Integer2D;
 import com.mcmoddev.poweradvantage.registry.ITileEntityGUI;
-import zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry;
+import zone.moddev.mc.basepower.registry.MachineGUIRegistry;
 import net.minecraft.client.gui.inventory.GuiContainer;
 import net.minecraft.client.renderer.GlStateManager;
 import net.minecraft.entity.player.EntityPlayer;
diff --git a/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java b/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java
index 7aee735..375ba76 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimpleFluidMachine.java
@@ -5,7 +5,7 @@
 import cyano.poweradvantage.api.PowerRequest;
 import cyano.poweradvantage.api.fluid.FluidPoweredEntity;
 import cyano.poweradvantage.api.fluid.FluidRequest;
-import zone.moddev.mc.poweradvantage.init.Fluids;
+import zone.moddev.mc.basepower.init.Fluids;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.inventory.ISidedInventory;
 import net.minecraft.item.ItemStack;
@@ -23,6 +23,7 @@
 import net.minecraftforge.fluids.FluidStack;
 import net.minecraftforge.fluids.FluidTank;
 import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
+import net.minecraftforge.fluids.capability.wrappers.FluidHandlerWrapper;
 
 import java.util.List;
 
@@ -72,7 +73,9 @@ public boolean hasCapability(Capability capability, EnumFacing facing) {
 
 	@Override
 	public  T getCapability(Capability capability, EnumFacing facing) {
-		return (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)? (T)tank : super.getCapability(capability,facing);
+		// Delegate through the machine so overrides retain input/output routing and restrictions.
+		return (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
+				? (T)new FluidHandlerWrapper(this, facing) : super.getCapability(capability,facing);
 	}
 
 	/**
@@ -744,4 +747,4 @@ public FluidTank getTank(){
 		return tank;
 	}
 
-}
\ No newline at end of file
+}
diff --git a/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimplePowerMachine.java b/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimplePowerMachine.java
index e8d9151..5eeeaa4 100644
--- a/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimplePowerMachine.java
+++ b/src/main/java/cyano/poweradvantage/api/simple/TileEntitySimplePowerMachine.java
@@ -4,7 +4,7 @@
 import cyano.poweradvantage.api.PowerConnectorContext;
 import cyano.poweradvantage.api.PowerRequest;
 import cyano.poweradvantage.api.PoweredEntity;
-import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry;
+import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.inventory.ISidedInventory;
 import net.minecraft.item.ItemStack;
diff --git a/src/main/java/zone/moddev/mc/poweradvantage/PowerAdvantage.java b/src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java
similarity index 87%
rename from src/main/java/zone/moddev/mc/poweradvantage/PowerAdvantage.java
rename to src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java
index cfb8e4c..ff0c593 100644
--- a/src/main/java/zone/moddev/mc/poweradvantage/PowerAdvantage.java
+++ b/src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java
@@ -1,10 +1,10 @@
-package zone.moddev.mc.poweradvantage;
+package zone.moddev.mc.basepower;
 
 import cyano.poweradvantage.api.ConduitType;
 import cyano.poweradvantage.api.FluidCategoryRegistry;
-import zone.moddev.mc.poweradvantage.registry.FuelRegistry;
-import zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry;
-import zone.moddev.mc.poweradvantage.registry.still.recipe.DistillationRecipeRegistry;
+import zone.moddev.mc.basepower.registry.FuelRegistry;
+import zone.moddev.mc.basepower.registry.MachineGUIRegistry;
+import zone.moddev.mc.basepower.registry.still.recipe.DistillationRecipeRegistry;
 import net.minecraft.block.Block;
 import net.minecraft.init.Items;
 import net.minecraft.item.Item;
@@ -18,6 +18,12 @@
 import net.minecraftforge.fml.common.event.FMLInitializationEvent;
 import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
 import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
+import net.minecraftforge.fml.common.event.FMLMissingMappingsEvent;
+import net.minecraftforge.fml.common.event.FMLServerAboutToStartEvent;
+import net.minecraftforge.fml.common.Loader;
+import zone.moddev.mc.basepower.compat.LegacyIdentity;
+import zone.moddev.mc.basepower.compat.LegacyLevelData;
+import zone.moddev.mc.basepower.compat.LegacyWorldgenIdentity;
 import net.minecraftforge.fml.common.network.NetworkRegistry;
 import net.minecraftforge.fml.common.registry.GameData;
 import net.minecraftforge.fml.common.registry.GameRegistry;
@@ -33,7 +39,7 @@
 import java.util.*;
 
 // NOTE: other mods dependant on this one need to add the following to their @Mod annotation:
-// dependencies = "required-after:poweradvantage" 
+// dependencies = "required-after:basepower" 
 
 /* IDEA list
  * drain block ✓
@@ -178,7 +184,7 @@
  * compile classpath. Do not embed PowerAdvantage in the dependent mod.
  * 

* Next, you need to specify the dependencies in the @mod annotation. For example:
- * @Mod(modid = MyMod.MODID, version = MyMod.VERSION, name=MyMod.NAME, dependencies = "required-after:poweradvantage") + * @Mod(modid = MyMod.MODID, version = MyMod.VERSION, name=MyMod.NAME, dependencies = "required-after:basepower") *

* Gradle or Eclipse should then derive its compile classpath from that declared dependency. The * Minecraft 1.10.2 build targets Java 8. @@ -186,7 +192,7 @@ * @author DrCyano * */ -@Mod(modid = PowerAdvantage.MODID, version = PowerAdvantage.VERSION, name=PowerAdvantage.NAME, dependencies = "required-after:orespawn@[4.0.6,5.0.0);after:basemetals", +@Mod(modid = PowerAdvantage.MODID, version = PowerAdvantage.VERSION, name=PowerAdvantage.NAME, dependencies = "required-before:orespawn@[4.0.6,5.0.0)", acceptedMinecraftVersions = "[1.10.2,)") public class PowerAdvantage { @@ -196,11 +202,11 @@ public class PowerAdvantage } /** The identifier for this mod */ - public static final String MODID = "poweradvantage"; + public static final String MODID = "basepower"; /** The display name for this mod */ - public static final String NAME = "Power Advantage"; + public static final String NAME = "basePower"; /** The version of this mod, in the format major.minor.patch.target */ - public static final String VERSION = "2.4.3.110021"; + public static final String VERSION = "2.4.4.110021"; @@ -250,9 +256,20 @@ public class PowerAdvantage @EventHandler public void preInit(FMLPreInitializationEvent event) { + LegacyIdentity.requireReplacementsOnly(Loader::isModLoaded); FMLLog.info("%s: loading config file", MODID); instance = this; - Configuration config = new Configuration(event.getSuggestedConfigurationFile()); + try { + java.nio.file.Path directory = event.getSuggestedConfigurationFile().toPath().getParent(); + LegacyWorldgenIdentity.migrateConfig(directory, "poweradvantage", MODID); + if (Loader.isModLoaded("baseelectric")) { + LegacyWorldgenIdentity.migrateConfig(directory, "electricadvantage", "baseelectric"); + } + } catch (java.io.IOException error) { + throw new IllegalStateException("Cannot safely migrate Advantage world-generation configuration", error); + } + Configuration config = new Configuration(LegacyIdentity.migrateConfiguration( + event.getSuggestedConfigurationFile(), "poweradvantage")); config.load(); String[] presets = {"NORMAL", "TECH_PROGRESSION", "APOCALYPTIC"}; String mode = config.getString("recipe_mode", "options", "NORMAL", "NORMAL, APOCALYPTIC, or TECH_PROGRESSION. \n" @@ -361,12 +378,14 @@ public void preInit(FMLPreInitializationEvent event) config.save(); FMLLog.info("%s: initializing fluids, blocks, items, and loot tables", MODID); - zone.moddev.mc.poweradvantage.init.Fluids.init(); - zone.moddev.mc.poweradvantage.init.Blocks.init(); - zone.moddev.mc.poweradvantage.init.Items.init(); - zone.moddev.mc.poweradvantage.init.OreSpawnWorldGen.register( + zone.moddev.mc.basepower.init.Fluids.init(); + zone.moddev.mc.basepower.init.Blocks.init(); + zone.moddev.mc.basepower.init.Items.init(); + zone.moddev.mc.basepower.init.OreSpawnWorldGen.register( event.getSuggestedConfigurationFile().toPath().getParent()); - zone.moddev.mc.poweradvantage.init.TreasureChests.init(event.getSuggestedConfigurationFile().toPath().getParent()); + LegacyIdentity.migrateAdditionalLootTables(event.getSuggestedConfigurationFile().toPath().getParent(), + "poweradvantage", MODID); + zone.moddev.mc.basepower.init.TreasureChests.init(event.getSuggestedConfigurationFile().toPath().getParent()); // keep this next comment, it is useful for finding Vanilla recipes //OreDictionary.initVanillaEntries(); @@ -380,10 +399,35 @@ public void preInit(FMLPreInitializationEvent event) FMLLog.info("%s: preinit complete", MODID); } + @EventHandler + public void missingMappings(FMLMissingMappingsEvent event) { + LegacyIdentity.remapMissingMappings(event, "poweradvantage", MODID); + } + + @EventHandler + public void serverAboutToStart(FMLServerAboutToStartEvent event) { + // Run before OreSpawn's matching callback reads this world's saved profile. + java.nio.file.Path world = event.getServer().getActiveAnvilConverter() + .getSaveLoader(event.getServer().getFolderName(), false).getWorldDirectory().toPath(); + try { + Set replacements = new HashSet<>(); + replacements.add(MODID); + if (Loader.isModLoaded("basesteam")) replacements.add("basesteam"); + if (Loader.isModLoaded("baseelectric")) replacements.add("baseelectric"); + LegacyLevelData.migrateWorld(world, replacements); + LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", MODID); + if (Loader.isModLoaded("baseelectric")) { + LegacyWorldgenIdentity.migrateWorld(world, "electricadvantage", "baseelectric"); + } + } catch (java.io.IOException error) { + throw new IllegalStateException("Cannot safely migrate this world's Advantage generation profile", error); + } + } + @SideOnly(Side.CLIENT) private void clientPreInit(FMLPreInitializationEvent event){ // client-only code - zone.moddev.mc.poweradvantage.init.Blocks.bakeModels(); + zone.moddev.mc.basepower.init.Blocks.bakeModels(); } @SideOnly(Side.SERVER) private void serverPreInit(FMLPreInitializationEvent event){ @@ -401,7 +445,7 @@ public void init(FMLInitializationEvent event) FMLLog.info("%s: starting main inititalization", MODID); // BaseMetals has initialized; fill missing aliases before fuel and child recipe setup. - zone.moddev.mc.poweradvantage.compat.BaseMetalsCompat.registerOreDictionaryFallbacks(); + zone.moddev.mc.basepower.compat.BaseMetalsCompat.registerOreDictionaryFallbacks(); try { FMLLog.info("%s: testing whether we have to support redstone flux", MODID); Class rfClass = Class.forName("cofh.api.energy.IEnergyReceiver", false, getClass().getClassLoader()); @@ -427,16 +471,16 @@ public void init(FMLInitializationEvent event) GameRegistry.registerFuelHandler(FuelRegistry.getInstance()); FMLLog.info("%s: initializing more content", MODID); - zone.moddev.mc.poweradvantage.init.Fuels.init(); - zone.moddev.mc.poweradvantage.init.Entities.init(); - zone.moddev.mc.poweradvantage.init.Recipes.init(); - zone.moddev.mc.poweradvantage.init.Recipes.initDistillationRecipes(distillRecipes); - zone.moddev.mc.poweradvantage.init.Recipes.initCrudeOilAliasDistillationRecipes(); - zone.moddev.mc.poweradvantage.init.Villages.init(); - zone.moddev.mc.poweradvantage.init.GUI.init(); + zone.moddev.mc.basepower.init.Fuels.init(); + zone.moddev.mc.basepower.init.Entities.init(); + zone.moddev.mc.basepower.init.Recipes.init(); + zone.moddev.mc.basepower.init.Recipes.initDistillationRecipes(distillRecipes); + zone.moddev.mc.basepower.init.Recipes.initCrudeOilAliasDistillationRecipes(); + zone.moddev.mc.basepower.init.Villages.init(); + zone.moddev.mc.basepower.init.GUI.init(); FMLLog.info("%s: mod support data registries", MODID); - zone.moddev.mc.poweradvantage.init.ModSupport.init(detectedRF,detectedTechReborn); + zone.moddev.mc.basepower.init.ModSupport.init(detectedRF,detectedTechReborn); if(event.getSide() == Side.CLIENT){ @@ -454,9 +498,9 @@ public void init(FMLInitializationEvent event) private void clientInit(FMLInitializationEvent event){ // client-only code FMLLog.info("%s: initializing renders", MODID); - zone.moddev.mc.poweradvantage.init.Items.registerItemRenders(event); - zone.moddev.mc.poweradvantage.init.Blocks.registerItemRenders(event); - zone.moddev.mc.poweradvantage.init.ModSupport.registerItemRenders(event); + zone.moddev.mc.basepower.init.Items.registerItemRenders(event); + zone.moddev.mc.basepower.init.Blocks.registerItemRenders(event); + zone.moddev.mc.basepower.init.ModSupport.registerItemRenders(event); } @SideOnly(Side.SERVER) private void serverInit(FMLInitializationEvent event){ diff --git a/src/main/java/zone/moddev/mc/poweradvantage/RecipeMode.java b/src/main/java/zone/moddev/mc/basepower/RecipeMode.java similarity index 96% rename from src/main/java/zone/moddev/mc/poweradvantage/RecipeMode.java rename to src/main/java/zone/moddev/mc/basepower/RecipeMode.java index cf753ec..03c5450 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/RecipeMode.java +++ b/src/main/java/zone/moddev/mc/basepower/RecipeMode.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage; +package zone.moddev.mc.basepower; /** * Differnet recipe modes change the difficulty and means by which the players make the core items diff --git a/src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockFrame.java b/src/main/java/zone/moddev/mc/basepower/blocks/BlockFrame.java similarity index 95% rename from src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockFrame.java rename to src/main/java/zone/moddev/mc/basepower/blocks/BlockFrame.java index fccf622..12081e8 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockFrame.java +++ b/src/main/java/zone/moddev/mc/basepower/blocks/BlockFrame.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.blocks; +package zone.moddev.mc.basepower.blocks; import net.minecraft.block.Block; import net.minecraft.block.SoundType; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockPowerSwitch.java b/src/main/java/zone/moddev/mc/basepower/blocks/BlockPowerSwitch.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockPowerSwitch.java rename to src/main/java/zone/moddev/mc/basepower/blocks/BlockPowerSwitch.java index 447430f..17f940f 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/blocks/BlockPowerSwitch.java +++ b/src/main/java/zone/moddev/mc/basepower/blocks/BlockPowerSwitch.java @@ -1,9 +1,9 @@ -package zone.moddev.mc.poweradvantage.blocks; +package zone.moddev.mc.basepower.blocks; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.ITypedConduit; import cyano.poweradvantage.api.PowerConnectorContext; -import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry; +import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry; import net.minecraft.block.Block; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/gui/package-info.java b/src/main/java/zone/moddev/mc/basepower/blocks/package-info.java similarity index 77% rename from src/main/java/zone/moddev/mc/poweradvantage/gui/package-info.java rename to src/main/java/zone/moddev/mc/basepower/blocks/package-info.java index a8bcce1..0b4337c 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/gui/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/blocks/package-info.java @@ -3,10 +3,10 @@ This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API. If you are writing an add-on mod, use the code in this package for reference, but you should not depend on it's implementation details as future updates might change them. For a better way to get -PowerAdvantage content, look in the zone.moddev.mc.poweradvantage.init package. +PowerAdvantage content, look in the zone.moddev.mc.basepower.init package.

Because these classes are not part of the API, they are not well documented. They were only meant for the eyes of the mod author(s).

*/ -package zone.moddev.mc.poweradvantage.gui; \ No newline at end of file +package zone.moddev.mc.basepower.blocks; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/compat/BaseMetalsCompat.java b/src/main/java/zone/moddev/mc/basepower/compat/BaseMetalsCompat.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/compat/BaseMetalsCompat.java rename to src/main/java/zone/moddev/mc/basepower/compat/BaseMetalsCompat.java index 67cee6f..ef6629c 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/compat/BaseMetalsCompat.java +++ b/src/main/java/zone/moddev/mc/basepower/compat/BaseMetalsCompat.java @@ -1,7 +1,7 @@ -package zone.moddev.mc.poweradvantage.compat; +package zone.moddev.mc.basepower.compat; -import zone.moddev.mc.poweradvantage.PowerAdvantage; -import zone.moddev.mc.poweradvantage.registry.FuelRegistry; +import zone.moddev.mc.basepower.PowerAdvantage; +import zone.moddev.mc.basepower.registry.FuelRegistry; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; diff --git a/src/main/java/zone/moddev/mc/basepower/compat/LegacyIdentity.java b/src/main/java/zone/moddev/mc/basepower/compat/LegacyIdentity.java new file mode 100644 index 0000000..c63fa13 --- /dev/null +++ b/src/main/java/zone/moddev/mc/basepower/compat/LegacyIdentity.java @@ -0,0 +1,156 @@ +package zone.moddev.mc.basepower.compat; + +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.JsonPrimitive; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Iterator; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.FMLLog; +import net.minecraftforge.fml.common.event.FMLMissingMappingsEvent; +import net.minecraftforge.fml.common.registry.GameRegistry; + +/** Read compatibility for released Cyano 1.10 worlds; new saves use base identities. */ +public final class LegacyIdentity { + private LegacyIdentity() { } + + public static void requireReplacementsOnly(java.util.function.Predicate loaded) { + for (String old : new String[] { "poweradvantage", "steamadvantage", "electricadvantage" }) { + if (loaded.test(old)) { + throw new IllegalStateException("Remove the old " + old + + " jar before loading basePower, baseSteam and baseElectric. These are replacements, not add-ons."); + } + } + } + + public static void remapMissingMappings(FMLMissingMappingsEvent event, String oldModId, String newModId) { + int count = 0; + for (FMLMissingMappingsEvent.MissingMapping mapping : event.getAll()) { + if (!oldModId.equals(mapping.resourceLocation.getResourceDomain())) continue; + ResourceLocation target = new ResourceLocation(newModId, mapping.resourceLocation.getResourcePath()); + if (mapping.type == GameRegistry.Type.BLOCK && Block.REGISTRY.containsKey(target)) { + mapping.remap(Block.REGISTRY.getObject(target)); + count++; + } else if (mapping.type == GameRegistry.Type.ITEM && Item.REGISTRY.containsKey(target)) { + mapping.remap(Item.REGISTRY.getObject(target)); + count++; + } else { + // Never silently replace an unsupported legacy component with air. + mapping.fail(); + FMLLog.severe("%s: no migration target for %s %s", newModId, mapping.type, mapping.name); + } + } + if (count > 0) FMLLog.info("%s: remapped %d released %s registry entries", newModId, count, oldModId); + } + + public static void registerTileEntity(Class type, String canonical, String... alternatives) { + if (alternatives.length == 0 && canonical.startsWith("basepower.")) { + alternatives = new String[] { "poweradvantage" + canonical.substring("basepower".length()) }; + } + GameRegistry.registerTileEntityWithAlternatives(type, canonical, alternatives); + } + + public static File migrateConfiguration(File newConfig, String oldModId) { + requireModId(oldModId); + Path target = newConfig.toPath().toAbsolutePath().normalize(); + Path legacy = target.resolveSibling(oldModId + ".cfg"); + try { + if (!Files.exists(target) && Files.isRegularFile(legacy)) { + Files.copy(legacy, target); + FMLLog.info("Imported %s as %s; the original configuration is unchanged", legacy, target); + } + return newConfig; + } catch (IOException error) { + throw new IllegalStateException("Cannot preserve legacy configuration " + legacy, error); + } + } + + public static void migrateAdditionalLootTables(Path config, String oldModId, String newModId) { + requireModId(oldModId); + requireModId(newModId); + Path root = config.toAbsolutePath().normalize().resolve("additional-loot-tables"); + Path legacy = root.resolve(oldModId); + Path target = root.resolve(newModId); + if (!Files.isDirectory(legacy)) return; + try (Stream walk = Files.walk(legacy)) { + List sources = walk.filter(Files::isRegularFile) + .filter(path -> path.toString().endsWith(".json")).collect(Collectors.toList()); + for (Path source : sources) { + if (Files.isSymbolicLink(source)) throw new IOException("Refusing linked loot file " + source); + Path destination = target.resolve(legacy.relativize(source)).normalize(); + if (!destination.startsWith(target)) throw new IOException("Loot migration escaped its directory"); + if (!Files.exists(destination)) { + JsonElement document = new JsonParser().parse(new String(Files.readAllBytes(source), StandardCharsets.UTF_8)); + remapJsonValues(document, oldModId, newModId); + Files.createDirectories(destination.getParent()); + Files.write(destination, new GsonBuilder().setPrettyPrinting().create().toJson(document) + .getBytes(StandardCharsets.UTF_8)); + } + // ALT reads every *.json. Preserve old bytes outside that suffix to avoid double loot. + Path backup = source.resolveSibling(source.getFileName() + ".before-" + newModId); + if (Files.exists(backup)) throw new IOException("Existing loot backup requires review: " + backup); + Files.move(source, backup); + } + } catch (IOException | RuntimeException error) { + throw new IllegalStateException("Cannot safely migrate legacy loot tables from " + legacy, error); + } + } + + public static void remapJsonValues(JsonElement value, String oldModId, String newModId) { + if (value.isJsonObject()) { + JsonObject object = value.getAsJsonObject(); + List> entries = new ArrayList<>(object.entrySet()); + for (Map.Entry entry : entries) { + JsonElement child = entry.getValue(); + if (child.isJsonPrimitive() && child.getAsJsonPrimitive().isString()) { + object.add(entry.getKey(), new JsonPrimitive(remapIdentifier(child.getAsString(), oldModId, newModId))); + } else remapJsonValues(child, oldModId, newModId); + } + } else if (value.isJsonArray()) { + JsonArray array = value.getAsJsonArray(); + List children = new ArrayList<>(); + Iterator iterator = array.iterator(); + while (iterator.hasNext()) { + children.add(iterator.next()); + iterator.remove(); + } + for (JsonElement child : children) { + if (child.isJsonPrimitive() && child.getAsJsonPrimitive().isString()) { + array.add(new JsonPrimitive(remapIdentifier(child.getAsString(), oldModId, newModId))); + } else { + remapJsonValues(child, oldModId, newModId); + array.add(child); + } + } + } + } + + public static String remapIdentifier(String value, String oldModId, String newModId) { + if ("steamadvantage".equals(oldModId) + && java.util.Arrays.asList("steamadvantage:rapid_reload", "steamadvantage:powderless", + "steamadvantage:high_explosive", "steamadvantage:recoil").contains(value)) { + // Forge 1.10 has no enchantment missing-mapping event; those saved keys remain stable. + return value; + } + return value.startsWith(oldModId + ":") ? newModId + value.substring(oldModId.length()) : value; + } + + private static void requireModId(String id) { + if (!id.matches("[a-z][a-z0-9_]*")) throw new IllegalArgumentException("Invalid migration namespace: " + id); + } +} diff --git a/src/main/java/zone/moddev/mc/basepower/compat/LegacyLevelData.java b/src/main/java/zone/moddev/mc/basepower/compat/LegacyLevelData.java new file mode 100644 index 0000000..82bffcc --- /dev/null +++ b/src/main/java/zone/moddev/mc/basepower/compat/LegacyLevelData.java @@ -0,0 +1,120 @@ +package zone.moddev.mc.basepower.compat; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import net.minecraftforge.fml.common.FMLLog; + +/** Converts only Forge's saved oil owners, before Forge reads the world header. */ +public final class LegacyLevelData { + private LegacyLevelData() { } + + public static boolean remapFluidDefaults(NBTTagCompound root) { + if (!root.hasKey("Forge", 10)) return false; + NBTTagCompound forge = root.getCompoundTag("Forge"); + if (!forge.hasKey("DefaultFluidList", 9)) return false; + NBTTagList original = forge.getTagList("DefaultFluidList", 8); + NBTTagList replacement = new NBTTagList(); + boolean changed = false; + for (int index = 0; index < original.tagCount(); index++) { + String before = original.getStringTagAt(index); + String after = before; + if ("poweradvantage:crude_oil".equals(before)) after = "basepower:crude_oil"; + if ("poweradvantage:refined_oil".equals(before)) after = "basepower:refined_oil"; + replacement.appendTag(new NBTTagString(after)); + changed |= !before.equals(after); + } + if (changed) forge.setTag("DefaultFluidList", replacement); + return changed; + } + + public static void migrateWorld(Path worldRoot) throws IOException { + migrateWorld(worldRoot, new HashSet<>(Arrays.asList("basepower", "basesteam", "baseelectric"))); + } + + public static boolean remapModList(NBTTagCompound root, Set loadedReplacements) { + if (!root.hasKey("FML", 10)) return false; + NBTTagList mods = root.getCompoundTag("FML").getTagList("ModList", 10); + Set present = new HashSet<>(); + for (int index = 0; index < mods.tagCount(); index++) present.add(mods.getCompoundTagAt(index).getString("ModId")); + String[][] pairs = { { "poweradvantage", "basepower" }, { "steamadvantage", "basesteam" }, + { "electricadvantage", "baseelectric" } }; + for (String[] pair : pairs) { + if (loadedReplacements.contains(pair[1]) && present.contains(pair[0]) && present.contains(pair[1])) { + throw new IllegalStateException("World header contains both " + pair[0] + " and " + pair[1]); + } + } + boolean changed = false; + for (int index = 0; index < mods.tagCount(); index++) { + NBTTagCompound mod = mods.getCompoundTagAt(index); + for (String[] pair : pairs) { + if (loadedReplacements.contains(pair[1]) && pair[0].equals(mod.getString("ModId"))) { + mod.setString("ModId", pair[1]); + changed = true; + } + } + } + return changed; + } + + public static void migrateWorld(Path worldRoot, Set loadedReplacements) throws IOException { + Path root = worldRoot.toAbsolutePath().normalize(); + for (String name : new String[] { "level.dat", "level.dat_old" }) { + Path file = root.resolve(name); + if (!Files.exists(file, LinkOption.NOFOLLOW_LINKS)) continue; + if (!Files.isRegularFile(file, LinkOption.NOFOLLOW_LINKS) || Files.isSymbolicLink(file) + || Files.size(file) > 64 * 1024 * 1024) { + throw new IOException("Refusing an invalid world header: " + file); + } + byte[] original = Files.readAllBytes(file); + NBTTagCompound document; + try (InputStream input = new java.io.ByteArrayInputStream(original)) { + document = CompressedStreamTools.readCompressed(input); + } + boolean changed = remapFluidDefaults(document); + changed |= remapModList(document, loadedReplacements); + if (!changed) continue; + Path backups = root.resolve("basepower-migration-backups"); + Files.createDirectories(backups); + Path backup = backups.resolve(name + "." + sha256(original) + ".before-base-identity-migration"); + if (!Files.exists(backup)) Files.copy(file, backup); + if (!Arrays.equals(original, Files.readAllBytes(backup))) { + throw new IOException("World-header backup does not match: " + backup); + } + if (!Arrays.equals(original, Files.readAllBytes(file))) { + throw new IOException("World header changed during migration: " + file); + } + ByteArrayOutputStream output = new ByteArrayOutputStream(); + CompressedStreamTools.writeCompressed(document, output); + Path temporary = Files.createTempFile(root, ".basepower-level-", ".tmp"); + try { + Files.write(temporary, output.toByteArray()); + Files.move(temporary, file, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); + } finally { Files.deleteIfExists(temporary); } + FMLLog.info("basepower: migrated saved Advantage identities in %s; original header retained at %s", file, backup); + } + } + + private static String sha256(byte[] bytes) { + try { + StringBuilder result = new StringBuilder(); + for (byte value : MessageDigest.getInstance("SHA-256").digest(bytes)) { + result.append(String.format(java.util.Locale.ROOT, "%02x", value & 255)); + } + return result.toString(); + } catch (NoSuchAlgorithmException impossible) { throw new AssertionError(impossible); } + } +} diff --git a/src/main/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentity.java b/src/main/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentity.java new file mode 100644 index 0000000..9be1790 --- /dev/null +++ b/src/main/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentity.java @@ -0,0 +1,620 @@ +package zone.moddev.mc.basepower.compat; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import java.io.IOException; +import java.io.StringReader; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Bounded identity migration for released Power/Electric 1.10 configurations. + * + *

Call {@link #migrateConfig} during the owning mod's preInit, before + * OreSpawn 4.0.8's init imports OS1/OS3 files and discovers providers. Provider + * IDs MUST become the loaded mod ID: the pinned engine rejects unloaded owners + * and rules outside their owner's namespace. An old OS1 filename must not + * remain discoverable, or the bridge imports it as a standalone OreSpawn rule. + * + *

Call {@link #migrateWorld} only before OreSpawn reads the selected world's + * profile. With required-after:orespawn, an ordinary serverAboutToStart callback + * is too late. Native required-before:orespawn ordering on Power permits Power + * to migrate both loaded identities before OreSpawn's callback, without ASM. + * This helper neither reloads OreSpawn nor discovers/scans worlds. Exceptions + * must abort startup, never fall through to fresh defaults. Validation precedes + * all changes; filesystem failures can leave a partial, backed-up batch that is + * safe to retry, but must not be used to continue the same startup. + */ +public final class LegacyWorldgenIdentity { + private static final Gson GSON = new GsonBuilder().setPrettyPrinting() + .disableHtmlEscaping().serializeNulls().create(); + private static final LinkOption[] NO_LINKS = { LinkOption.NOFOLLOW_LINKS }; + // OreSpawn 4.1 uses distinct global/world schemas; provider files keep their own version. + private static final int MAX_GLOBAL_PROFILE_SCHEMA = 8; + private static final int MAX_WORLD_PROFILE_SCHEMA = 7; + private static final List RULE_MAPS = Arrays.asList("ores", "fluid_deposits", "rocks", + "geomes", "templates", "biome_palettes", "dimension_materials"); + private static final List BLOCK_FIELDS = Arrays.asList("block", "blockID", "top_block", + "filler_block", "underwater_block", "ceiling_block", "snow_block", "ice_block"); + private static final List BLOCK_LISTS = Arrays.asList("blocks", "host_blocks", "outputs"); + private static final List OWNER_FIELDS = Arrays.asList("provider_modid", "source_mod", + "source_provider", "sulfur_source", "lithium_source", "crude_oil_source", + "sulfur_provider", "lithium_provider", "crude_oil_provider"); + + private LegacyWorldgenIdentity() { } + + /** Fixed config filenames only. The return value counts writes and retirements. */ + public static synchronized int migrateConfig(Path configDirectory, String oldModId, + String newModId) throws IOException { + Pair pair = new Pair(oldModId, newModId); + Batch batch = new Batch(configDirectory, pair); + Document oldProvider = batch.read(oldModId + "-orespawn.json", "provider"); + Document newProvider = batch.read(newModId + "-orespawn.json", "provider"); + Document profile = batch.read("orespawn-worldgen.json", "global-profile"); + List legacy = new ArrayList<>(); + for (String directory : Arrays.asList("orespawn", "orespawn3")) { + String kind = "orespawn".equals(directory) ? "os1" : "os3"; + Document old = batch.read(directory + "/" + oldModId + ".json", kind); + Document modern = batch.read(directory + "/" + newModId + ".json", kind); + if (old != null) legacy.add(old); + if (modern != null) legacy.add(modern); + if (old != null && modern != null && !old.migrated.equals(modern.migrated)) { + throw problem(old.path, "different old/new legacy authorities; resolve explicitly"); + } + } + if (oldProvider != null && newProvider != null + && !oldProvider.migrated.equals(newProvider.migrated)) { + throw problem(oldProvider.path, "different old/new provider authorities; resolve explicitly"); + } + // Already-imported standalone rules cannot be claimed by another provider. + Document standalone = batch.read("orespawn-orespawn.json", "standalone"); + if (standalone != null && containsStandalone(standalone.original, pair)) { + throw problem(standalone.path, "owned standalone legacy rules require explicit reconciliation"); + } + Document provider = newProvider != null ? newProvider : oldProvider; + if (provider != null) { + batch.write(newModId + "-orespawn.json", provider.migrated); + if (oldProvider != null) batch.retire(oldProvider); + // The pinned bridge overwrites explicit provider files, so none of + // these owned legacy inputs may remain in its *.json discovery. + for (Document source : legacy) batch.retire(source); + if (profile != null) checkProviderOverlap(profile.migrated, provider.migrated, pair); + } else if (!legacy.isEmpty()) { + if (batch.exists(".orespawn-legacy-bridge-migrated")) { + throw problem(batch.root, "bridge marker exists but owned provider is absent; legacy import would be skipped"); + } + String kind = legacy.get(0).kind; + for (Document source : legacy) { + if (!kind.equals(source.kind)) { + throw problem(source.path, "both OS1 and OS3 authorities exist without an explicit provider"); + } + } + if (profile != null && hasOwnedRules(profile.migrated, pair)) { + throw problem(profile.path, "saved owned rules plus pending legacy import require explicit reconciliation"); + } + String directory = "os1".equals(kind) ? "orespawn" : "orespawn3"; + batch.write(directory + "/" + newModId + ".json", legacy.get(0).migrated); + for (Document source : legacy) { + if (source.path.getFileName().toString().equals(oldModId + ".json")) batch.retire(source); + } + } + if (profile != null) batch.write("orespawn-worldgen.json", profile.migrated); + return batch.commit(); + } + + /** Only serverconfig/orespawn-worldgen.json in the explicitly supplied root. */ + public static synchronized int migrateWorld(Path worldRoot, String oldModId, + String newModId) throws IOException { + Pair pair = new Pair(oldModId, newModId); + Batch batch = new Batch(worldRoot, pair); + Document profile = batch.read("serverconfig/orespawn-worldgen.json", "world-profile"); + if (profile != null) batch.write("serverconfig/orespawn-worldgen.json", profile.migrated); + return batch.commit(); + } + + /** Exact selector values only; useful to the owning Forge configuration code. */ + public static String migrateSelectorValue(String value, String oldModId, String newModId) { + Pair pair = new Pair(oldModId, newModId); + return pair.oldId.equals(value) ? pair.newId : value; + } + + private static final class Pair { + final String oldId; + final String newId; + Pair(String oldId, String newId) { + if (!("poweradvantage".equals(oldId) && "basepower".equals(newId)) + && !("electricadvantage".equals(oldId) && "baseelectric".equals(newId))) { + throw new IllegalArgumentException("Unsupported worldgen identity pair"); + } + this.oldId = oldId; + this.newId = newId; + } + String id(String text) throws IOException { + if (!text.startsWith(oldId + ":")) return text; + if (!text.substring(oldId.length() + 1).matches("[a-z0-9_./-]+")) { + throw new IOException("Invalid owned identifier: " + text); + } + return newId + text.substring(oldId.length()); + } + String rule(String text) throws IOException { + String result = id(text); + // OS1 generates names from output namespace + path + ordinal. + String prefix = newId + ":legacy/" + oldId + "_"; + return result.startsWith(prefix) ? newId + ":legacy/" + newId + "_" + + result.substring(prefix.length()) : result; + } + } + + private static JsonElement rewrite(JsonElement input, Pair pair, String context) throws IOException { + if (input.isJsonArray()) { + JsonArray output = new JsonArray(); + for (JsonElement item : input.getAsJsonArray()) { + if (isString(item) && (BLOCK_LISTS.contains(context) || context.startsWith("known_"))) { + output.add(new JsonPrimitive(context.startsWith("known_") + ? pair.rule(item.getAsString()) : pair.id(item.getAsString()))); + } else output.add(rewrite(item, pair, context)); + } + return output; + } + if (!input.isJsonObject()) return input; + JsonObject output = new JsonObject(); + for (Map.Entry entry : input.getAsJsonObject().entrySet()) { + String key = entry.getKey(); + JsonElement value = entry.getValue(); + String target = RULE_MAPS.contains(context) ? pair.rule(key) + : (("providers".equals(context) || "ore_providers".equals(context)) + && pair.oldId.equals(key) ? pair.newId : key); + JsonElement mapped; + if (BLOCK_FIELDS.contains(key) || ("name".equals(key) && "blocks".equals(context))) { + if (!isString(value)) throw new IOException("Block reference must be a string: " + key); + mapped = new JsonPrimitive(pair.id(value.getAsString())); + } else if (OWNER_FIELDS.contains(key) || ("resource_sources".equals(context) + && Arrays.asList("sulfur", "lithium", "crude_oil").contains(key))) { + if (!isString(value)) throw new IOException("Owner selector must be a string: " + key); + mapped = new JsonPrimitive(pair.oldId.equals(value.getAsString()) ? pair.newId : value.getAsString()); + } else if (Arrays.asList("notes", "description", "comment", "metadata", "host_tags", "tags").contains(key)) { + mapped = value; + } else mapped = rewrite(value, pair, key); + if (output.has(target) && !output.get(target).equals(mapped)) { + throw new IOException("Conflicting identity entries: " + key + " -> " + target); + } + output.add(target, mapped); + } + return output; + } + + private static boolean isString(JsonElement value) { + return value != null && value.isJsonPrimitive() && value.getAsJsonPrimitive().isString(); + } + + private static void validate(JsonObject root, String kind, Pair pair) throws IOException { + if ("os1".equals(kind)) { + if (!root.has("dimensions") || !root.get("dimensions").isJsonArray()) { + throw new IOException("OS1 dimensions must be an array"); + } + for (JsonElement element : root.getAsJsonArray("dimensions")) { + if (!element.isJsonObject()) throw new IOException("Invalid OS1 dimension"); + JsonObject dimension = element.getAsJsonObject(); + JsonElement id = dimension.get("dimension"); + if (id == null || !(isString(id) && "+".equals(id.getAsString()))) { + integer(id, "dimension"); + } + if (!dimension.has("ores") || !dimension.get("ores").isJsonArray()) { + throw new IOException("OS1 ores must be an array"); + } + for (JsonElement ore : dimension.getAsJsonArray("ores")) { + if (!ore.isJsonObject() || !isString(ore.getAsJsonObject().get("blockID"))) { + throw new IOException("OS1 ore must have a blockID string"); + } + JsonObject declaration = ore.getAsJsonObject(); + for (String field : Arrays.asList("size", "variation", "minHeight", "maxHeight", "blockMeta")) { + if (!declaration.has(field)) continue; + int number = integer(declaration.get(field), field); + int minimum = "size".equals(field) || "maxHeight".equals(field) ? 1 : 0; + int maximum = "blockMeta".equals(field) ? 15 : "minHeight".equals(field) ? 255 + : "maxHeight".equals(field) ? 256 : Integer.MAX_VALUE; + if (number < minimum || number > maximum) throw new IOException("Invalid OS1 " + field); + } + if (declaration.has("minHeight") && declaration.has("maxHeight") + && integer(declaration.get("minHeight"), "minHeight") + >= integer(declaration.get("maxHeight"), "maxHeight")) { + throw new IOException("Invalid OS1 exclusive height interval"); + } + if (declaration.has("frequency")) { + JsonElement frequency = declaration.get("frequency"); + if (!frequency.isJsonPrimitive() || !frequency.getAsJsonPrimitive().isNumber() + || !Double.isFinite(frequency.getAsDouble()) || frequency.getAsDouble() < 0) { + throw new IOException("Invalid OS1 frequency"); + } + } + if (declaration.has("biomes") && !declaration.get("biomes").isJsonArray()) { + throw new IOException("Invalid OS1 biome list"); + } + // The pin unconditionally enables OS1 declarations. Do not + // pretend an unsupported user disable will survive import. + if (declaration.has("enabled") && (!declaration.get("enabled").isJsonPrimitive() + || !declaration.get("enabled").getAsJsonPrimitive().isBoolean() + || !declaration.get("enabled").getAsBoolean())) { + throw new IOException("OS1 enabled override requires an explicit provider"); + } + } + } + } else if ("os3".equals(kind)) { + if (!root.has("spawns") || !root.get("spawns").isJsonObject()) { + throw new IOException("OS3 spawns must be an object"); + } + for (Map.Entry spawn : root.getAsJsonObject("spawns").entrySet()) { + if (!spawn.getValue().isJsonObject()) throw new IOException("Invalid OS3 spawn"); + JsonElement blocks = spawn.getValue().getAsJsonObject().get("blocks"); + if (blocks == null || !blocks.isJsonArray() || blocks.getAsJsonArray().size() == 0) { + throw new IOException("OS3 spawn requires output blocks"); + } + for (JsonElement output : blocks.getAsJsonArray()) { + if (!output.isJsonObject() || !isString(output.getAsJsonObject().get("name"))) { + throw new IOException("Invalid OS3 output block"); + } + } + } + } else if ("provider".equals(kind)) { + int schema = integer(root.get("schema_version"), "schema_version"); + if (schema < 1 || schema > 4 || integer(root.get("provider_revision"), "provider_revision") < 1 + || !isString(root.get("provider_modid")) + || !pair.newId.equals(root.get("provider_modid").getAsString())) { + throw new IOException("Invalid provider header"); + } + int entries = 0; + for (String section : RULE_MAPS) { + if (!root.has(section)) continue; + if (!root.get(section).isJsonObject()) throw new IOException("Invalid provider section: " + section); + if ((schema == 1 && !"ores".equals(section)) + || (schema < 3 && "fluid_deposits".equals(section)) + || (schema < 4 && ("biome_palettes".equals(section) || "dimension_materials".equals(section)))) { + throw new IOException("Section not supported by provider schema: " + section); + } + for (Map.Entry rule : root.getAsJsonObject(section).entrySet()) { + if (!rule.getKey().startsWith(pair.newId + ":") || !rule.getValue().isJsonObject()) { + throw new IOException("Provider rule outside owned namespace: " + rule.getKey()); + } + entries++; + } + } + if (entries == 0) throw new IOException("Owned provider declares no rules"); + } else if (root.has("schema_version")) { + int schema = integer(root.get("schema_version"), "schema_version"); + int maximum = "global-profile".equals(kind) ? MAX_GLOBAL_PROFILE_SCHEMA + : "world-profile".equals(kind) ? MAX_WORLD_PROFILE_SCHEMA : 6; + if (schema < 1 || schema > maximum) { + throw new IOException("Unsupported worldgen profile schema " + schema + " for " + kind); + } + } + for (String section : Arrays.asList("ores", "fluid_deposits", "providers", "ore_providers")) { + if (root.has(section) && !root.get(section).isJsonObject()) { + throw new IOException("Invalid worldgen section: " + section); + } + } + } + + private static int integer(JsonElement value, String field) throws IOException { + try { + if (value == null || !value.isJsonPrimitive() || !(value.getAsJsonPrimitive().isNumber() + || "dimension".equals(field) && value.getAsJsonPrimitive().isString())) { + throw new NumberFormatException(); + } + return new BigDecimal(value.getAsString()).intValueExact(); + } catch (RuntimeException error) { throw new IOException("Invalid integer: " + field, error); } + } + + private static boolean containsStandalone(JsonElement value, Pair pair) { + if (value.isJsonObject()) { + for (Map.Entry entry : value.getAsJsonObject().entrySet()) { + if (entry.getKey().startsWith("orespawn:legacy/" + pair.oldId + "/") + || entry.getKey().startsWith("orespawn:legacy/" + pair.newId + "/") + || containsStandalone(entry.getValue(), pair)) return true; + } + } else if (value.isJsonArray()) { + for (JsonElement item : value.getAsJsonArray()) if (containsStandalone(item, pair)) return true; + } + return false; + } + + private static boolean hasOwnedRules(JsonObject root, Pair pair) throws IOException { + if (containsStandalone(root, pair)) throw new IOException("Standalone owned legacy rules require reconciliation"); + for (String section : Arrays.asList("ores", "fluid_deposits")) { + if (!root.has(section)) continue; + for (Map.Entry entry : root.getAsJsonObject(section).entrySet()) { + if (entry.getKey().startsWith(pair.newId + ":")) return true; + } + } + return false; + } + + private static void checkProviderOverlap(JsonObject profile, JsonObject provider, Pair pair) throws IOException { + for (String section : Arrays.asList("ores", "fluid_deposits")) { + if (!provider.has(section)) continue; + for (Map.Entry supplied : provider.getAsJsonObject(section).entrySet()) { + String block = block(supplied.getValue()); + if (block == null || !block.startsWith(pair.newId + ":")) continue; + for (String savedSection : Arrays.asList("ores", "fluid_deposits")) { + if (!profile.has(savedSection)) continue; + for (Map.Entry saved : profile.getAsJsonObject(savedSection).entrySet()) { + if (block.equals(block(saved.getValue())) && !saved.getKey().equals(supplied.getKey()) + && (saved.getKey().contains(":legacy/") || supplied.getKey().contains(":legacy/"))) { + throw new IOException("Saved legacy/modern rule overlap for " + block + "; resolve explicitly"); + } + } + } + } + } + } + + private static String block(JsonElement rule) { + return rule.isJsonObject() && isString(rule.getAsJsonObject().get("block")) + ? rule.getAsJsonObject().get("block").getAsString() : null; + } + + private static void preserveLegacyAuthority(JsonObject profile, Pair pair) throws IOException { + if (containsStandalone(profile, pair)) throw new IOException("Standalone owned legacy rules require reconciliation"); + boolean legacy = false; + boolean modern = false; + for (String section : Arrays.asList("ores", "fluid_deposits")) { + if (!profile.has(section)) continue; + for (Map.Entry rule : profile.getAsJsonObject(section).entrySet()) { + if (!rule.getKey().startsWith(pair.newId + ":")) continue; + if (!rule.getValue().isJsonObject()) throw new IOException("Invalid owned saved rule"); + if (rule.getKey().startsWith(pair.newId + ":legacy/")) legacy = true; + else modern = true; + } + } + if (legacy && modern) throw new IOException("Saved legacy and modern owned rules require explicit reconciliation"); + if (!legacy) return; + // Prevent an API-default rule being added beside retained OS1/OS3 rules. + JsonObject providers = object(profile, "providers"); + JsonObject manifest = object(providers, pair.newId); + manifest.addProperty("profile_defaults_applied", true); + if ("basepower".equals(pair.newId)) { + remember(manifest, "known_fluid_deposits", "basepower:fluid_deposit/desert_crude_oil"); + } else { + remember(manifest, "known_ores", "baseelectric:ore/lithium"); + remember(manifest, "known_ores", "baseelectric:ore/sulfur"); + } + } + + private static JsonObject object(JsonObject parent, String key) throws IOException { + if (!parent.has(key)) parent.add(key, new JsonObject()); + if (!parent.get(key).isJsonObject()) throw new IOException("Expected object: " + key); + return parent.getAsJsonObject(key); + } + + private static void remember(JsonObject parent, String key, String value) throws IOException { + if (!parent.has(key)) parent.add(key, new JsonArray()); + if (!parent.get(key).isJsonArray()) throw new IOException("Expected array: " + key); + JsonArray array = parent.getAsJsonArray(key); + for (JsonElement item : array) { + if (!isString(item)) throw new IOException("Invalid known rule ID"); + if (value.equals(item.getAsString())) return; + } + array.add(new JsonPrimitive(value)); + } + + private static final class Document { + final Path path; + final String kind; + final byte[] bytes; + final JsonObject original; + final JsonObject migrated; + Document(Path path, String kind, byte[] bytes, Pair pair) throws IOException { + this.path = path; + this.kind = kind; + this.bytes = bytes; + try (JsonReader reader = new JsonReader(new StringReader(StandardCharsets.UTF_8.newDecoder() + .decode(ByteBuffer.wrap(bytes)).toString()))) { + reader.setLenient(false); + JsonElement parsed = parse(reader, 0); + if (!parsed.isJsonObject() || reader.peek() != JsonToken.END_DOCUMENT) { + throw problem(path, "expected one JSON object"); + } + original = parsed.getAsJsonObject(); + if ("provider".equals(kind)) { + String expected = path.getFileName().toString().replace("-orespawn.json", ""); + if (!isString(original.get("provider_modid")) + || !expected.equals(original.get("provider_modid").getAsString())) { + throw problem(path, "provider_modid does not match its filename"); + } + } + migrated = rewrite(original, pair, "").getAsJsonObject(); + validate(migrated, kind, pair); + if ("global-profile".equals(kind) || "world-profile".equals(kind)) preserveLegacyAuthority(migrated, pair); + } catch (RuntimeException error) { throw problem(path, "invalid owned JSON", error); } + } + } + + // JsonParser is lenient even with a strict reader in older Gson. Read tokens + // directly so malformed JSON and duplicate authority keys cannot be lost. + private static JsonElement parse(JsonReader reader, int depth) throws IOException { + if (depth > 128) throw new IOException("Worldgen JSON exceeds nesting limit"); + switch (reader.peek()) { + case BEGIN_OBJECT: + JsonObject object = new JsonObject(); + reader.beginObject(); + while (reader.hasNext()) { + String key = reader.nextName(); + if (object.has(key)) throw new IOException("Duplicate JSON key: " + key); + object.add(key, parse(reader, depth + 1)); + } + reader.endObject(); + return object; + case BEGIN_ARRAY: + JsonArray array = new JsonArray(); + reader.beginArray(); + while (reader.hasNext()) array.add(parse(reader, depth + 1)); + reader.endArray(); + return array; + case STRING: return new JsonPrimitive(reader.nextString()); + case NUMBER: return new JsonPrimitive(new BigDecimal(reader.nextString())); + case BOOLEAN: return new JsonPrimitive(reader.nextBoolean()); + case NULL: reader.nextNull(); return JsonNull.INSTANCE; + default: throw new IOException("Invalid JSON token: " + reader.peek()); + } + } + + private static final class Batch { + final Path root; + final Pair pair; + final Map documents = new LinkedHashMap<>(); + final Map writes = new LinkedHashMap<>(); + final List retirements = new ArrayList<>(); + Batch(Path root, Pair pair) throws IOException { + this.root = root.toAbsolutePath().normalize(); + this.pair = pair; + checkPath(this.root); + if (Files.exists(this.root, NO_LINKS) && !Files.isDirectory(this.root, NO_LINKS)) { + throw problem(this.root, "root is not a directory"); + } + } + Path path(String relative) throws IOException { + Path target = root.resolve(relative).normalize(); + if (!target.startsWith(root) || target.equals(root)) throw problem(target, "path escapes root"); + checkPath(target); + return target; + } + boolean exists(String relative) throws IOException { return Files.exists(path(relative), NO_LINKS); } + Document read(String relative, String kind) throws IOException { + Path path = path(relative); + if (!Files.exists(path, NO_LINKS)) return null; + if (!Files.isRegularFile(path, NO_LINKS) || Files.size(path) > 16 * 1024 * 1024) { + throw problem(path, "expected a regular JSON file of at most 16 MiB"); + } + Document document = new Document(path, kind, Files.readAllBytes(path), pair); + documents.put(path, document); + return document; + } + void write(String relative, JsonObject value) throws IOException { + Path path = path(relative); + Document existing = documents.get(path); + if (existing != null && existing.original.equals(value)) return; + writes.put(path, (GSON.toJson(value) + "\n").getBytes(StandardCharsets.UTF_8)); + } + void retire(Document source) { retirements.add(source.path); } + int commit() throws IOException { + // Check every snapshot and backup before the first mutation. + for (Document document : documents.values()) unchanged(document); + for (Path path : writes.keySet()) { + if (!documents.containsKey(path) && Files.exists(path, NO_LINKS)) { + throw problem(path, "destination appeared during migration"); + } + } + Map backups = new LinkedHashMap<>(); + for (Document document : documents.values()) { + if (!writes.containsKey(document.path) && !retirements.contains(document.path)) continue; + Path backup = document.path.resolveSibling(document.path.getFileName() + + ".before-" + pair.newId + "-" + sha256(document.bytes) + ".bak"); + checkPath(backup); + if (Files.exists(backup, NO_LINKS) && (!Files.isRegularFile(backup, NO_LINKS) + || !Arrays.equals(document.bytes, Files.readAllBytes(backup)))) { + throw problem(backup, "backup conflict; original backup will never be overwritten"); + } + backups.put(document.path, backup); + } + for (Map.Entry backup : backups.entrySet()) { + if (!Files.exists(backup.getValue(), NO_LINKS)) { + unchanged(documents.get(backup.getKey())); + atomicWrite(backup.getValue(), documents.get(backup.getKey()).bytes, false); + } + if (!Arrays.equals(documents.get(backup.getKey()).bytes, Files.readAllBytes(backup.getValue()))) { + throw problem(backup.getValue(), "backup verification failed"); + } + } + for (Map.Entry write : writes.entrySet()) { + Document old = documents.get(write.getKey()); + if (old != null) unchanged(old); + atomicWrite(write.getKey(), write.getValue(), old != null); + } + for (Path source : retirements) { + unchanged(documents.get(source)); + // Exact owned filenames only, after byte-verified immutable backup. + Files.delete(source); + } + return writes.size() + retirements.size(); + } + } + + private static void unchanged(Document document) throws IOException { + checkPath(document.path); + if (!Files.isRegularFile(document.path, NO_LINKS) + || !Arrays.equals(document.bytes, Files.readAllBytes(document.path))) { + throw problem(document.path, "source changed during migration"); + } + } + + private static void checkPath(Path path) throws IOException { + for (Path current = path.toAbsolutePath().normalize(); current != null; current = current.getParent()) { + try { + java.nio.file.attribute.BasicFileAttributes attributes = Files.readAttributes(current, + java.nio.file.attribute.BasicFileAttributes.class, NO_LINKS); + if (attributes.isSymbolicLink() || attributes.isOther()) { + throw problem(current, "linked/reparse paths are not permitted"); + } + } catch (java.nio.file.NoSuchFileException absent) { /* Nonexistent leaves are allowed. */ } + } + } + + private static void atomicWrite(Path target, byte[] bytes, boolean replace) throws IOException { + checkPath(target); + Files.createDirectories(target.getParent()); + Path temporary = Files.createTempFile(target.getParent(), ".identity-", ".tmp"); + try { + try (FileChannel channel = FileChannel.open(temporary, StandardOpenOption.WRITE)) { + ByteBuffer buffer = ByteBuffer.wrap(bytes); + while (buffer.hasRemaining()) channel.write(buffer); + channel.force(true); + } + checkPath(target); + if (!replace && Files.exists(target, NO_LINKS)) throw problem(target, "destination appeared"); + if (replace) { + // No non-atomic fallback: unsupported filesystems must stop startup. + Files.move(temporary, target, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); + } else { + // ATOMIC_MOVE may replace an existing destination even without + // REPLACE_EXISTING. Publish new files/backups with an atomic, + // no-clobber hard link to independent, fully flushed bytes. + Files.createLink(target, temporary); + } + } finally { Files.deleteIfExists(temporary); } + } + + private static String sha256(byte[] bytes) { + try { + StringBuilder hash = new StringBuilder(); + for (byte value : MessageDigest.getInstance("SHA-256").digest(bytes)) { + hash.append(String.format(java.util.Locale.ROOT, "%02x", value & 255)); + } + return hash.toString(); + } catch (NoSuchAlgorithmException impossible) { throw new AssertionError(impossible); } + } + + private static IOException problem(Path path, String message) { return problem(path, message, null); } + private static IOException problem(Path path, String message, Throwable cause) { + return new IOException("Worldgen identity migration: " + message + " (" + path + ")", cause); + } +} diff --git a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManager.java b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManager.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManager.java rename to src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManager.java index 4b06a23..8dc465e 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManager.java +++ b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManager.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.conduitnetwork; +package zone.moddev.mc.basepower.conduitnetwork; import java.util.ArrayList; import java.util.Collections; @@ -9,8 +9,8 @@ import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PowerConnectorContext; -import zone.moddev.mc.poweradvantage.math.BlockPos4D; -import zone.moddev.mc.poweradvantage.util.PowerHelper; +import zone.moddev.mc.basepower.math.BlockPos4D; +import zone.moddev.mc.basepower.util.PowerHelper; import net.minecraft.block.state.IBlockState; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.ChunkPos; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitRegistry.java b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitRegistry.java similarity index 98% rename from src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitRegistry.java rename to src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitRegistry.java index 0abf473..b99fa3b 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitRegistry.java +++ b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/ConduitRegistry.java @@ -1,6 +1,6 @@ -package zone.moddev.mc.poweradvantage.conduitnetwork; +package zone.moddev.mc.basepower.conduitnetwork; -import zone.moddev.mc.poweradvantage.PowerAdvantage; +import zone.moddev.mc.basepower.PowerAdvantage; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.IPowerMachine; import cyano.poweradvantage.api.ITypedConduit; @@ -8,7 +8,7 @@ import cyano.poweradvantage.api.modsupport.ExternalPowerRequest; import cyano.poweradvantage.api.modsupport.LightWeightPowerRegistry; import cyano.poweradvantage.api.modsupport.Wrappers; -import zone.moddev.mc.poweradvantage.math.BlockPos4D; +import zone.moddev.mc.basepower.math.BlockPos4D; import net.minecraft.block.Block; import net.minecraft.block.ITileEntityProvider; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/package-info.java b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/package-info.java similarity index 87% rename from src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/package-info.java rename to src/main/java/zone/moddev/mc/basepower/conduitnetwork/package-info.java index 0dae2de..e16e94a 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/conduitnetwork/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/conduitnetwork/package-info.java @@ -4,4 +4,4 @@ the same power type and caching the resulting list of sources and sinks. Every time a conduit block is placed or broken, any adjacent networks are revalidated. */ -package zone.moddev.mc.poweradvantage.conduitnetwork; \ No newline at end of file +package zone.moddev.mc.basepower.conduitnetwork; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/graphics/package-info.java b/src/main/java/zone/moddev/mc/basepower/graphics/package-info.java similarity index 70% rename from src/main/java/zone/moddev/mc/poweradvantage/graphics/package-info.java rename to src/main/java/zone/moddev/mc/basepower/graphics/package-info.java index d75d837..29bc810 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/graphics/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/graphics/package-info.java @@ -2,4 +2,4 @@ This package contains classes related to on-demand rendering, such as for entities and animated blocks. */ -package zone.moddev.mc.poweradvantage.graphics; \ No newline at end of file +package zone.moddev.mc.basepower.graphics; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/gui/FilteredFluidTankGUI.java b/src/main/java/zone/moddev/mc/basepower/gui/FilteredFluidTankGUI.java similarity index 95% rename from src/main/java/zone/moddev/mc/poweradvantage/gui/FilteredFluidTankGUI.java rename to src/main/java/zone/moddev/mc/basepower/gui/FilteredFluidTankGUI.java index 96997b3..0a34f69 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/gui/FilteredFluidTankGUI.java +++ b/src/main/java/zone/moddev/mc/basepower/gui/FilteredFluidTankGUI.java @@ -1,8 +1,8 @@ -package zone.moddev.mc.poweradvantage.gui; +package zone.moddev.mc.basepower.gui; import cyano.poweradvantage.api.fluid.FluidPoweredEntity; import cyano.poweradvantage.api.simple.SimpleMachineGUI; -import zone.moddev.mc.poweradvantage.math.Integer2D; +import zone.moddev.mc.basepower.math.Integer2D; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidStack; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/gui/FluidTankGUI.java b/src/main/java/zone/moddev/mc/basepower/gui/FluidTankGUI.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/gui/FluidTankGUI.java rename to src/main/java/zone/moddev/mc/basepower/gui/FluidTankGUI.java index b3642cd..5f28c52 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/gui/FluidTankGUI.java +++ b/src/main/java/zone/moddev/mc/basepower/gui/FluidTankGUI.java @@ -1,8 +1,8 @@ -package zone.moddev.mc.poweradvantage.gui; +package zone.moddev.mc.basepower.gui; import cyano.poweradvantage.api.fluid.FluidPoweredEntity; import cyano.poweradvantage.api.simple.SimpleMachineGUI; -import zone.moddev.mc.poweradvantage.math.Integer2D; +import zone.moddev.mc.basepower.math.Integer2D; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/gui/FunctionalCreativeTab.java b/src/main/java/zone/moddev/mc/basepower/gui/FunctionalCreativeTab.java similarity index 98% rename from src/main/java/zone/moddev/mc/poweradvantage/gui/FunctionalCreativeTab.java rename to src/main/java/zone/moddev/mc/basepower/gui/FunctionalCreativeTab.java index 22c64bc..9ca4036 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/gui/FunctionalCreativeTab.java +++ b/src/main/java/zone/moddev/mc/basepower/gui/FunctionalCreativeTab.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.gui; +package zone.moddev.mc.basepower.gui; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/gui/StillGUI.java b/src/main/java/zone/moddev/mc/basepower/gui/StillGUI.java similarity index 90% rename from src/main/java/zone/moddev/mc/poweradvantage/gui/StillGUI.java rename to src/main/java/zone/moddev/mc/basepower/gui/StillGUI.java index e26ce4b..74ae782 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/gui/StillGUI.java +++ b/src/main/java/zone/moddev/mc/basepower/gui/StillGUI.java @@ -1,8 +1,8 @@ -package zone.moddev.mc.poweradvantage.gui; +package zone.moddev.mc.basepower.gui; import cyano.poweradvantage.api.simple.SimpleMachineGUI; -import zone.moddev.mc.poweradvantage.machines.fluidmachines.StillTileEntity; -import zone.moddev.mc.poweradvantage.math.Integer2D; +import zone.moddev.mc.basepower.machines.fluidmachines.StillTileEntity; +import zone.moddev.mc.basepower.math.Integer2D; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidStack; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/items/package-info.java b/src/main/java/zone/moddev/mc/basepower/gui/package-info.java similarity index 76% rename from src/main/java/zone/moddev/mc/poweradvantage/items/package-info.java rename to src/main/java/zone/moddev/mc/basepower/gui/package-info.java index 8478604..e830c8e 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/items/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/gui/package-info.java @@ -3,10 +3,10 @@ This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API. If you are writing an add-on mod, use the code in this package for reference, but you should not depend on it's implementation details as future updates might change them. For a better way to get -PowerAdvantage content, look in the zone.moddev.mc.poweradvantage.init package. +PowerAdvantage content, look in the zone.moddev.mc.basepower.init package.

Because these classes are not part of the API, they are not well documented. They were only meant for the eyes of the mod author(s).

*/ -package zone.moddev.mc.poweradvantage.items; \ No newline at end of file +package zone.moddev.mc.basepower.gui; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Blocks.java b/src/main/java/zone/moddev/mc/basepower/init/Blocks.java similarity index 93% rename from src/main/java/zone/moddev/mc/poweradvantage/init/Blocks.java rename to src/main/java/zone/moddev/mc/basepower/init/Blocks.java index 45e3fdf..11b0e95 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/Blocks.java +++ b/src/main/java/zone/moddev/mc/basepower/init/Blocks.java @@ -1,15 +1,15 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; -import zone.moddev.mc.poweradvantage.PowerAdvantage; +import zone.moddev.mc.basepower.PowerAdvantage; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.GUIBlock; import cyano.poweradvantage.api.fluid.InteractiveFluidBlock; -import zone.moddev.mc.poweradvantage.blocks.BlockFrame; -import zone.moddev.mc.poweradvantage.blocks.BlockPowerSwitch; -import zone.moddev.mc.poweradvantage.machines.conveyors.*; -import zone.moddev.mc.poweradvantage.machines.creative.InfiniteEnergyBlock; -import zone.moddev.mc.poweradvantage.machines.fluidmachines.*; -import zone.moddev.mc.poweradvantage.machines.fluidmachines.modsupport.TerminalFluidPipeBlock; +import zone.moddev.mc.basepower.blocks.BlockFrame; +import zone.moddev.mc.basepower.blocks.BlockPowerSwitch; +import zone.moddev.mc.basepower.machines.conveyors.*; +import zone.moddev.mc.basepower.machines.creative.InfiniteEnergyBlock; +import zone.moddev.mc.basepower.machines.fluidmachines.*; +import zone.moddev.mc.basepower.machines.fluidmachines.modsupport.TerminalFluidPipeBlock; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -77,7 +77,7 @@ public static void init() { if (initDone) return; ItemGroups.init(); Fluids.init(); - zone.moddev.mc.poweradvantage.init.Materials.init(); + zone.moddev.mc.basepower.init.Materials.init(); fluid_drain = (GUIBlock) addBlock(new FluidDrainBlock(), "fluid_drain"); diff --git a/src/main/java/zone/moddev/mc/basepower/init/Entities.java b/src/main/java/zone/moddev/mc/basepower/init/Entities.java new file mode 100644 index 0000000..cc5effa --- /dev/null +++ b/src/main/java/zone/moddev/mc/basepower/init/Entities.java @@ -0,0 +1,41 @@ +package zone.moddev.mc.basepower.init; + +import net.minecraftforge.fml.common.registry.GameRegistry; +import zone.moddev.mc.basepower.compat.LegacyIdentity; +import zone.moddev.mc.basepower.PowerAdvantage; +import zone.moddev.mc.basepower.machines.conveyors.*; +import zone.moddev.mc.basepower.machines.creative.InfiniteEnergyTileEntity; +import zone.moddev.mc.basepower.machines.fluidmachines.*; +import zone.moddev.mc.basepower.machines.fluidmachines.modsupport.TerminalFluidPipeTileEntity; + +public abstract class Entities { + + + private static boolean initDone = false; + + public static void init() { + if (initDone) return; + + Blocks.init(); + + LegacyIdentity.registerTileEntity(TerminalFluidPipeTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "pipe_terminal"); + LegacyIdentity.registerTileEntity(FluidDrainTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_drain"); + LegacyIdentity.registerTileEntity(FluidDischargeTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_discharge"); + LegacyIdentity.registerTileEntity(StorageTankTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_storage_tank"); + LegacyIdentity.registerTileEntity(MetalTankTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_metal_tank"); + LegacyIdentity.registerTileEntity(StillTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "still"); + LegacyIdentity.registerTileEntity(TileEntityConveyor.class, PowerAdvantage.MODID + "." + "item_conveyor"); + LegacyIdentity.registerTileEntity(TileEntityBlockFilter.class, PowerAdvantage.MODID + "." + "item_filter_block"); + LegacyIdentity.registerTileEntity(TileEntityFoodFilter.class, PowerAdvantage.MODID + "." + "item_filter_food"); + LegacyIdentity.registerTileEntity(TileEntityFuelFilter.class, PowerAdvantage.MODID + "." + "item_filter_fuel"); + LegacyIdentity.registerTileEntity(TileEntityInventoryFilter.class, PowerAdvantage.MODID + "." + "item_filter_inventory"); + LegacyIdentity.registerTileEntity(TileEntityOreFilter.class, PowerAdvantage.MODID + "." + "item_filter_ore"); + LegacyIdentity.registerTileEntity(TileEntityPlantFilter.class, PowerAdvantage.MODID + "." + "item_filter_plant"); + LegacyIdentity.registerTileEntity(TileEntitySmeltableFilter.class, PowerAdvantage.MODID + "." + "item_filter_smelt"); + LegacyIdentity.registerTileEntity(TileEntityOverflowFilter.class, PowerAdvantage.MODID + "." + "item_filter_overflow"); + + LegacyIdentity.registerTileEntity(InfiniteEnergyTileEntity.class, PowerAdvantage.MODID + "." + "infinite_energy_source"); + + initDone = true; + } +} \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Fluids.java b/src/main/java/zone/moddev/mc/basepower/init/Fluids.java similarity index 94% rename from src/main/java/zone/moddev/mc/poweradvantage/init/Fluids.java rename to src/main/java/zone/moddev/mc/basepower/init/Fluids.java index cb00dac..27fa2d4 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/Fluids.java +++ b/src/main/java/zone/moddev/mc/basepower/init/Fluids.java @@ -1,10 +1,10 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; -import zone.moddev.mc.poweradvantage.PowerAdvantage; +import zone.moddev.mc.basepower.PowerAdvantage; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.fluid.ColoredFluid; -import zone.moddev.mc.poweradvantage.util.ReversibleHashMap; -import zone.moddev.mc.poweradvantage.util.ReversibleMap; +import zone.moddev.mc.basepower.util.ReversibleHashMap; +import zone.moddev.mc.basepower.util.ReversibleMap; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; @@ -44,7 +44,7 @@ public abstract class Fluids { public static void init() { if (initDone) return; - zone.moddev.mc.poweradvantage.init.Materials.init(); + zone.moddev.mc.basepower.init.Materials.init(); fluidConduit_water = new ConduitType("water"); fluidConduit_lava = new ConduitType("lava"); diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Fuels.java b/src/main/java/zone/moddev/mc/basepower/init/Fuels.java similarity index 94% rename from src/main/java/zone/moddev/mc/poweradvantage/init/Fuels.java rename to src/main/java/zone/moddev/mc/basepower/init/Fuels.java index 767e654..200f098 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/Fuels.java +++ b/src/main/java/zone/moddev/mc/basepower/init/Fuels.java @@ -1,7 +1,7 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; -import zone.moddev.mc.poweradvantage.compat.BaseMetalsCompat; -import zone.moddev.mc.poweradvantage.registry.FuelRegistry; +import zone.moddev.mc.basepower.compat.BaseMetalsCompat; +import zone.moddev.mc.basepower.registry.FuelRegistry; import cyano.poweradvantage.api.FluidCategoryRegistry; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/GUI.java b/src/main/java/zone/moddev/mc/basepower/init/GUI.java similarity index 93% rename from src/main/java/zone/moddev/mc/poweradvantage/init/GUI.java rename to src/main/java/zone/moddev/mc/basepower/init/GUI.java index 3d845d7..19e1523 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/GUI.java +++ b/src/main/java/zone/moddev/mc/basepower/init/GUI.java @@ -1,11 +1,11 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; import net.minecraft.util.ResourceLocation; -import zone.moddev.mc.poweradvantage.PowerAdvantage; +import zone.moddev.mc.basepower.PowerAdvantage; import cyano.poweradvantage.api.simple.SimpleMachineGUI; -import zone.moddev.mc.poweradvantage.gui.*; -import zone.moddev.mc.poweradvantage.math.Integer2D; -import zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry; +import zone.moddev.mc.basepower.gui.*; +import zone.moddev.mc.basepower.math.Integer2D; +import zone.moddev.mc.basepower.registry.MachineGUIRegistry; public abstract class GUI { diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/ItemGroups.java b/src/main/java/zone/moddev/mc/basepower/init/ItemGroups.java similarity index 90% rename from src/main/java/zone/moddev/mc/poweradvantage/init/ItemGroups.java rename to src/main/java/zone/moddev/mc/basepower/init/ItemGroups.java index 032ab41..48efb2d 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/ItemGroups.java +++ b/src/main/java/zone/moddev/mc/basepower/init/ItemGroups.java @@ -1,7 +1,7 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; -import zone.moddev.mc.poweradvantage.PowerAdvantage; -import zone.moddev.mc.poweradvantage.gui.FunctionalCreativeTab; +import zone.moddev.mc.basepower.PowerAdvantage; +import zone.moddev.mc.basepower.gui.FunctionalCreativeTab; import net.minecraft.block.ITileEntityProvider; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Items.java b/src/main/java/zone/moddev/mc/basepower/init/Items.java similarity index 94% rename from src/main/java/zone/moddev/mc/poweradvantage/init/Items.java rename to src/main/java/zone/moddev/mc/basepower/init/Items.java index 974a17d..1c820a4 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/Items.java +++ b/src/main/java/zone/moddev/mc/basepower/init/Items.java @@ -1,7 +1,7 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; -import zone.moddev.mc.poweradvantage.PowerAdvantage; -import zone.moddev.mc.poweradvantage.items.RotationTool; +import zone.moddev.mc.basepower.PowerAdvantage; +import zone.moddev.mc.basepower.items.RotationTool; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.Item; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Materials.java b/src/main/java/zone/moddev/mc/basepower/init/Materials.java similarity index 77% rename from src/main/java/zone/moddev/mc/poweradvantage/init/Materials.java rename to src/main/java/zone/moddev/mc/basepower/init/Materials.java index 4373aac..91af787 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/Materials.java +++ b/src/main/java/zone/moddev/mc/basepower/init/Materials.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; public class Materials { diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/ModSupport.java b/src/main/java/zone/moddev/mc/basepower/init/ModSupport.java similarity index 85% rename from src/main/java/zone/moddev/mc/poweradvantage/init/ModSupport.java rename to src/main/java/zone/moddev/mc/basepower/init/ModSupport.java index d2919f5..2bc6bf8 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/ModSupport.java +++ b/src/main/java/zone/moddev/mc/basepower/init/ModSupport.java @@ -1,6 +1,6 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; -import zone.moddev.mc.poweradvantage.PowerAdvantage; +import zone.moddev.mc.basepower.PowerAdvantage; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.modsupport.rf.BlockRFConverter; import cyano.poweradvantage.api.modsupport.rf.TileEntityRFElectricityConverter; @@ -17,6 +17,7 @@ import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.registry.GameRegistry; +import zone.moddev.mc.basepower.compat.LegacyIdentity; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.oredict.ShapedOreRecipe; @@ -48,9 +49,9 @@ public static void init(boolean rfSupport, boolean techRebornSupport) { converter_rf_electricity = addBlock(new BlockRFConverter(defaultMachineMaterial, defaultMachineHardness, new ConduitType("electricity"), TileEntityRFElectricityConverter.class), "converter_rf_electricity"); converter_rf_quantum = addBlock(new BlockRFConverter(defaultMachineMaterial, defaultMachineHardness, new ConduitType("quantum"), TileEntityRFQuantumConverter.class), "converter_rf_quantum"); - GameRegistry.registerTileEntity(TileEntityRFSteamConverter.class, PowerAdvantage.MODID + "." + "rf_steam_converter_tileentity"); - GameRegistry.registerTileEntity(TileEntityRFElectricityConverter.class, PowerAdvantage.MODID + "." + "rf_electricity_converter_tileentity"); - GameRegistry.registerTileEntity(TileEntityRFQuantumConverter.class, PowerAdvantage.MODID + "." + "rf_quantum_converter_tileentity"); + LegacyIdentity.registerTileEntity(TileEntityRFSteamConverter.class, PowerAdvantage.MODID + "." + "rf_steam_converter_tileentity"); + LegacyIdentity.registerTileEntity(TileEntityRFElectricityConverter.class, PowerAdvantage.MODID + "." + "rf_electricity_converter_tileentity"); + LegacyIdentity.registerTileEntity(TileEntityRFQuantumConverter.class, PowerAdvantage.MODID + "." + "rf_quantum_converter_tileentity"); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(converter_rf_steam, 1), "xyz", @@ -67,7 +68,7 @@ public static void init(boolean rfSupport, boolean techRebornSupport) { // first, register transformers in Ore Dictionary converter_tr_electricity = addBlock(new BlockTRConverter(defaultMachineMaterial, defaultMachineHardness, new ConduitType("electricity"), TileEntityTRElectricityConverter.class), "converter_tr_electricity"); - GameRegistry.registerTileEntity(TileEntityTRElectricityConverter.class, PowerAdvantage.MODID + "." + "tr_electricity_converter_tileentity"); + LegacyIdentity.registerTileEntity(TileEntityTRElectricityConverter.class, PowerAdvantage.MODID + "." + "tr_electricity_converter_tileentity"); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(converter_tr_electricity, 1), "XXX", "XZX", "XXX", 'Z', "PSU", 'X', "ingotRefinedIron")); } diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGen.java b/src/main/java/zone/moddev/mc/basepower/init/OreSpawnWorldGen.java similarity index 92% rename from src/main/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGen.java rename to src/main/java/zone/moddev/mc/basepower/init/OreSpawnWorldGen.java index 7f97172..64bbc4a 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGen.java +++ b/src/main/java/zone/moddev/mc/basepower/init/OreSpawnWorldGen.java @@ -1,6 +1,6 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; -import zone.moddev.mc.poweradvantage.PowerAdvantage; +import zone.moddev.mc.basepower.PowerAdvantage; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; @@ -27,9 +27,9 @@ public static void register(Path configDirectory) { boolean accepted = OreSpawnApi.enqueue(provider); String override = describeOverride(configDirectory); String defaults = Loader.isModLoaded("mineralogy") - ? "mineralogy:ocean crude oil + poweradvantage:desert crude oil" - : "poweradvantage:desert crude oil"; - FMLLog.info("%s: OreSpawn crude-oil candidates=[mineralogy:ocean, poweradvantage:desert], " + ? "mineralogy:ocean crude oil + basepower:desert crude oil" + : "basepower:desert crude oil"; + FMLLog.info("%s: OreSpawn crude-oil candidates=[mineralogy:ocean, basepower:desert], " + "selected fresh-world defaults=[%s], explicit override=%s", PowerAdvantage.MODID, defaults, override); if (!accepted) { @@ -68,4 +68,4 @@ static String describeOverride(Path configDirectory) { } return "none"; } -} \ No newline at end of file +} diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Recipes.java b/src/main/java/zone/moddev/mc/basepower/init/Recipes.java similarity index 96% rename from src/main/java/zone/moddev/mc/poweradvantage/init/Recipes.java rename to src/main/java/zone/moddev/mc/basepower/init/Recipes.java index c009569..e84b24b 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/Recipes.java +++ b/src/main/java/zone/moddev/mc/basepower/init/Recipes.java @@ -1,10 +1,10 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; -import zone.moddev.mc.poweradvantage.PowerAdvantage; +import zone.moddev.mc.basepower.PowerAdvantage; import cyano.poweradvantage.api.FluidCategoryRegistry; -import zone.moddev.mc.poweradvantage.RecipeMode; -import zone.moddev.mc.poweradvantage.compat.BaseMetalsCompat; -import zone.moddev.mc.poweradvantage.registry.still.recipe.DistillationRecipeRegistry; +import zone.moddev.mc.basepower.RecipeMode; +import zone.moddev.mc.basepower.compat.BaseMetalsCompat; +import zone.moddev.mc.basepower.registry.still.recipe.DistillationRecipeRegistry; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fluids.Fluid; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/TreasureChests.java b/src/main/java/zone/moddev/mc/basepower/init/TreasureChests.java similarity index 88% rename from src/main/java/zone/moddev/mc/poweradvantage/init/TreasureChests.java rename to src/main/java/zone/moddev/mc/basepower/init/TreasureChests.java index 4558051..74966f1 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/TreasureChests.java +++ b/src/main/java/zone/moddev/mc/basepower/init/TreasureChests.java @@ -1,6 +1,6 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; -import zone.moddev.mc.poweradvantage.PowerAdvantage; +import zone.moddev.mc.basepower.PowerAdvantage; import net.minecraftforge.fml.common.FMLLog; import org.apache.logging.log4j.Level; @@ -30,6 +30,7 @@ public static void init(Path configFolder) { private static void writeLootFile(Path file, String content) { try { + if (Files.exists(file)) return; Files.createDirectories(file.getParent()); Files.write(file, Arrays.asList(content), Charset.forName("UTF-8")); } catch (IOException e) { @@ -49,7 +50,7 @@ private static void writeLootFile(Path file, String content) { " },\n" + " {\n" + " \"type\": \"item\",\n" + - " \"name\": \"poweradvantage:sprocket\",\n" + + " \"name\": \"basepower:sprocket\",\n" + " \"weight\": 5,\n" + " \"functions\": [\n" + " {\n" + @@ -63,7 +64,7 @@ private static void writeLootFile(Path file, String content) { " },\n" + " {\n" + " \"type\": \"item\",\n" + - " \"name\": \"poweradvantage:fluid_pipe\",\n" + + " \"name\": \"basepower:fluid_pipe\",\n" + " \"weight\": 5,\n" + " \"functions\": [\n" + " {\n" + @@ -77,22 +78,22 @@ private static void writeLootFile(Path file, String content) { " },\n" + " {\n" + " \"type\": \"item\",\n" + - " \"name\": \"poweradvantage:fluid_storage_tank\",\n" + + " \"name\": \"basepower:fluid_storage_tank\",\n" + " \"weight\": 3\n" + " },\n" + " {\n" + " \"type\": \"item\",\n" + - " \"name\": \"poweradvantage:fluid_drain\",\n" + + " \"name\": \"basepower:fluid_drain\",\n" + " \"weight\": 2\n" + " },\n" + " {\n" + " \"type\": \"item\",\n" + - " \"name\": \"poweradvantage:fluid_discharge\",\n" + + " \"name\": \"basepower:fluid_discharge\",\n" + " \"weight\": 2\n" + " },\n" + " {\n" + " \"type\": \"item\",\n" + - " \"name\": \"poweradvantage:item_conveyor\",\n" + + " \"name\": \"basepower:item_conveyor\",\n" + " \"weight\": 3,\n" + " \"functions\": [\n" + " {\n" + @@ -108,4 +109,4 @@ private static void writeLootFile(Path file, String content) { " }\n" + " ]\n" + "}\n"; -} \ No newline at end of file +} diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Villages.java b/src/main/java/zone/moddev/mc/basepower/init/Villages.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/init/Villages.java rename to src/main/java/zone/moddev/mc/basepower/init/Villages.java index 2a926dd..ed2b4c6 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/Villages.java +++ b/src/main/java/zone/moddev/mc/basepower/init/Villages.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; import net.minecraft.entity.passive.EntityVillager; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/WorldGen.java b/src/main/java/zone/moddev/mc/basepower/init/WorldGen.java similarity index 85% rename from src/main/java/zone/moddev/mc/poweradvantage/init/WorldGen.java rename to src/main/java/zone/moddev/mc/basepower/init/WorldGen.java index 77cc2cb..e25d91c 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/WorldGen.java +++ b/src/main/java/zone/moddev/mc/basepower/init/WorldGen.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; public abstract class WorldGen { @@ -20,7 +20,7 @@ public static void init() { + " \"dimension\":\"+\",\n" + " \"ores\":[\n" + " {\n" - + " \"blockID\":\"poweradvantage:crude_oil\",\n" + + " \"blockID\":\"basepower:crude_oil\",\n" + " \"size\":64,\n" + " \"variation\":50,\n" + " \"frequency\":0.25,\n" diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/package-info.java b/src/main/java/zone/moddev/mc/basepower/init/package-info.java similarity index 77% rename from src/main/java/zone/moddev/mc/poweradvantage/init/package-info.java rename to src/main/java/zone/moddev/mc/basepower/init/package-info.java index 2711107..28a4285 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/init/package-info.java @@ -2,4 +2,4 @@ This package contains registries for all of the new content added by PowerAdvantage. Use these classes to interact with the items and blocks. */ -package zone.moddev.mc.poweradvantage.init; \ No newline at end of file +package zone.moddev.mc.basepower.init; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/items/RotationTool.java b/src/main/java/zone/moddev/mc/basepower/items/RotationTool.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/items/RotationTool.java rename to src/main/java/zone/moddev/mc/basepower/items/RotationTool.java index 9da1115..265abf8 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/items/RotationTool.java +++ b/src/main/java/zone/moddev/mc/basepower/items/RotationTool.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.items; +package zone.moddev.mc.basepower.items; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/blocks/package-info.java b/src/main/java/zone/moddev/mc/basepower/items/package-info.java similarity index 76% rename from src/main/java/zone/moddev/mc/poweradvantage/blocks/package-info.java rename to src/main/java/zone/moddev/mc/basepower/items/package-info.java index 5af68da..04ef1d7 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/blocks/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/items/package-info.java @@ -3,10 +3,10 @@ This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API. If you are writing an add-on mod, use the code in this package for reference, but you should not depend on it's implementation details as future updates might change them. For a better way to get -PowerAdvantage content, look in the zone.moddev.mc.poweradvantage.init package. +PowerAdvantage content, look in the zone.moddev.mc.basepower.init package.

Because these classes are not part of the API, they are not well documented. They were only meant for the eyes of the mod author(s).

*/ -package zone.moddev.mc.poweradvantage.blocks; \ No newline at end of file +package zone.moddev.mc.basepower.items; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyor.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyor.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyor.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyor.java index 178d63d..c1ef080 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyor.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyor.java @@ -1,7 +1,7 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; import cyano.poweradvantage.api.GUIBlock; -import zone.moddev.mc.poweradvantage.init.ItemGroups; +import zone.moddev.mc.basepower.init.ItemGroups; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyorFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyorFilter.java similarity index 96% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyorFilter.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyorFilter.java index 3ae14e2..30b3aa4 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/BlockConveyorFilter.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/BlockConveyorFilter.java @@ -1,8 +1,8 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; import com.google.common.base.Predicate; import cyano.poweradvantage.api.GUIBlock; -import zone.moddev.mc.poweradvantage.init.ItemGroups; +import zone.moddev.mc.basepower.init.ItemGroups; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityBlockFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityBlockFilter.java similarity index 83% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityBlockFilter.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityBlockFilter.java index 9eded62..8a65770 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityBlockFilter.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityBlockFilter.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyor.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyor.java similarity index 99% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyor.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyor.java index 12ca3c6..45ccf7f 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyor.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyor.java @@ -1,6 +1,6 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; -import zone.moddev.mc.poweradvantage.util.InventoryWrapper; +import zone.moddev.mc.basepower.util.InventoryWrapper; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyorFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyorFilter.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyorFilter.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyorFilter.java index 4874ffa..31cc3ee 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityConveyorFilter.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityConveyorFilter.java @@ -1,6 +1,6 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; -import zone.moddev.mc.poweradvantage.util.InventoryWrapper; +import zone.moddev.mc.basepower.util.InventoryWrapper; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; import net.minecraft.inventory.IInventory; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFoodFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFoodFilter.java similarity index 83% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFoodFilter.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFoodFilter.java index db5eae3..2425df8 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFoodFilter.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFoodFilter.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFuelFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFuelFilter.java similarity index 83% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFuelFilter.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFuelFilter.java index d98a6e8..513b828 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityFuelFilter.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityFuelFilter.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; import net.minecraft.item.ItemStack; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityInventoryFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityInventoryFilter.java similarity index 90% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityInventoryFilter.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityInventoryFilter.java index b0b9c23..6875aa0 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityInventoryFilter.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityInventoryFilter.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; import net.minecraft.item.ItemStack; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOreFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOreFilter.java similarity index 91% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOreFilter.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOreFilter.java index 635f3cd..5573d7f 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOreFilter.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOreFilter.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOverflowFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOverflowFilter.java similarity index 90% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOverflowFilter.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOverflowFilter.java index 47edee6..052ba25 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityOverflowFilter.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityOverflowFilter.java @@ -1,6 +1,6 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; -import zone.moddev.mc.poweradvantage.util.InventoryWrapper; +import zone.moddev.mc.basepower.util.InventoryWrapper; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityPlantFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityPlantFilter.java similarity index 91% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityPlantFilter.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityPlantFilter.java index 59c50fb..6f6f65c 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntityPlantFilter.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntityPlantFilter.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; import net.minecraft.block.Block; import net.minecraft.block.IGrowable; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntitySmeltableFilter.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntitySmeltableFilter.java similarity index 85% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntitySmeltableFilter.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntitySmeltableFilter.java index dd4ea04..e2203d3 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/TileEntitySmeltableFilter.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/TileEntitySmeltableFilter.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/package-info.java b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/package-info.java similarity index 75% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/package-info.java rename to src/main/java/zone/moddev/mc/basepower/machines/conveyors/package-info.java index 23e6fb8..f1881ac 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/conveyors/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/conveyors/package-info.java @@ -3,10 +3,10 @@ This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API. If you are writing an add-on mod, use the code in this package for reference, but you should not depend on it's implementation details as future updates might change them. For a better way to get -PowerAdvantage content, look in the zone.moddev.mc.poweradvantage.init package. +PowerAdvantage content, look in the zone.moddev.mc.basepower.init package.

Because these classes are not part of the API, they are not well documented. They were only meant for the eyes of the mod author(s).

*/ -package zone.moddev.mc.poweradvantage.machines.conveyors; \ No newline at end of file +package zone.moddev.mc.basepower.machines.conveyors; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyBlock.java similarity index 96% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyBlock.java rename to src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyBlock.java index 82e8286..d75ce84 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyBlock.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyBlock.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.creative; +package zone.moddev.mc.basepower.machines.creative; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PoweredEntity; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyTileEntity.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyTileEntity.java rename to src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyTileEntity.java index 3b0d77e..76ad9c4 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/creative/InfiniteEnergyTileEntity.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/creative/InfiniteEnergyTileEntity.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.creative; +package zone.moddev.mc.basepower.machines.creative; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.simple.TileEntitySimplePowerMachine; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeBlock.java similarity index 96% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeBlock.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeBlock.java index 57d81d8..88597ef 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeBlock.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeBlock.java @@ -1,10 +1,10 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PoweredEntity; import cyano.poweradvantage.api.simple.BlockSimpleFluidMachine; import cyano.poweradvantage.api.simple.TileEntitySimplePowerMachine; -import zone.moddev.mc.poweradvantage.init.ItemGroups; +import zone.moddev.mc.basepower.init.ItemGroups; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeTileEntity.java similarity index 99% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeTileEntity.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeTileEntity.java index 2ad5bff..104bea0 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDischargeTileEntity.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDischargeTileEntity.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainBlock.java similarity index 95% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainBlock.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainBlock.java index a04ddc2..e48d49d 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainBlock.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainBlock.java @@ -1,9 +1,9 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PoweredEntity; import cyano.poweradvantage.api.simple.BlockSimpleFluidMachine; -import zone.moddev.mc.poweradvantage.init.ItemGroups; +import zone.moddev.mc.basepower.init.ItemGroups; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainTileEntity.java similarity index 99% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainTileEntity.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainTileEntity.java index 7a4efb5..33d1762 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidDrainTileEntity.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidDrainTileEntity.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidPipeBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidPipeBlock.java similarity index 94% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidPipeBlock.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidPipeBlock.java index 4d98ed1..70c3fde 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/FluidPipeBlock.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidPipeBlock.java @@ -1,7 +1,7 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.simple.BlockSimpleFluidConduit; -import zone.moddev.mc.poweradvantage.init.Blocks; +import zone.moddev.mc.basepower.init.Blocks; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankBlock.java similarity index 96% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankBlock.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankBlock.java index 8a63526..b376e4f 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankBlock.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankBlock.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PoweredEntity; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankTileEntity.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankTileEntity.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankTileEntity.java index f610fe0..e02d8f0 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/MetalTankTileEntity.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/MetalTankTileEntity.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PowerRequest; @@ -12,7 +12,7 @@ public class MetalTankTileEntity extends TileEntitySimpleFluidMachine { public MetalTankTileEntity() { - super(FluidContainerRegistry.BUCKET_VOLUME * 10, "tile.poweradvantage.fluid_metal_tank.name"); + super(FluidContainerRegistry.BUCKET_VOLUME * 10, "tile.basepower.fluid_metal_tank.name"); } diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillBlock.java similarity index 98% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillBlock.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillBlock.java index 6d85976..d4b7921 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillBlock.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillBlock.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PoweredEntity; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillTileEntity.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillTileEntity.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillTileEntity.java index a4cb796..b9a9df0 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StillTileEntity.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StillTileEntity.java @@ -1,10 +1,10 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.fluid.FluidRequest; import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine; -import zone.moddev.mc.poweradvantage.registry.FuelRegistry; -import zone.moddev.mc.poweradvantage.registry.still.recipe.DistillationRecipe; -import zone.moddev.mc.poweradvantage.registry.still.recipe.DistillationRecipeRegistry; +import zone.moddev.mc.basepower.registry.FuelRegistry; +import zone.moddev.mc.basepower.registry.still.recipe.DistillationRecipe; +import zone.moddev.mc.basepower.registry.still.recipe.DistillationRecipeRegistry; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankBlock.java similarity index 94% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankBlock.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankBlock.java index 1f11b5e..528df41 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankBlock.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankBlock.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PoweredEntity; @@ -119,11 +119,11 @@ public void displayInformation(ItemStack stack) { } if (dataTag.hasKey("Volume") && dataTag.hasKey("FluidID")) { float buckets = (float) dataTag.getInteger("Volume") / (float) FluidContainerRegistry.BUCKET_VOLUME; - message = (I18n.translateToLocal("tooltip.poweradvantage.buckets_of") + message = (I18n.translateToLocal("tooltip.basepower.buckets_of") .replace("%x", String.valueOf(buckets)) .replace("%y", FluidRegistry.getFluid(dataTag.getString("FluidID")).getName())); } else { - message = (I18n.translateToLocal("tooltip.poweradvantage.empty")); + message = (I18n.translateToLocal("tooltip.basepower.empty")); } NBTTagCompound displayTag; @@ -142,7 +142,7 @@ public void displayInformation(ItemStack stack) { } loreTag.appendTag(new NBTTagString(message)); if (!stack.hasTagCompound()) { - stack.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(dataTag); } } -} \ No newline at end of file +} diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankTileEntity.java similarity index 95% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankTileEntity.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankTileEntity.java index 57e7ce6..254c812 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/StorageTankTileEntity.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankTileEntity.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; +package zone.moddev.mc.basepower.machines.fluidmachines; import cyano.poweradvantage.api.PowerRequest; import cyano.poweradvantage.api.fluid.FluidRequest; @@ -12,7 +12,7 @@ public class StorageTankTileEntity extends TileEntitySimpleFluidMachine { public StorageTankTileEntity() { - super(FluidContainerRegistry.BUCKET_VOLUME * 4, "tile.poweradvantage.fluid_storage_tank.name"); + super(FluidContainerRegistry.BUCKET_VOLUME * 4, "tile.basepower.fluid_storage_tank.name"); } /** diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java similarity index 92% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java index 90db281..1eb0cc5 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeBlock.java @@ -1,8 +1,8 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines.modsupport; +package zone.moddev.mc.basepower.machines.fluidmachines.modsupport; import cyano.poweradvantage.api.ConduitType; -import zone.moddev.mc.poweradvantage.init.Blocks; -import zone.moddev.mc.poweradvantage.machines.fluidmachines.FluidPipeBlock; +import zone.moddev.mc.basepower.init.Blocks; +import zone.moddev.mc.basepower.machines.fluidmachines.FluidPipeBlock; import net.minecraft.block.Block; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java similarity index 96% rename from src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java rename to src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java index bec3c8a..7758f5e 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/modsupport/TerminalFluidPipeTileEntity.java @@ -1,12 +1,12 @@ -package zone.moddev.mc.poweradvantage.machines.fluidmachines.modsupport; +package zone.moddev.mc.basepower.machines.fluidmachines.modsupport; import cyano.poweradvantage.api.ConduitType; import cyano.poweradvantage.api.PowerConnectorContext; import cyano.poweradvantage.api.PowerRequest; import cyano.poweradvantage.api.PoweredEntity; import cyano.poweradvantage.api.fluid.FluidRequest; -import zone.moddev.mc.poweradvantage.conduitnetwork.ConduitRegistry; -import zone.moddev.mc.poweradvantage.init.Fluids; +import zone.moddev.mc.basepower.conduitnetwork.ConduitRegistry; +import zone.moddev.mc.basepower.init.Fluids; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; diff --git a/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/package-info.java b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/package-info.java new file mode 100644 index 0000000..58c6c73 --- /dev/null +++ b/src/main/java/zone/moddev/mc/basepower/machines/fluidmachines/package-info.java @@ -0,0 +1,12 @@ +/** +

+This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API. +If you are writing an add-on mod, use the code in this package for reference, but you should not +depend on it's implementation details as future updates might change them. For a better way to get +PowerAdvantage content, look in the zone.moddev.mc.basepower.init package. +

+Because these classes are not part of the API, they are not well documented. They were only meant +for the eyes of the mod author(s). +

+*/ +package zone.moddev.mc.basepower.machines.fluidmachines; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/math/BlockPos4D.java b/src/main/java/zone/moddev/mc/basepower/math/BlockPos4D.java similarity index 99% rename from src/main/java/zone/moddev/mc/poweradvantage/math/BlockPos4D.java rename to src/main/java/zone/moddev/mc/basepower/math/BlockPos4D.java index 034ad95..3d8b797 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/math/BlockPos4D.java +++ b/src/main/java/zone/moddev/mc/basepower/math/BlockPos4D.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.math; +package zone.moddev.mc.basepower.math; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagIntArray; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/math/Integer2D.java b/src/main/java/zone/moddev/mc/basepower/math/Integer2D.java similarity index 93% rename from src/main/java/zone/moddev/mc/poweradvantage/math/Integer2D.java rename to src/main/java/zone/moddev/mc/basepower/math/Integer2D.java index 71dd3ab..c38d137 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/math/Integer2D.java +++ b/src/main/java/zone/moddev/mc/basepower/math/Integer2D.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.math; +package zone.moddev.mc.basepower.math; /** * This class is used to store 2D integer coordinates diff --git a/src/main/java/zone/moddev/mc/poweradvantage/math/package-info.java b/src/main/java/zone/moddev/mc/basepower/math/package-info.java similarity index 55% rename from src/main/java/zone/moddev/mc/poweradvantage/math/package-info.java rename to src/main/java/zone/moddev/mc/basepower/math/package-info.java index 72c1ee2..2ec83a0 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/math/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/math/package-info.java @@ -3,4 +3,4 @@ This package contains helper classes.

*/ -package zone.moddev.mc.poweradvantage.math; \ No newline at end of file +package zone.moddev.mc.basepower.math; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/package-info.java b/src/main/java/zone/moddev/mc/basepower/package-info.java similarity index 81% rename from src/main/java/zone/moddev/mc/poweradvantage/package-info.java rename to src/main/java/zone/moddev/mc/basepower/package-info.java index b594f49..e4cdd20 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/package-info.java @@ -2,4 +2,4 @@ This package contains the main mod class. If you are making an add-on mod, you probably want to use classes from the cyano.poweradvantage.api.simple package */ -package zone.moddev.mc.poweradvantage; \ No newline at end of file +package zone.moddev.mc.basepower; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/FuelRegistry.java b/src/main/java/zone/moddev/mc/basepower/registry/FuelRegistry.java similarity index 98% rename from src/main/java/zone/moddev/mc/poweradvantage/registry/FuelRegistry.java rename to src/main/java/zone/moddev/mc/basepower/registry/FuelRegistry.java index 5c33b28..d93cbbb 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/registry/FuelRegistry.java +++ b/src/main/java/zone/moddev/mc/basepower/registry/FuelRegistry.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.registry; +package zone.moddev.mc.basepower.registry; import net.minecraft.block.Block; import net.minecraft.item.Item; @@ -13,7 +13,7 @@ /** * The fuel registry keeps track of the cooking time for new burnables added by PowerAdvantage. The - * actual registration of these burnables occurs in zone.moddev.mc.poweradvantage.init.Fuels + * actual registration of these burnables occurs in zone.moddev.mc.basepower.init.Fuels * @author DrCyano * */ diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/MachineGUIRegistry.java b/src/main/java/zone/moddev/mc/basepower/registry/MachineGUIRegistry.java similarity index 98% rename from src/main/java/zone/moddev/mc/poweradvantage/registry/MachineGUIRegistry.java rename to src/main/java/zone/moddev/mc/basepower/registry/MachineGUIRegistry.java index 5e27461..39d8181 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/registry/MachineGUIRegistry.java +++ b/src/main/java/zone/moddev/mc/basepower/registry/MachineGUIRegistry.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.registry; +package zone.moddev.mc.basepower.registry; import com.mcmoddev.poweradvantage.registry.ITileEntityGUI; import net.minecraft.block.Block; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/package-info.java b/src/main/java/zone/moddev/mc/basepower/registry/package-info.java similarity index 67% rename from src/main/java/zone/moddev/mc/poweradvantage/registry/package-info.java rename to src/main/java/zone/moddev/mc/basepower/registry/package-info.java index d71055e..d22177c 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/registry/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/registry/package-info.java @@ -2,4 +2,4 @@ This package contains registry classes for registering content related to PowerAdvantage. */ -package zone.moddev.mc.poweradvantage.registry; \ No newline at end of file +package zone.moddev.mc.basepower.registry; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipe.java b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipe.java similarity index 98% rename from src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipe.java rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipe.java index ff05f5d..3ff6029 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipe.java +++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipe.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.registry.still.recipe; +package zone.moddev.mc.basepower.registry.still.recipe; import java.util.Collection; import java.util.LinkedList; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipeRegistry.java b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipeRegistry.java similarity index 98% rename from src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipeRegistry.java rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipeRegistry.java index 7ba51d7..8c9d572 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/DistillationRecipeRegistry.java +++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/DistillationRecipeRegistry.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.registry.still.recipe; +package zone.moddev.mc.basepower.registry.still.recipe; import java.util.ArrayList; import java.util.HashMap; @@ -7,7 +7,7 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import zone.moddev.mc.poweradvantage.PowerAdvantage; +import zone.moddev.mc.basepower.PowerAdvantage; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/ExplicitFluidReference.java b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/ExplicitFluidReference.java similarity index 96% rename from src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/ExplicitFluidReference.java rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/ExplicitFluidReference.java index 0f1884d..fc1a706 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/ExplicitFluidReference.java +++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/ExplicitFluidReference.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.registry.still.recipe; +package zone.moddev.mc.basepower.registry.still.recipe; import net.minecraftforge.fluids.Fluid; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/FluidReference.java b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/FluidReference.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/FluidReference.java rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/FluidReference.java index 76d58c7..e5ef703 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/FluidReference.java +++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/FluidReference.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.registry.still.recipe; +package zone.moddev.mc.basepower.registry.still.recipe; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/RegistryNameFluidReference.java b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/RegistryNameFluidReference.java similarity index 96% rename from src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/RegistryNameFluidReference.java rename to src/main/java/zone/moddev/mc/basepower/registry/still/recipe/RegistryNameFluidReference.java index 3f79a4d..afb9582 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/registry/still/recipe/RegistryNameFluidReference.java +++ b/src/main/java/zone/moddev/mc/basepower/registry/still/recipe/RegistryNameFluidReference.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.registry.still.recipe; +package zone.moddev.mc.basepower.registry.still.recipe; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/HashCodeHelper.java b/src/main/java/zone/moddev/mc/basepower/util/HashCodeHelper.java similarity index 96% rename from src/main/java/zone/moddev/mc/poweradvantage/util/HashCodeHelper.java rename to src/main/java/zone/moddev/mc/basepower/util/HashCodeHelper.java index efed636..c7b3a12 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/util/HashCodeHelper.java +++ b/src/main/java/zone/moddev/mc/basepower/util/HashCodeHelper.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.util; +package zone.moddev.mc.basepower.util; public abstract class HashCodeHelper { diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/InventoryWrapper.java b/src/main/java/zone/moddev/mc/basepower/util/InventoryWrapper.java similarity index 99% rename from src/main/java/zone/moddev/mc/poweradvantage/util/InventoryWrapper.java rename to src/main/java/zone/moddev/mc/basepower/util/InventoryWrapper.java index 3e1ab8a..df56f7c 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/util/InventoryWrapper.java +++ b/src/main/java/zone/moddev/mc/basepower/util/InventoryWrapper.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.util; +package zone.moddev.mc.basepower.util; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/PowerHelper.java b/src/main/java/zone/moddev/mc/basepower/util/PowerHelper.java similarity index 94% rename from src/main/java/zone/moddev/mc/poweradvantage/util/PowerHelper.java rename to src/main/java/zone/moddev/mc/basepower/util/PowerHelper.java index 726c661..fe3c9a7 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/util/PowerHelper.java +++ b/src/main/java/zone/moddev/mc/basepower/util/PowerHelper.java @@ -1,7 +1,7 @@ -package zone.moddev.mc.poweradvantage.util; +package zone.moddev.mc.basepower.util; import cofh.api.energy.IEnergyReceiver; -import zone.moddev.mc.poweradvantage.PowerAdvantage; +import zone.moddev.mc.basepower.PowerAdvantage; import cyano.poweradvantage.api.ITypedConduit; import cyano.poweradvantage.api.PowerConnectorContext; import net.minecraft.block.ITileEntityProvider; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleHashMap.java b/src/main/java/zone/moddev/mc/basepower/util/ReversibleHashMap.java similarity index 97% rename from src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleHashMap.java rename to src/main/java/zone/moddev/mc/basepower/util/ReversibleHashMap.java index 5e386d1..770ff7d 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleHashMap.java +++ b/src/main/java/zone/moddev/mc/basepower/util/ReversibleHashMap.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.util; +package zone.moddev.mc.basepower.util; import java.util.Collection; import java.util.Map; diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleMap.java b/src/main/java/zone/moddev/mc/basepower/util/ReversibleMap.java similarity index 81% rename from src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleMap.java rename to src/main/java/zone/moddev/mc/basepower/util/ReversibleMap.java index d8b39b0..fce0f4c 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/util/ReversibleMap.java +++ b/src/main/java/zone/moddev/mc/basepower/util/ReversibleMap.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.util; +package zone.moddev.mc.basepower.util; public interface ReversibleMap extends java.util.Map { diff --git a/src/main/java/zone/moddev/mc/poweradvantage/util/package-info.java b/src/main/java/zone/moddev/mc/basepower/util/package-info.java similarity index 55% rename from src/main/java/zone/moddev/mc/poweradvantage/util/package-info.java rename to src/main/java/zone/moddev/mc/basepower/util/package-info.java index 8346da0..e2fb4a0 100644 --- a/src/main/java/zone/moddev/mc/poweradvantage/util/package-info.java +++ b/src/main/java/zone/moddev/mc/basepower/util/package-info.java @@ -3,4 +3,4 @@ This package contains helper classes.

*/ -package zone.moddev.mc.poweradvantage.util; \ No newline at end of file +package zone.moddev.mc.basepower.util; \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/init/Entities.java b/src/main/java/zone/moddev/mc/poweradvantage/init/Entities.java deleted file mode 100644 index 0dc2901..0000000 --- a/src/main/java/zone/moddev/mc/poweradvantage/init/Entities.java +++ /dev/null @@ -1,40 +0,0 @@ -package zone.moddev.mc.poweradvantage.init; - -import net.minecraftforge.fml.common.registry.GameRegistry; -import zone.moddev.mc.poweradvantage.PowerAdvantage; -import zone.moddev.mc.poweradvantage.machines.conveyors.*; -import zone.moddev.mc.poweradvantage.machines.creative.InfiniteEnergyTileEntity; -import zone.moddev.mc.poweradvantage.machines.fluidmachines.*; -import zone.moddev.mc.poweradvantage.machines.fluidmachines.modsupport.TerminalFluidPipeTileEntity; - -public abstract class Entities { - - - private static boolean initDone = false; - - public static void init() { - if (initDone) return; - - Blocks.init(); - - GameRegistry.registerTileEntity(TerminalFluidPipeTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "pipe_terminal"); - GameRegistry.registerTileEntity(FluidDrainTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_drain"); - GameRegistry.registerTileEntity(FluidDischargeTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_discharge"); - GameRegistry.registerTileEntity(StorageTankTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_storage_tank"); - GameRegistry.registerTileEntity(MetalTankTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "fluid_metal_tank"); - GameRegistry.registerTileEntity(StillTileEntity.class, PowerAdvantage.MODID + ".tileentity." + "still"); - GameRegistry.registerTileEntity(TileEntityConveyor.class, PowerAdvantage.MODID + "." + "item_conveyor"); - GameRegistry.registerTileEntity(TileEntityBlockFilter.class, PowerAdvantage.MODID + "." + "item_filter_block"); - GameRegistry.registerTileEntity(TileEntityFoodFilter.class, PowerAdvantage.MODID + "." + "item_filter_food"); - GameRegistry.registerTileEntity(TileEntityFuelFilter.class, PowerAdvantage.MODID + "." + "item_filter_fuel"); - GameRegistry.registerTileEntity(TileEntityInventoryFilter.class, PowerAdvantage.MODID + "." + "item_filter_inventory"); - GameRegistry.registerTileEntity(TileEntityOreFilter.class, PowerAdvantage.MODID + "." + "item_filter_ore"); - GameRegistry.registerTileEntity(TileEntityPlantFilter.class, PowerAdvantage.MODID + "." + "item_filter_plant"); - GameRegistry.registerTileEntity(TileEntitySmeltableFilter.class, PowerAdvantage.MODID + "." + "item_filter_smelt"); - GameRegistry.registerTileEntity(TileEntityOverflowFilter.class, PowerAdvantage.MODID + "." + "item_filter_overflow"); - - GameRegistry.registerTileEntity(InfiniteEnergyTileEntity.class, PowerAdvantage.MODID + "." + "infinite_energy_source"); - - initDone = true; - } -} \ No newline at end of file diff --git a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/package-info.java b/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/package-info.java deleted file mode 100644 index 7bde542..0000000 --- a/src/main/java/zone/moddev/mc/poweradvantage/machines/fluidmachines/package-info.java +++ /dev/null @@ -1,12 +0,0 @@ -/** -

-This package contains content that is added by PowerAdvantage implementing the PowerAdvantage API. -If you are writing an add-on mod, use the code in this package for reference, but you should not -depend on it's implementation details as future updates might change them. For a better way to get -PowerAdvantage content, look in the zone.moddev.mc.poweradvantage.init package. -

-Because these classes are not part of the API, they are not well documented. They were only meant -for the eyes of the mod author(s). -

-*/ -package zone.moddev.mc.poweradvantage.machines.fluidmachines; \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/converter_rf_electricity.json b/src/main/resources/assets/basepower/blockstates/converter_rf_electricity.json new file mode 100644 index 0000000..c1651bf --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/converter_rf_electricity.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:converter_rf_electricity", "y": 90 }, + "facing=north": { "model": "basepower:converter_rf_electricity" }, + "facing=south": { "model": "basepower:converter_rf_electricity", "y": 180 }, + "facing=west": { "model": "basepower:converter_rf_electricity", "y": 270 } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/converter_rf_quantum.json b/src/main/resources/assets/basepower/blockstates/converter_rf_quantum.json new file mode 100644 index 0000000..ee86021 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/converter_rf_quantum.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:converter_rf_quantum", "y": 90 }, + "facing=north": { "model": "basepower:converter_rf_quantum" }, + "facing=south": { "model": "basepower:converter_rf_quantum", "y": 180 }, + "facing=west": { "model": "basepower:converter_rf_quantum", "y": 270 } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/converter_rf_steam.json b/src/main/resources/assets/basepower/blockstates/converter_rf_steam.json new file mode 100644 index 0000000..d27391c --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/converter_rf_steam.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:converter_rf_steam", "y": 90 }, + "facing=north": { "model": "basepower:converter_rf_steam" }, + "facing=south": { "model": "basepower:converter_rf_steam", "y": 180 }, + "facing=west": { "model": "basepower:converter_rf_steam", "y": 270 } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/converter_tr_electricity.json b/src/main/resources/assets/basepower/blockstates/converter_tr_electricity.json new file mode 100644 index 0000000..499b875 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/converter_tr_electricity.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:converter_tr_electricity", "y": 90 }, + "facing=north": { "model": "basepower:converter_tr_electricity" }, + "facing=south": { "model": "basepower:converter_tr_electricity", "y": 180 }, + "facing=west": { "model": "basepower:converter_tr_electricity", "y": 270 } + } +} diff --git a/src/main/resources/assets/poweradvantage/blockstates/crude_oil.json b/src/main/resources/assets/basepower/blockstates/crude_oil.json similarity index 100% rename from src/main/resources/assets/poweradvantage/blockstates/crude_oil.json rename to src/main/resources/assets/basepower/blockstates/crude_oil.json diff --git a/src/main/resources/assets/basepower/blockstates/fluid_discharge.json b/src/main/resources/assets/basepower/blockstates/fluid_discharge.json new file mode 100644 index 0000000..e8b811c --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/fluid_discharge.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:fluid_discharge", "y": 90 }, + "facing=north": { "model": "basepower:fluid_discharge" }, + "facing=south": { "model": "basepower:fluid_discharge", "y": 180 }, + "facing=west": { "model": "basepower:fluid_discharge", "y": 270 } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/fluid_drain.json b/src/main/resources/assets/basepower/blockstates/fluid_drain.json new file mode 100644 index 0000000..7dc40c7 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/fluid_drain.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:fluid_drain", "y": 90 }, + "facing=north": { "model": "basepower:fluid_drain" }, + "facing=south": { "model": "basepower:fluid_drain", "y": 180 }, + "facing=west": { "model": "basepower:fluid_drain", "y": 270 } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/fluid_metal_tank.json b/src/main/resources/assets/basepower/blockstates/fluid_metal_tank.json new file mode 100644 index 0000000..11898d2 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/fluid_metal_tank.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:fluid_metal_tank", "y": 90, "uvlock": true }, + "facing=north": { "model": "basepower:fluid_metal_tank", "uvlock": true }, + "facing=south": { "model": "basepower:fluid_metal_tank", "y": 180, "uvlock": true }, + "facing=west": { "model": "basepower:fluid_metal_tank", "y": 270, "uvlock": true } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/fluid_pipe.json b/src/main/resources/assets/basepower/blockstates/fluid_pipe.json new file mode 100644 index 0000000..846b1b7 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/fluid_pipe.json @@ -0,0 +1,70 @@ +{ + "__comment": "blockstate parameters MUST be in alphabetical order!", + "variants": { + "down=false,east=false,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false }, + "down=true,east=false,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 90, "y": 0, "uvlock": false }, + "down=false,east=true,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=false,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=false,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 180, "uvlock": false }, + "down=false,east=false,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_n", "x": 270, "y": 0, "uvlock": false }, + "down=false,east=false,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 270, "uvlock": false }, + "down=true,east=true,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 180, "uvlock": false }, + "down=true,east=false,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 90, "uvlock": false }, + "down=true,east=false,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 270, "uvlock": false }, + "down=true,east=false,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_ns", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=false,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 0, "uvlock": false }, + "down=false,east=true,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=true,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 180, "uvlock": false }, + "down=false,east=true,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 180, "uvlock": false }, + "down=false,east=true,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_ns", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=false,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_ns", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=false,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 90, "uvlock": false }, + "down=false,east=false,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=false,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 270, "uvlock": false }, + "down=false,east=false,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 270, "uvlock": false }, + "down=false,east=false,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 0, "uvlock": false }, + "down=true,east=true,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 90, "uvlock": false }, + "down=true,east=true,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 180, "uvlock": false }, + "down=true,east=true,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 90, "uvlock": false }, + "down=true,east=true,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 90, "y": 90, "uvlock": false }, + "down=true,east=false,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=false,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 0, "uvlock": false }, + "down=true,east=false,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=false,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 180, "uvlock": false }, + "down=true,east=false,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 270, "uvlock": false }, + "down=true,east=false,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 270, "uvlock": false }, + "down=false,east=true,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 180, "uvlock": false }, + "down=false,east=true,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=true,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=true,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 180, "uvlock": false }, + "down=false,east=true,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 270, "uvlock": false }, + "down=false,east=true,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 270, "y": 90, "uvlock": false }, + "down=false,east=false,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 270, "y": 0, "uvlock": false }, + "down=false,east=false,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=false,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=false,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 270, "uvlock": false }, + "down=true,east=true,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 180, "uvlock": false }, + "down=true,east=true,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 90, "uvlock": false }, + "down=true,east=true,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 90, "uvlock": false }, + "down=true,east=true,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 180, "uvlock": false }, + "down=true,east=true,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 270, "uvlock": false }, + "down=true,east=true,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_ensw", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=false,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_ensw", "x": 90, "y": 90, "uvlock": false }, + "down=true,east=false,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 0, "uvlock": false }, + "down=true,east=false,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=false,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 270, "uvlock": false }, + "down=false,east=true,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 180, "uvlock": false }, + "down=false,east=true,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=true,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=true,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 270, "uvlock": false }, + "down=false,east=false,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 0, "uvlock": false }, + "down=true,east=true,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 270, "uvlock": false }, + "down=true,east=true,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 270, "y": 0, "uvlock": false }, + "down=true,east=true,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 180, "uvlock": false }, + "down=true,east=true,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 0, "uvlock": false }, + "down=true,east=false,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=true,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=true,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_densuw", "x": 0, "y": 0, "uvlock": false } + + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/fluid_pipe_terminal.json b/src/main/resources/assets/basepower/blockstates/fluid_pipe_terminal.json new file mode 100644 index 0000000..51f7d5d --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/fluid_pipe_terminal.json @@ -0,0 +1,70 @@ +{ + "__comment": "blockstate parameters MUST be in alphabetical order!", + "variants": { + "down=false,east=false,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_0", "x": 0, "y": 0, "uvlock": false }, + "down=true,east=false,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 90, "y": 0, "uvlock": false }, + "down=false,east=true,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=false,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=false,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 180, "uvlock": false }, + "down=false,east=false,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_n", "x": 270, "y": 0, "uvlock": false }, + "down=false,east=false,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_n", "x": 0, "y": 270, "uvlock": false }, + "down=true,east=true,north=false,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 180, "uvlock": false }, + "down=true,east=false,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 90, "uvlock": false }, + "down=true,east=false,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 270, "uvlock": false }, + "down=true,east=false,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_ns", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=false,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 90, "y": 0, "uvlock": false }, + "down=false,east=true,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=true,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 180, "uvlock": false }, + "down=false,east=true,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 180, "uvlock": false }, + "down=false,east=true,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_ns", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=false,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_ns", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=false,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 90, "uvlock": false }, + "down=false,east=false,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=false,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 270, "uvlock": false }, + "down=false,east=false,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nw", "x": 0, "y": 270, "uvlock": false }, + "down=false,east=false,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nw", "x": 270, "y": 0, "uvlock": false }, + "down=true,east=true,north=true,south=false,up=false,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 90, "uvlock": false }, + "down=true,east=true,north=false,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 180, "uvlock": false }, + "down=true,east=true,north=false,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 90, "uvlock": false }, + "down=true,east=true,north=false,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 90, "y": 90, "uvlock": false }, + "down=true,east=false,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=false,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 0, "uvlock": false }, + "down=true,east=false,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=false,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 180, "uvlock": false }, + "down=true,east=false,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 90, "y": 270, "uvlock": false }, + "down=true,east=false,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 0, "y": 270, "uvlock": false }, + "down=false,east=true,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 180, "uvlock": false }, + "down=false,east=true,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=true,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=true,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 180, "uvlock": false }, + "down=false,east=true,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 270, "uvlock": false }, + "down=false,east=true,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_dnu", "x": 270, "y": 90, "uvlock": false }, + "down=false,east=false,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_dnu", "x": 270, "y": 0, "uvlock": false }, + "down=false,east=false,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsw", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=false,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=false,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nuw", "x": 0, "y": 270, "uvlock": false }, + "down=true,east=true,north=true,south=true,up=false,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 180, "uvlock": false }, + "down=true,east=true,north=true,south=false,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 90, "uvlock": false }, + "down=true,east=true,north=true,south=false,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 90, "uvlock": false }, + "down=true,east=true,north=false,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 180, "uvlock": false }, + "down=true,east=true,north=false,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 270, "uvlock": false }, + "down=true,east=true,north=false,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_ensw", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=false,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_ensw", "x": 90, "y": 90, "uvlock": false }, + "down=true,east=false,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 180, "y": 0, "uvlock": false }, + "down=true,east=false,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=false,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 90, "y": 270, "uvlock": false }, + "down=false,east=true,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 180, "uvlock": false }, + "down=false,east=true,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false }, + "down=false,east=true,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=true,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 270, "uvlock": false }, + "down=false,east=false,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_nsuw", "x": 0, "y": 0, "uvlock": false }, + "down=true,east=true,north=true,south=true,up=true,west=false": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 270, "uvlock": false }, + "down=true,east=true,north=true,south=true,up=false,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 270, "y": 0, "uvlock": false }, + "down=true,east=true,north=true,south=false,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 180, "uvlock": false }, + "down=true,east=true,north=false,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 0, "uvlock": false }, + "down=true,east=false,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 0, "y": 90, "uvlock": false }, + "down=false,east=true,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_desuw", "x": 90, "y": 0, "uvlock": false }, + "down=true,east=true,north=true,south=true,up=true,west=true": { "model": "basepower:fluid_pipe_densuw", "x": 0, "y": 0, "uvlock": false } + + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/fluid_storage_tank.json b/src/main/resources/assets/basepower/blockstates/fluid_storage_tank.json new file mode 100644 index 0000000..8de4840 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/fluid_storage_tank.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:fluid_storage_tank", "y": 90 }, + "facing=north": { "model": "basepower:fluid_storage_tank" }, + "facing=south": { "model": "basepower:fluid_storage_tank", "y": 180 }, + "facing=west": { "model": "basepower:fluid_storage_tank", "y": 270 } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/fluid_switch.json b/src/main/resources/assets/basepower/blockstates/fluid_switch.json new file mode 100644 index 0000000..c716e08 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/fluid_switch.json @@ -0,0 +1,6 @@ +{ + "variants": { + "active=false": { "model": "basepower:fluid_switch_off"}, + "active=true": { "model": "basepower:fluid_switch_on"} + } +} diff --git a/src/main/resources/assets/basepower/blockstates/infinite_electricity.json b/src/main/resources/assets/basepower/blockstates/infinite_electricity.json new file mode 100644 index 0000000..f2d91b3 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/infinite_electricity.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:infinite_electricity", "y": 90 }, + "facing=north": { "model": "basepower:infinite_electricity" }, + "facing=south": { "model": "basepower:infinite_electricity", "y": 180 }, + "facing=west": { "model": "basepower:infinite_electricity", "y": 270 } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/infinite_quantum.json b/src/main/resources/assets/basepower/blockstates/infinite_quantum.json new file mode 100644 index 0000000..4c349cc --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/infinite_quantum.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:infinite_quantum", "y": 90 }, + "facing=north": { "model": "basepower:infinite_quantum" }, + "facing=south": { "model": "basepower:infinite_quantum", "y": 180 }, + "facing=west": { "model": "basepower:infinite_quantum", "y": 270 } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/infinite_steam.json b/src/main/resources/assets/basepower/blockstates/infinite_steam.json new file mode 100644 index 0000000..2a5080a --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/infinite_steam.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "basepower:infinite_steam", "y": 90 }, + "facing=north": { "model": "basepower:infinite_steam" }, + "facing=south": { "model": "basepower:infinite_steam", "y": 180 }, + "facing=west": { "model": "basepower:infinite_steam", "y": 270 } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/item_conveyor.json b/src/main/resources/assets/basepower/blockstates/item_conveyor.json new file mode 100644 index 0000000..f192d11 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/item_conveyor.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=down": { "model": "basepower:item_conveyor", "x": 90 }, + "facing=up": { "model": "basepower:item_conveyor", "x": 270 }, + "facing=north": { "model": "basepower:item_conveyor" }, + "facing=south": { "model": "basepower:item_conveyor", "y": 180 }, + "facing=west": { "model": "basepower:item_conveyor", "y": 270 }, + "facing=east": { "model": "basepower:item_conveyor", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_block.json b/src/main/resources/assets/basepower/blockstates/item_filter_block.json new file mode 100644 index 0000000..286caf4 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/item_filter_block.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "basepower:item_filter_block" }, + "facing=south": { "model": "basepower:item_filter_block", "y": 180 }, + "facing=west": { "model": "basepower:item_filter_block", "y": 270 }, + "facing=east": { "model": "basepower:item_filter_block", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_food.json b/src/main/resources/assets/basepower/blockstates/item_filter_food.json new file mode 100644 index 0000000..8b6be87 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/item_filter_food.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "basepower:item_filter_food" }, + "facing=south": { "model": "basepower:item_filter_food", "y": 180 }, + "facing=west": { "model": "basepower:item_filter_food", "y": 270 }, + "facing=east": { "model": "basepower:item_filter_food", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_fuel.json b/src/main/resources/assets/basepower/blockstates/item_filter_fuel.json new file mode 100644 index 0000000..c73e9e6 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/item_filter_fuel.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "basepower:item_filter_fuel" }, + "facing=south": { "model": "basepower:item_filter_fuel", "y": 180 }, + "facing=west": { "model": "basepower:item_filter_fuel", "y": 270 }, + "facing=east": { "model": "basepower:item_filter_fuel", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_inventory.json b/src/main/resources/assets/basepower/blockstates/item_filter_inventory.json new file mode 100644 index 0000000..d446b80 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/item_filter_inventory.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "basepower:item_filter_inventory" }, + "facing=south": { "model": "basepower:item_filter_inventory", "y": 180 }, + "facing=west": { "model": "basepower:item_filter_inventory", "y": 270 }, + "facing=east": { "model": "basepower:item_filter_inventory", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_ore.json b/src/main/resources/assets/basepower/blockstates/item_filter_ore.json new file mode 100644 index 0000000..48007b4 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/item_filter_ore.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "basepower:item_filter_ore" }, + "facing=south": { "model": "basepower:item_filter_ore", "y": 180 }, + "facing=west": { "model": "basepower:item_filter_ore", "y": 270 }, + "facing=east": { "model": "basepower:item_filter_ore", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_overflow.json b/src/main/resources/assets/basepower/blockstates/item_filter_overflow.json new file mode 100644 index 0000000..3e7aaa3 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/item_filter_overflow.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "basepower:item_filter_overflow" }, + "facing=south": { "model": "basepower:item_filter_overflow", "y": 180 }, + "facing=west": { "model": "basepower:item_filter_overflow", "y": 270 }, + "facing=east": { "model": "basepower:item_filter_overflow", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_plant.json b/src/main/resources/assets/basepower/blockstates/item_filter_plant.json new file mode 100644 index 0000000..b1a03d5 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/item_filter_plant.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "basepower:item_filter_plant" }, + "facing=south": { "model": "basepower:item_filter_plant", "y": 180 }, + "facing=west": { "model": "basepower:item_filter_plant", "y": 270 }, + "facing=east": { "model": "basepower:item_filter_plant", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/blockstates/item_filter_smelt.json b/src/main/resources/assets/basepower/blockstates/item_filter_smelt.json new file mode 100644 index 0000000..9a740fb --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/item_filter_smelt.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "basepower:item_filter_smelt" }, + "facing=south": { "model": "basepower:item_filter_smelt", "y": 180 }, + "facing=west": { "model": "basepower:item_filter_smelt", "y": 270 }, + "facing=east": { "model": "basepower:item_filter_smelt", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/refined_oil.json b/src/main/resources/assets/basepower/blockstates/refined_oil.json similarity index 100% rename from src/main/resources/assets/poweradvantage/blockstates/refined_oil.json rename to src/main/resources/assets/basepower/blockstates/refined_oil.json diff --git a/src/main/resources/assets/basepower/blockstates/steel_frame.json b/src/main/resources/assets/basepower/blockstates/steel_frame.json new file mode 100644 index 0000000..7b402a8 --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/steel_frame.json @@ -0,0 +1,5 @@ +{ + "variants": { + "normal": { "model": "basepower:steel_frame" } + } +} diff --git a/src/main/resources/assets/basepower/blockstates/still.json b/src/main/resources/assets/basepower/blockstates/still.json new file mode 100644 index 0000000..4856ead --- /dev/null +++ b/src/main/resources/assets/basepower/blockstates/still.json @@ -0,0 +1,12 @@ +{ + "variants": { + "active=false,facing=east": { "model": "basepower:still_off", "y": 90 }, + "active=false,facing=north": { "model": "basepower:still_off"}, + "active=false,facing=south": { "model": "basepower:still_off", "y": 180}, + "active=false,facing=west": { "model": "basepower:still_off", "y": 270}, + "active=true,facing=east": { "model": "basepower:still_on", "y": 90 }, + "active=true,facing=north": { "model": "basepower:still_on"}, + "active=true,facing=south": { "model": "basepower:still_on", "y": 180}, + "active=true,facing=west": { "model": "basepower:still_on", "y": 270} + } +} diff --git a/src/main/resources/assets/basepower/lang/de_DE.lang b/src/main/resources/assets/basepower/lang/de_DE.lang new file mode 100644 index 0000000..beab6a8 --- /dev/null +++ b/src/main/resources/assets/basepower/lang/de_DE.lang @@ -0,0 +1,55 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Große Ofen (formlos) +nei.basepower.recipehandler.shapedfurnace.name=Große Ofen (geformt) + +tooltip.basepower.empty=Leer +tooltip.basepower.buckets_of=%x Eimer %y + +itemGroup.basepower=Leistungsvorteil + +tile.basepower.fluid_drain.name=Ablauf +tile.basepower.fluid_discharge.name=Austragsrost +tile.basepower.fluid_storage_tank.name=Lagertank +item.basepower.fluid_storage_tank_item.name=Speicher +tile.basepower.fluid_pipe.name=Rohr + +tile.basepower.item_conveyor.name=Förderer +tile.basepower.item_filter_block.name=Block Auswahl Förder +tile.basepower.item_filter_food.name=Lebensmittel Auswahl Förder +tile.basepower.item_filter_fuel.name=Brennstoff Auswahl Förder +tile.basepower.item_filter_inventory.name=Anpassbare Auswahl Förder +tile.basepower.item_filter_ore.name=Erz Auswahl Förder +tile.basepower.item_filter_plant.name=Pflanze Auswahl Förder +tile.basepower.item_filter_smelt.name=Kochbare Auswahl Förder +tile.basepower.item_filter_overflow.name=Überlauf Auswahl Förder +tile.basepower.steel_frame.name=Stahlrahmen + + +item.basepower.starch.name=Kartoffelstärke +item.basepower.bioplastic_ingot.name=Biokunststoff-Barren +item.basepower.sprocket.name=Kettenrad + + +tile.basepower.fluid_metal_tank.name=Metall-Lagertank +item.basepower.rotator_tool.name=Drehwerkzeug + +tile.basepower.infinite_steam.name=Unendlichen Dampfkraft +tile.basepower.infinite_electricity.name=Unendliche Elektrische Leistung +tile.basepower.infinite_quantum.name=Unendliche Quanten Leistung + +tile.basepower.crude_oil.name=Rohöl +fluid.basepower.crude_oil=Rohöl +item.bucket.crude_oil=Eimer Rohöl + + +tile.basepower.still.name=Brennerei + +tile.basepower.refined_oil.name=Raffiniertes Öl +fluid.basepower.refined_oil=Raffiniertes Öl +item.bucket.refined_oil=Eimer für Raffiniertes Öl +tile.basepower.fluid_switch.name=Ventil + +tile.basepower.converter_rf_steam.name=Dampf-RF Leistungstransformator +tile.basepower.converter_rf_electricity.name=Elektrizität-RF Leistungstransformator +tile.basepower.converter_rf_quantum.name=Quant-RF Leistungstransformator +tile.basepower.converter_tr_electricity.name=Elektrizität-EU Leistungstransformator diff --git a/src/main/resources/assets/basepower/lang/en_AU.lang b/src/main/resources/assets/basepower/lang/en_AU.lang new file mode 100644 index 0000000..650bf54 --- /dev/null +++ b/src/main/resources/assets/basepower/lang/en_AU.lang @@ -0,0 +1,54 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) +nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped) + +tooltip.basepower.empty=Empty +tooltip.basepower.buckets_of=%x buckets of %y + +itemGroup.basepower=basePower + +tile.basepower.fluid_drain.name=Drain +tile.basepower.fluid_discharge.name=Discharge Grate +tile.basepower.fluid_storage_tank.name=Portable Fluid Tank +item.basepower.fluid_storage_tank_item.name=Storage Tank +tile.basepower.fluid_pipe.name=Pipe + +tile.basepower.item_conveyor.name=Conveyor +tile.basepower.item_filter_block.name=Block Filter Conveyor +tile.basepower.item_filter_food.name=Food Filter Conveyor +tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor +tile.basepower.item_filter_inventory.name=Filter Conveyor +tile.basepower.item_filter_ore.name=Ore Filter Conveyor +tile.basepower.item_filter_plant.name=Plantable Filter Conveyor +tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor +tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor +tile.basepower.steel_frame.name=Steel Frame + + +item.basepower.starch.name=Starch +item.basepower.bioplastic_ingot.name=Bioplastic Ingot +item.basepower.sprocket.name=Sprocket + +tile.basepower.fluid_metal_tank.name=Metal Fluid Tank +item.basepower.rotator_tool.name=Rotation Wrench + +tile.basepower.infinite_steam.name=Unlimited Steam Power +tile.basepower.infinite_electricity.name=Unlimited Electrical Power +tile.basepower.infinite_quantum.name=Unlimited Quantum Power + +tile.basepower.crude_oil.name=Crude Oil +fluid.basepower.crude_oil=Crude Oil +item.bucket.crude_oil=Bucket of Crude Oil + + +tile.basepower.still.name=Distillation Furnace + +tile.basepower.refined_oil.name=Refined Oil +fluid.basepower.refined_oil=Refined Oil +item.bucket.refined_oil=Bucket of Refined Oil +tile.basepower.fluid_switch.name=Fluid Switch Valve + +tile.basepower.converter_rf_steam.name=Steam-RF Transformer +tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer +tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer +tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/basepower/lang/en_CA.lang b/src/main/resources/assets/basepower/lang/en_CA.lang new file mode 100644 index 0000000..650bf54 --- /dev/null +++ b/src/main/resources/assets/basepower/lang/en_CA.lang @@ -0,0 +1,54 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) +nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped) + +tooltip.basepower.empty=Empty +tooltip.basepower.buckets_of=%x buckets of %y + +itemGroup.basepower=basePower + +tile.basepower.fluid_drain.name=Drain +tile.basepower.fluid_discharge.name=Discharge Grate +tile.basepower.fluid_storage_tank.name=Portable Fluid Tank +item.basepower.fluid_storage_tank_item.name=Storage Tank +tile.basepower.fluid_pipe.name=Pipe + +tile.basepower.item_conveyor.name=Conveyor +tile.basepower.item_filter_block.name=Block Filter Conveyor +tile.basepower.item_filter_food.name=Food Filter Conveyor +tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor +tile.basepower.item_filter_inventory.name=Filter Conveyor +tile.basepower.item_filter_ore.name=Ore Filter Conveyor +tile.basepower.item_filter_plant.name=Plantable Filter Conveyor +tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor +tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor +tile.basepower.steel_frame.name=Steel Frame + + +item.basepower.starch.name=Starch +item.basepower.bioplastic_ingot.name=Bioplastic Ingot +item.basepower.sprocket.name=Sprocket + +tile.basepower.fluid_metal_tank.name=Metal Fluid Tank +item.basepower.rotator_tool.name=Rotation Wrench + +tile.basepower.infinite_steam.name=Unlimited Steam Power +tile.basepower.infinite_electricity.name=Unlimited Electrical Power +tile.basepower.infinite_quantum.name=Unlimited Quantum Power + +tile.basepower.crude_oil.name=Crude Oil +fluid.basepower.crude_oil=Crude Oil +item.bucket.crude_oil=Bucket of Crude Oil + + +tile.basepower.still.name=Distillation Furnace + +tile.basepower.refined_oil.name=Refined Oil +fluid.basepower.refined_oil=Refined Oil +item.bucket.refined_oil=Bucket of Refined Oil +tile.basepower.fluid_switch.name=Fluid Switch Valve + +tile.basepower.converter_rf_steam.name=Steam-RF Transformer +tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer +tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer +tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/basepower/lang/en_EN.lang b/src/main/resources/assets/basepower/lang/en_EN.lang new file mode 100644 index 0000000..650bf54 --- /dev/null +++ b/src/main/resources/assets/basepower/lang/en_EN.lang @@ -0,0 +1,54 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) +nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped) + +tooltip.basepower.empty=Empty +tooltip.basepower.buckets_of=%x buckets of %y + +itemGroup.basepower=basePower + +tile.basepower.fluid_drain.name=Drain +tile.basepower.fluid_discharge.name=Discharge Grate +tile.basepower.fluid_storage_tank.name=Portable Fluid Tank +item.basepower.fluid_storage_tank_item.name=Storage Tank +tile.basepower.fluid_pipe.name=Pipe + +tile.basepower.item_conveyor.name=Conveyor +tile.basepower.item_filter_block.name=Block Filter Conveyor +tile.basepower.item_filter_food.name=Food Filter Conveyor +tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor +tile.basepower.item_filter_inventory.name=Filter Conveyor +tile.basepower.item_filter_ore.name=Ore Filter Conveyor +tile.basepower.item_filter_plant.name=Plantable Filter Conveyor +tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor +tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor +tile.basepower.steel_frame.name=Steel Frame + + +item.basepower.starch.name=Starch +item.basepower.bioplastic_ingot.name=Bioplastic Ingot +item.basepower.sprocket.name=Sprocket + +tile.basepower.fluid_metal_tank.name=Metal Fluid Tank +item.basepower.rotator_tool.name=Rotation Wrench + +tile.basepower.infinite_steam.name=Unlimited Steam Power +tile.basepower.infinite_electricity.name=Unlimited Electrical Power +tile.basepower.infinite_quantum.name=Unlimited Quantum Power + +tile.basepower.crude_oil.name=Crude Oil +fluid.basepower.crude_oil=Crude Oil +item.bucket.crude_oil=Bucket of Crude Oil + + +tile.basepower.still.name=Distillation Furnace + +tile.basepower.refined_oil.name=Refined Oil +fluid.basepower.refined_oil=Refined Oil +item.bucket.refined_oil=Bucket of Refined Oil +tile.basepower.fluid_switch.name=Fluid Switch Valve + +tile.basepower.converter_rf_steam.name=Steam-RF Transformer +tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer +tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer +tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/basepower/lang/en_GB.lang b/src/main/resources/assets/basepower/lang/en_GB.lang new file mode 100644 index 0000000..2490aec --- /dev/null +++ b/src/main/resources/assets/basepower/lang/en_GB.lang @@ -0,0 +1,53 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) +nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped) + +tooltip.basepower.empty=Empty +tooltip.basepower.buckets_of=%x buckets of %y + +itemGroup.basepower=basePower + +tile.basepower.fluid_drain.name=Drain +tile.basepower.fluid_discharge.name=Discharge Grate +tile.basepower.fluid_storage_tank.name=Portable Fluid Tank +item.basepower.fluid_storage_tank_item.name=Storage Tank +tile.basepower.fluid_pipe.name=Pipe + +tile.basepower.item_conveyor.name=Conveyor +tile.basepower.item_filter_block.name=Block Filter Conveyor +tile.basepower.item_filter_food.name=Food Filter Conveyor +tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor +tile.basepower.item_filter_inventory.name=Filter Conveyor +tile.basepower.item_filter_ore.name=Ore Filter Conveyor +tile.basepower.item_filter_plant.name=Plantable Filter Conveyor +tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor +tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor +tile.basepower.steel_frame.name=Steel Frame + + +item.basepower.starch.name=Starch +item.basepower.bioplastic_ingot.name=Bioplastic Ingot +item.basepower.sprocket.name=Sprocket + +tile.basepower.fluid_metal_tank.name=Metal Fluid Tank +item.basepower.rotator_tool.name=Rotation Wrench + +tile.basepower.infinite_steam.name=Unlimited Steam Power +tile.basepower.infinite_electricity.name=Unlimited Electrical Power +tile.basepower.infinite_quantum.name=Unlimited Quantum Power + +tile.basepower.crude_oil.name=Crude Oil +fluid.basepower.crude_oil=Crude Oil +item.bucket.crude_oil=Bucket of Crude Oil + +tile.basepower.still.name=Distillation Furnace + +tile.basepower.refined_oil.name=Refined Oil +fluid.basepower.refined_oil=Refined Oil +item.bucket.refined_oil=Bucket of Refined Oil +tile.basepower.fluid_switch.name=Fluid Switch Valve + +tile.basepower.converter_rf_steam.name=Steam-RF Transformer +tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer +tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer +tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/basepower/lang/en_PT.lang b/src/main/resources/assets/basepower/lang/en_PT.lang new file mode 100644 index 0000000..8b463e8 --- /dev/null +++ b/src/main/resources/assets/basepower/lang/en_PT.lang @@ -0,0 +1,53 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) +nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped) + +tooltip.basepower.empty=Empty +tooltip.basepower.buckets_of=%x buckets of %y + +itemGroup.basepower=basePower + +tile.basepower.fluid_drain.name=Drain +tile.basepower.fluid_discharge.name=Discharge Grate +tile.basepower.fluid_storage_tank.name=Portable Fluid Tank +item.basepower.fluid_storage_tank_item.name=Storage Tank +tile.basepower.fluid_pipe.name=Pipe + +tile.basepower.item_conveyor.name=Conveyor +tile.basepower.item_filter_block.name=Block Filter Conveyor +tile.basepower.item_filter_food.name=Food Filter Conveyor +tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor +tile.basepower.item_filter_inventory.name=Filter Conveyor +tile.basepower.item_filter_ore.name=Ore Filter Conveyor +tile.basepower.item_filter_plant.name=Plantable Filter Conveyor +tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor +tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor +tile.basepower.steel_frame.name=Steel Frame + + +item.basepower.starch.name=Starch +item.basepower.bioplastic_ingot.name=Bioplastic Ingot +item.basepower.sprocket.name=Sprocket + +tile.basepower.fluid_metal_tank.name=Metal Fluid Tank +item.basepower.rotator_tool.name=Rotation Wrench + +tile.basepower.infinite_steam.name=Unlimited Steam Power +tile.basepower.infinite_electricity.name=Unlimited Electrical Power +tile.basepower.infinite_quantum.name=Unlimited Quantum Power + +tile.basepower.crude_oil.name=Black Gold +fluid.basepower.crude_oil=Black Gold +item.bucket.crude_oil=Bucket o' Black Gold + +tile.basepower.still.name='Stillery + +tile.basepower.refined_oil.name=Lamp Oil +fluid.basepower.refined_oil=Lamp Oil +item.bucket.refined_oil=Bucket o' Lamp Oil +tile.basepower.fluid_switch.name=Big Red Valve + +tile.basepower.converter_rf_steam.name=Steam-RF Transformer +tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer +tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer +tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/basepower/lang/en_US.lang b/src/main/resources/assets/basepower/lang/en_US.lang new file mode 100644 index 0000000..453959e --- /dev/null +++ b/src/main/resources/assets/basepower/lang/en_US.lang @@ -0,0 +1,52 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) +nei.basepower.recipehandler.shapedfurnace.name=Large Furnace (Shaped) + +tooltip.basepower.empty=Empty +tooltip.basepower.buckets_of=%x buckets of %y + +itemGroup.basepower=basePower + +tile.basepower.fluid_drain.name=Drain +tile.basepower.fluid_discharge.name=Discharge Grate +tile.basepower.fluid_storage_tank.name=Portable Fluid Tank +tile.basepower.fluid_pipe.name=Pipe + +tile.basepower.item_conveyor.name=Conveyor +tile.basepower.item_filter_block.name=Block Filter Conveyor +tile.basepower.item_filter_food.name=Food Filter Conveyor +tile.basepower.item_filter_fuel.name=Fuel Filter Conveyor +tile.basepower.item_filter_inventory.name=Filter Conveyor +tile.basepower.item_filter_ore.name=Ore Filter Conveyor +tile.basepower.item_filter_plant.name=Plantable Filter Conveyor +tile.basepower.item_filter_smelt.name=Furnace Filter Conveyor +tile.basepower.item_filter_overflow.name=Overflow Filter Conveyor +tile.basepower.steel_frame.name=Steel Frame + + +item.basepower.starch.name=Starch +item.basepower.bioplastic_ingot.name=Bioplastic Ingot +item.basepower.sprocket.name=Sprocket + + +tile.basepower.fluid_metal_tank.name=Metal Fluid Tank +item.basepower.rotator_tool.name=Rotation Wrench + +tile.basepower.infinite_steam.name=Unlimited Steam Power +tile.basepower.infinite_electricity.name=Unlimited Electrical Power +tile.basepower.infinite_quantum.name=Unlimited Quantum Power + +tile.basepower.crude_oil.name=Crude Oil +fluid.basepower.crude_oil=Crude Oil +item.bucket.crude_oil=Bucket of Crude Oil + +tile.basepower.still.name=Distillation Furnace +tile.basepower.refined_oil.name=Refined Oil +fluid.basepower.refined_oil=Refined Oil +item.bucket.refined_oil=Bucket of Refined Oil +tile.basepower.fluid_switch.name=Fluid Switch Valve + +tile.basepower.converter_rf_steam.name=Steam-RF Transformer +tile.basepower.converter_rf_electricity.name=Electricity-RF Transformer +tile.basepower.converter_rf_quantum.name=Quantum-RF Transformer +tile.basepower.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/basepower/lang/es_ES.lang b/src/main/resources/assets/basepower/lang/es_ES.lang new file mode 100644 index 0000000..673795a --- /dev/null +++ b/src/main/resources/assets/basepower/lang/es_ES.lang @@ -0,0 +1,56 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Gran Horno (no forma) +nei.basepower.recipehandler.shapedfurnace.name=Gran Horno (en forma) + +tooltip.basepower.empty=Vacío +tooltip.basepower.buckets_of =%x cubos de %y + +itemGroup.basepower=Ventaja de Energía + +tile.basepower.fluid_drain.name=Drenaje +tile.basepower.fluid_discharge.name=Descarga Grate +tile.basepower.fluid_storage_tank.name=Tanque de almacenamiento +item.basepower.fluid_storage_tank_item.name=Tanque de almacenamiento +tile.basepower.fluid_pipe.name=Tubo + +tile.basepower.item_conveyor.name=Transportadores +tile.basepower.item_filter_block.name=Bloquear Filtro Transportadores +tile.basepower.item_filter_food.name=Filtro Alimentos Transportadores +tile.basepower.item_filter_fuel.name=Filtro de combustible Transportadores +tile.basepower.item_filter_inventory.name=Filtro Transportadores +tile.basepower.item_filter_ore.name=Ore Transportadores Filtro +tile.basepower.item_filter_plant.name=Plantable Transportadores Filtro +tile.basepower.item_filter_smelt.name=Horno Filtro Transportadores +tile.basepower.item_filter_overflow.name=Desbordamiento Filtro Transportadores +tile.basepower.steel_frame.name=Marco de Acero + + +item.basepower.starch.name=Almidón +item.basepower.bioplastic_ingot.name=Bioplástico Lingote +item.basepower.sprocket.name=Piñón + + +tile.basepower.fluid_metal_tank.name=Tanque de Almacenamiento de Acero +item.basepower.rotator_tool.name=Herramienta de Rotación + +tile.basepower.infinite_steam.name=La Energía de Vapor Infinito +tile.basepower.infinite_electricity.name=Energía Eléctrica Infinito +tile.basepower.infinite_quantum.name=Cuántica Infinito + +tile.basepower.crude_oil.name=Petróleo Crudo +fluid.basepower.crude_oil=Petróleo Crudo +item.bucket.crude_oil.name=Cubo de Crudo + + +tile.basepower.still.name=Destilería + +tile.basepower.refined_oil.name=Refinado de Petróleo +fluid.basepower.refined_oil=Refinado de Petróleo +item.bucket.refined_oil.name=Cubo de Refinado de Petróleo +tile.basepower.fluid_switch.name=Válvula + + +tile.basepower.converter_rf_steam.name=Vapor-RF Transformador +tile.basepower.converter_rf_electricity.name=Electricidad-RF Transformador +tile.basepower.converter_rf_quantum.name=Cuántico-RF Transformador +tile.basepower.converter_tr_electricity.name=Electricidad-EU Transformador diff --git a/src/main/resources/assets/basepower/lang/es_MX.lang b/src/main/resources/assets/basepower/lang/es_MX.lang new file mode 100644 index 0000000..2a0ea30 --- /dev/null +++ b/src/main/resources/assets/basepower/lang/es_MX.lang @@ -0,0 +1,56 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Gran Horno (no forma) +nei.basepower.recipehandler.shapedfurnace.name=Gran Horno (en forma) + +tooltip.basepower.empty=Vacío +tooltip.basepower.buckets_of=%x cubos de %y + +itemGroup.basepower=Ventaja de Energía + +tile.basepower.fluid_drain.name=Drenaje +tile.basepower.fluid_discharge.name=Descarga Grate +tile.basepower.fluid_storage_tank.name=Tanque de almacenamiento +item.basepower.fluid_storage_tank_item.name=Tanque de almacenamiento +tile.basepower.fluid_pipe.name=Tubo + +tile.basepower.item_conveyor.name=Transportadores +tile.basepower.item_filter_block.name=Bloquear Filtro Transportadores +tile.basepower.item_filter_food.name=Filtro Alimentos Transportadores +tile.basepower.item_filter_fuel.name=Filtro de combustible Transportadores +tile.basepower.item_filter_inventory.name=Filtro Transportadores +tile.basepower.item_filter_ore.name=Ore Transportadores Filtro +tile.basepower.item_filter_plant.name=Plantable Transportadores Filtro +tile.basepower.item_filter_smelt.name=Horno Filtro Transportadores +tile.basepower.item_filter_overflow.name=Desbordamiento Filtro Transportadores +tile.basepower.steel_frame.name=Marco de Acero + + +item.basepower.starch.name=Almidón +item.basepower.bioplastic_ingot.name=Bioplástico Lingote +item.basepower.sprocket.name=Piñón + + +tile.basepower.fluid_metal_tank.name=Tanque de Almacenamiento de Acero +item.basepower.rotator_tool.name=Herramienta de Rotación + +tile.basepower.infinite_steam.name=La Energía de Vapor Infinito +tile.basepower.infinite_electricity.name=Energía Eléctrica Infinito +tile.basepower.infinite_quantum.name=Cuántica Infinito + +tile.basepower.crude_oil.name=Petróleo Crudo +fluid.basepower.crude_oil=Petróleo Crudo +item.bucket.crude_oil.name=Cubo de Crudo + + +tile.basepower.still.name=Destilería + +tile.basepower.refined_oil.name=Refinado de Petróleo +fluid.basepower.refined_oil=Refinado de Petróleo +item.bucket.refined_oil.name=Cubo de Refinado de Petróleo +tile.basepower.fluid_switch.name=Válvula + + +tile.basepower.converter_rf_steam.name=Vapor-RF Transformador +tile.basepower.converter_rf_electricity.name=Electricidad-RF Transformador +tile.basepower.converter_rf_quantum.name=Cuántico-RF Transformador +tile.basepower.converter_tr_electricity.name=Electricidad-EU Transformador diff --git a/src/main/resources/assets/basepower/lang/it_IT.lang b/src/main/resources/assets/basepower/lang/it_IT.lang new file mode 100644 index 0000000..a8b04ef --- /dev/null +++ b/src/main/resources/assets/basepower/lang/it_IT.lang @@ -0,0 +1,55 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Grande Fornace (informe) +nei.basepower.recipehandler.shapedfurnace.name=Grande Fornace (forma) + +tooltip.basepower.empty=vuoto +tooltip.basepower.buckets_of=%x secchi d'%y + +itemGroup.basepower=Potenza Advantage + +tile.basepower.fluid_drain.name=Scarico +tile.basepower.fluid_discharge.name=Griglia di scarico +tile.basepower.fluid_storage_tank.name=Serbatoio +item.basepower.fluid_storage_tank_item.name=Serbatoio +tile.basepower.fluid_pipe.name=Tubo + +tile.basepower.item_conveyor.name=Trasportatore +tile.basepower.item_filter_block.name=Filtro di blocco trasportatore +tile.basepower.item_filter_food.name=Filtro alimentare Conveyor +tile.basepower.item_filter_fuel.name=carburante Filtro Conveyor +tile.basepower.item_filter_inventory.name=Filtro Conveyor +tile.basepower.item_filter_ore.name=Ore Filtro Conveyor +tile.basepower.item_filter_plant.name=Plantable Filtro Conveyor +tile.basepower.item_filter_smelt.name=Forno Filtro Conveyor +tile.basepower.item_filter_overflow.name=Straripamento Filtro Conveyor +tile.basepower.steel_frame.name=Steel Frame + + +item.basepower.starch.name=Amido +item.basepower.bioplastic_ingot.name=Bioplastica Lingotto +item.basepower.sprocket.name=Sprocket + + +tile.basepower.fluid_metal_tank.name=Serbatoio in Metallo +item.basepower.rotator_tool.name=Strumento di Rotazione + +tile.basepower.infinite_steam.name=Forza Vapore Infinite +tile.basepower.infinite_electricity.name=Elettricità Infinite +tile.basepower.infinite_quantum.name=Atomica Infinite + +tile.basepower.crude_oil.name=Olio a Crudo +fluid.basepower.crude_oil=Olio a Crudo +item.bucket.crude_oil.name=Secchio di Greggio + + +tile.basepower.still.name=Distilleria +tile.basepower.refined_oil.name=Olio Raffinato +fluid.basepower.refined_oil=Olio Raffinato +item.bucket.refined_oil.name=Secchio di Olio Raffinato +tile.basepower.fluid_switch.name=Valvola + + +tile.basepower.converter_rf_steam.name=Vapore-RF Trasformatore +tile.basepower.converter_rf_electricity.name=Elettricità-RF Trasformatore +tile.basepower.converter_rf_quantum.name=Quantistico-RF Trasformatore +tile.basepower.converter_tr_electricity.name=Elettricità-EU Trasformatore diff --git a/src/main/resources/assets/basepower/lang/ja_JP.lang b/src/main/resources/assets/basepower/lang/ja_JP.lang new file mode 100644 index 0000000..0c47868 --- /dev/null +++ b/src/main/resources/assets/basepower/lang/ja_JP.lang @@ -0,0 +1,56 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +Translate +nei.basepower.recipehandler.shapelessfurnace.name=大型炉(型崩れ) +nei.basepower.recipehandler.shapedfurnace.name=大型炉(形) + +tooltip.basepower.empty=空 +tooltip.basepower.buckets_of=%yの%xバケット + +itemGroup.basepower=パワー·アドバンテージ + +tile.basepower.fluid_drain.name=ドレン +tile.basepower.fluid_discharge.name=放電グレート +tile.basepower.fluid_storage_tank.name=貯蔵タンク +item.basepower.fluid_storage_tank_item.name=貯蔵タンク +tile.basepower.fluid_pipe.name=パイプ + +tile.basepower.item_conveyor.name=コンベア +tile.basepower.item_filter_block.name=ブロックフィルタコンベア +tile.basepower.item_filter_food.name=フードフィルターコンベア +tile.basepower.item_filter_fuel.name=燃料フィルターコンベア +tile.basepower.item_filter_inventory.name=フィルタコンベヤー +tile.basepower.item_filter_ore.name=鉱石フィルターコンベア +tile.basepower.item_filter_plant.name=プラントフィルタコンベヤー +tile.basepower.item_filter_smelt.name=炉フィルターコンベア +tile.basepower.item_filter_overflow.name=オーバーフローフィルタコンベヤー +tile.basepower.steel_frame.name=鉄骨 + + +item.basepower.starch.name=デンプン +item.basepower.bioplastic_ingot.name=は、バイオプラスチックインゴットを +item.basepower.sprocket.name=スプロケット + +tile.basepower.infinite_steam.name=無限の蒸気動力 +tile.basepower.infinite_electricity.name=無限の電力 +tile.basepower.infinite_quantum.name=無限の量子パワー + + +tile.basepower.fluid_metal_tank.name=金属製貯蔵タンク +item.basepower.rotator_tool.name=回転ツール + +tile.basepower.crude_oil.name=原油 +fluid.basepower.crude_oil=原油 +item.bucket.crude_oil.name=原油のバケット + + +tile.basepower.still.name=蒸留酒製造所 +tile.basepower.refined_oil.name=精製油 +fluid.basepower.refined_oil=精製油 +item.bucket.refined_oil.name=精製油のバケツ +tile.basepower.fluid_switch.name=バルブ + + +tile.basepower.converter_rf_steam.name=蒸気-RFトランス +tile.basepower.converter_rf_electricity.name=電気-RFトランス +tile.basepower.converter_rf_quantum.name=量子-RFトランス +tile.basepower.converter_tr_electricity.name=電気-EUトランス diff --git a/src/main/resources/assets/basepower/lang/ko_KR.lang b/src/main/resources/assets/basepower/lang/ko_KR.lang new file mode 100644 index 0000000..b9d1b83 --- /dev/null +++ b/src/main/resources/assets/basepower/lang/ko_KR.lang @@ -0,0 +1,56 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=대형 전기로 (못생긴) +nei.basepower.recipehandler.shapedfurnace.name=대형 전기로 (모양) + +tooltip.basepower.empty=빈 +tooltip.tooltip.basepower.buckets_of=%는 X 버킷 + +itemGroup.basepower=전원의 장점을 + +tile.basepower.fluid_drain.name=드레인 +tile.basepower.fluid_discharge.name=방전 화격자 +tile.basepower.fluid_storage_tank.name=저장 탱크 +item.basepower.fluid_storage_tank_item.name=는 저장 탱크를 +tile.basepower.fluid_pipe.name=파이프 + +tile.basepower.item_conveyor.name=컨베이어 +tile.basepower.item_filter_block.name=블록 필터 컨베이어 +tile.basepower.item_filter_food.name=식품 필터 컨베이어 +tile.basepower.item_filter_fuel.name=연료 필터 컨베이어 +tile.basepower.item_filter_inventory.name=필터 컨베이어 +tile.basepower.item_filter_ore.name=광석 필터 컨베이어 +tile.basepower.item_filter_plant.name=물만 주면 식물이 필터 컨베이어 +tile.basepower.item_filter_smelt.name=노 필터 컨베이어 +tile.basepower.item_filter_overflow.name=오버 플로우필터 컨베이어 +tile.basepower.steel_frame.name=스틸 프레임 + + +item.basepower.starch.name=전분 +item.basepower.bioplastic_ingot.name=는 바이오 플라스틱 잉곳을 +item.basepower.sprocket.name=스프로킷 + + +tile.basepower.fluid_metal_tank.name=금속 저장조 +item.basepower.rotator_tool.name=회전 도구 + + +tile.basepower.infinite_steam.name=무한 증기 력 +tile.basepower.infinite_electricity.name=무한 전력 +tile.basepower.infinite_quantum.name=무한 양자 전력 + +tile.basepower.crude_oil.name=원유 +fluid.basepower.crude_oil=원유 +item.bucket.crude_oil.name=원유의 버킷 + + +tile.basepower.still.name=증류소 +tile.basepower.refined_oil.name=정유 +fluid.basepower.refined_oil=정유 +item.bucket.refined_oil.name=정유의 통 +tile.basepower.fluid_switch.name=판막 + + +tile.basepower.converter_rf_steam.name=증기-RF 전원 트랜스 +tile.basepower.converter_rf_electricity.name=전기-RF 전원 트랜스 +tile.basepower.converter_rf_quantum.name=양자-RF 전원 트랜스 +tile.basepower.converter_tr_electricity.name=전기-EU 전원 트랜스 diff --git a/src/main/resources/assets/basepower/lang/pt_BR.lang b/src/main/resources/assets/basepower/lang/pt_BR.lang new file mode 100644 index 0000000..48f51d3 --- /dev/null +++ b/src/main/resources/assets/basepower/lang/pt_BR.lang @@ -0,0 +1,54 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) +nei.basepower.recipehandler.shapelessfurnace.name=Forno Grande (no forma) +nei.basepower.recipehandler.shapedfurnace.name=Forno Grande (em forma) + +tooltip.basepower.empty=vazio +tooltip.basepower.buckets_of=%x baldes de %y + +itemGroup.basepower=Vantagem de Poder + +tile.basepower.fluid_drain.name=Dreno +tile.basepower.fluid_discharge.name=Grate Discharge +tile.basepower.fluid_storage_tank.name=Tanque de armazenamento +item.basepower.fluid_storage_tank_item.name=Tanque de armazenamento +tile.basepower.fluid_pipe.name=Tubulação + +tile.basepower.item_conveyor.name=Transportador +tile.basepower.item_filter_block.name=Bloquear filtro transportador +tile.basepower.item_filter_food.name=Transportador Filtro de Alimentos +tile.basepower.item_filter_fuel.name=Filtro de combustível Transportador +tile.basepower.item_filter_inventory.name=Transportador Filtro +tile.basepower.item_filter_ore.name=Ore Transportadora Filtro +tile.basepower.item_filter_plant.name=Plantable Transportadora Filtro +tile.basepower.item_filter_smelt.name=Fornalha Filtro Transportador +tile.basepower.item_filter_overflow.name=Transbordamento Transportador Filtro +tile.basepower.steel_frame.name=Armação de Aço + + +item.basepower.starch.name=Amido +item.basepower.bioplastic_ingot.name=Bioplastic lingote +item.basepower.sprocket.name=Roda Dentada + + +tile.basepower.fluid_metal_tank.name=Tanque de Armazenamento de Aço +item.basepower.rotator_tool.name=Ferramenta de Rotação + +tile.basepower.infinite_steam.name=Energia a Vapor Infinito +tile.basepower.infinite_electricity.name=Energia Elétrica Infinito +tile.basepower.infinite_quantum.name=Energia Quantum Infinito + +tile.basepower.crude_oil.name=Óleo Cru +fluid.basepower.crude_oil=Óleo Cru +item.bucket.crude_oil.name=Balde de Óleo Cru + + +tile.basepower.still.name=Destilaria +tile.basepower.refined_oil.name=Óleo Refinado +fluid.basepower.refined_oil=Óleo Refinado +item.bucket.refined_oil.name=Balde de Óleo Refinado +tile.basepower.fluid_switch.name=Válvula + +tile.basepower.converter_rf_steam.name=Vapor-RF Transformador +tile.basepower.converter_rf_electricity.name=Electricidade-RF Transformador +tile.basepower.converter_rf_quantum.name=Quantidade-RF Transformador +tile.basepower.converter_tr_electricity.name=Electricidade-EU Transformador diff --git a/src/main/resources/assets/basepower/lang/zh_CN.lang b/src/main/resources/assets/basepower/lang/zh_CN.lang new file mode 100644 index 0000000..611540f --- /dev/null +++ b/src/main/resources/assets/basepower/lang/zh_CN.lang @@ -0,0 +1,57 @@ +language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) + +nei.basepower.recipehandler.shapelessfurnace.name=大熔炉(无形的) +nei.basepower.recipehandler.shapedfurnace.name=大熔炉(有形的) + +tooltip.basepower.empty=空 +tooltip.basepower.buckets_of=%x水桶的%y + +itemGroup.basepower=能量优势 + +tile.basepower.fluid_drain.name=抽水机 +tile.basepower.fluid_discharge.name=排液器 +tile.basepower.fluid_storage_tank.name=便携式液体储罐 +item.basepower.fluid_storage_tank_item.name=便携式液体储罐 +tile.basepower.fluid_pipe.name=液体管 + +tile.basepower.item_conveyor.name=输送机 +tile.basepower.item_filter_block.name=方块过滤输送机 +tile.basepower.item_filter_food.name=食品过滤输送机 +tile.basepower.item_filter_fuel.name=燃料过滤输送机 +tile.basepower.item_filter_inventory.name=选择过滤输送机 +tile.basepower.item_filter_ore.name=矿物过滤输送机 +tile.basepower.item_filter_plant.name=种子过滤输送机 +tile.basepower.item_filter_smelt.name=熔炉过滤输送机 +tile.basepower.item_filter_overflow.name=溢出过滤输送机 +tile.basepower.steel_frame.name=钢框架 + + +item.basepower.starch.name=淀粉 +item.basepower.bioplastic_ingot.name=生物塑料锭 +item.basepower.sprocket.name=链轮 + + +tile.basepower.fluid_metal_tank.name=金属液罐 +item.basepower.rotator_tool.name=旋转扳手 + +tile.basepower.infinite_steam.name=无限蒸汽动力 +tile.basepower.infinite_electricity.name=无限电力 +tile.basepower.infinite_quantum.name=无限量子动力 + +tile.basepower.crude_oil.name=原油 +fluid.basepower.crude_oil=原油 +item.bucket.crude_oil.name=原油桶 + + +tile.basepower.still.name=酒廠 + +tile.basepower.refined_oil.name=成品油 +fluid.basepower.refined_oil=成品油 +item.bucket.refined_oil.name=成品油的桶 +tile.basepower.fluid_switch.name=閥 + + +tile.basepower.converter_rf_steam.name=蒸汽-RF 變壓器 +tile.basepower.converter_rf_electricity.name=電力-RF 變壓器 +tile.basepower.converter_rf_quantum.name=量子-RF 變壓器 +tile.basepower.converter_tr_electricity.name=電力-EU 變壓器 diff --git a/src/main/resources/assets/poweradvantage/models/block/converter_rf_electricity.json b/src/main/resources/assets/basepower/models/block/converter_rf_electricity.json similarity index 94% rename from src/main/resources/assets/poweradvantage/models/block/converter_rf_electricity.json rename to src/main/resources/assets/basepower/models/block/converter_rf_electricity.json index 01a03f6..dbdf82a 100644 --- a/src/main/resources/assets/poweradvantage/models/block/converter_rf_electricity.json +++ b/src/main/resources/assets/basepower/models/block/converter_rf_electricity.json @@ -1,10 +1,10 @@ { "parent": "block/block", "textures": { - "face": "poweradvantage:blocks/steel_frame", - "core": "poweradvantage:materials/plastic", - "plug": "poweradvantage:blocks/filter_bottom", - "particle": "poweradvantage:materials/steel" + "face": "basepower:blocks/steel_frame", + "core": "basepower:materials/plastic", + "plug": "basepower:blocks/filter_bottom", + "particle": "basepower:materials/steel" }, "elements": [ { diff --git a/src/main/resources/assets/poweradvantage/models/block/converter_rf_quantum.json b/src/main/resources/assets/basepower/models/block/converter_rf_quantum.json similarity index 96% rename from src/main/resources/assets/poweradvantage/models/block/converter_rf_quantum.json rename to src/main/resources/assets/basepower/models/block/converter_rf_quantum.json index 82f513c..5a534f0 100644 --- a/src/main/resources/assets/poweradvantage/models/block/converter_rf_quantum.json +++ b/src/main/resources/assets/basepower/models/block/converter_rf_quantum.json @@ -1,10 +1,10 @@ { "parent": "block/block", "textures": { - "face": "poweradvantage:blocks/steel_frame", + "face": "basepower:blocks/steel_frame", "core": "minecraft:blocks/ice_packed", - "plug": "poweradvantage:blocks/filter_bottom", - "particle": "poweradvantage:materials/steel" + "plug": "basepower:blocks/filter_bottom", + "particle": "basepower:materials/steel" }, "elements": [ { diff --git a/src/main/resources/assets/poweradvantage/models/block/converter_rf_steam.json b/src/main/resources/assets/basepower/models/block/converter_rf_steam.json similarity index 95% rename from src/main/resources/assets/poweradvantage/models/block/converter_rf_steam.json rename to src/main/resources/assets/basepower/models/block/converter_rf_steam.json index a831250..b1fe2c8 100644 --- a/src/main/resources/assets/poweradvantage/models/block/converter_rf_steam.json +++ b/src/main/resources/assets/basepower/models/block/converter_rf_steam.json @@ -1,10 +1,10 @@ { "parent": "block/block", "textures": { - "face": "poweradvantage:blocks/steel_frame", - "core": "poweradvantage:materials/brass", - "plug": "poweradvantage:blocks/filter_bottom", - "particle": "poweradvantage:materials/steel" + "face": "basepower:blocks/steel_frame", + "core": "basepower:materials/brass", + "plug": "basepower:blocks/filter_bottom", + "particle": "basepower:materials/steel" }, "elements": [ { diff --git a/src/main/resources/assets/basepower/models/block/converter_tr_electricity.json b/src/main/resources/assets/basepower/models/block/converter_tr_electricity.json new file mode 100644 index 0000000..102f107 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/converter_tr_electricity.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "basepower:blocks/techreborn_converter" + } +} diff --git a/src/main/resources/assets/poweradvantage/models/block/conveyor_base.json b/src/main/resources/assets/basepower/models/block/conveyor_base.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/conveyor_base.json rename to src/main/resources/assets/basepower/models/block/conveyor_base.json diff --git a/src/main/resources/assets/basepower/models/block/fluid_discharge.json b/src/main/resources/assets/basepower/models/block/fluid_discharge.json new file mode 100644 index 0000000..2ee7970 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_discharge.json @@ -0,0 +1,8 @@ +{ + "parent": "block/cube_bottom_top", + "textures": { + "top": "basepower:blocks/fluid_discharge_side", + "bottom": "basepower:blocks/fluid_discharge_face", + "side": "basepower:blocks/fluid_discharge_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/block/fluid_drain.json b/src/main/resources/assets/basepower/models/block/fluid_drain.json new file mode 100644 index 0000000..b076dd0 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_drain.json @@ -0,0 +1,8 @@ +{ + "parent": "block/cube_bottom_top", + "textures": { + "top": "basepower:blocks/fluid_drain_face", + "bottom": "basepower:blocks/fluid_drain_side", + "side": "basepower:blocks/fluid_drain_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_metal_tank.json b/src/main/resources/assets/basepower/models/block/fluid_metal_tank.json similarity index 94% rename from src/main/resources/assets/poweradvantage/models/block/fluid_metal_tank.json rename to src/main/resources/assets/basepower/models/block/fluid_metal_tank.json index 3342841..85fc4ab 100644 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_metal_tank.json +++ b/src/main/resources/assets/basepower/models/block/fluid_metal_tank.json @@ -1,10 +1,10 @@ { "parent": "block/block", "textures": { - "top": "poweradvantage:blocks/fluid_metal_tank_top", - "bottom": "poweradvantage:blocks/fluid_metal_tank_top", - "side": "poweradvantage:blocks/fluid_metal_tank_side", - "particle": "poweradvantage:blocks/fluid_metal_tank_side" + "top": "basepower:blocks/fluid_metal_tank_top", + "bottom": "basepower:blocks/fluid_metal_tank_top", + "side": "basepower:blocks/fluid_metal_tank_side", + "particle": "basepower:blocks/fluid_metal_tank_side" }, "elements": [ { diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_0.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_0.json new file mode 100644 index 0000000..9d3f723 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_0.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_0", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_densuw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_densuw.json new file mode 100644 index 0000000..6d07fd4 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_densuw.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_densuw", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_desuw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_desuw.json new file mode 100644 index 0000000..3311cb3 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_desuw.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_desuw", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_dnu.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_dnu.json new file mode 100644 index 0000000..cc3d8f6 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_dnu.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_dnu", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_ensw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_ensw.json new file mode 100644 index 0000000..f31a841 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_ensw.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_ensw", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_n.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_n.json new file mode 100644 index 0000000..11a2c6d --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_n.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_n", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_ns.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_ns.json new file mode 100644 index 0000000..aa64b8a --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_ns.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_ns", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_nsuw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_nsuw.json new file mode 100644 index 0000000..95c3367 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nsuw.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_nsuw", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_nsw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_nsw.json new file mode 100644 index 0000000..60ec039 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nsw.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_nsw", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_nuw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_nuw.json new file mode 100644 index 0000000..5b0dbb1 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nuw.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_nuw", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_pipe_nw.json b/src/main/resources/assets/basepower/models/block/fluid_pipe_nw.json new file mode 100644 index 0000000..2f87ee8 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_pipe_nw.json @@ -0,0 +1,8 @@ +{ + "parent": "block/block", + "parent": "basepower:block/pipe4_nw", + "textures": { + "texture": "basepower:blocks/fluid_pipe", + "particle": "basepower:materials/iron" + } +} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_storage_tank.json b/src/main/resources/assets/basepower/models/block/fluid_storage_tank.json similarity index 97% rename from src/main/resources/assets/poweradvantage/models/block/fluid_storage_tank.json rename to src/main/resources/assets/basepower/models/block/fluid_storage_tank.json index c8daff3..70f1e28 100644 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_storage_tank.json +++ b/src/main/resources/assets/basepower/models/block/fluid_storage_tank.json @@ -1,9 +1,9 @@ { "parent": "block/block", "textures": { - "walls": "poweradvantage:materials/plastic", - "supports": "poweradvantage:materials/steel", - "particle": "poweradvantage:materials/plastic" + "walls": "basepower:materials/plastic", + "supports": "basepower:materials/steel", + "particle": "basepower:materials/plastic" }, "elements": [ { diff --git a/src/main/resources/assets/basepower/models/block/fluid_switch_off.json b/src/main/resources/assets/basepower/models/block/fluid_switch_off.json new file mode 100644 index 0000000..53991a6 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_switch_off.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "basepower:blocks/fluid_switch_off", + "particle": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/basepower/models/block/fluid_switch_on.json b/src/main/resources/assets/basepower/models/block/fluid_switch_on.json new file mode 100644 index 0000000..b132b59 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/fluid_switch_on.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "basepower:blocks/fluid_switch_on", + "particle": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/poweradvantage/models/block/infinite_electricity.json b/src/main/resources/assets/basepower/models/block/infinite_electricity.json similarity index 52% rename from src/main/resources/assets/poweradvantage/models/block/infinite_electricity.json rename to src/main/resources/assets/basepower/models/block/infinite_electricity.json index 40f79af..8300510 100644 --- a/src/main/resources/assets/poweradvantage/models/block/infinite_electricity.json +++ b/src/main/resources/assets/basepower/models/block/infinite_electricity.json @@ -1,6 +1,6 @@ { "parent": "block/cube_all", "textures": { - "all": "poweradvantage:materials/metal_panel" + "all": "basepower:materials/metal_panel" } } \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/block/infinite_quantum.json b/src/main/resources/assets/basepower/models/block/infinite_quantum.json similarity index 52% rename from src/main/resources/assets/poweradvantage/models/block/infinite_quantum.json rename to src/main/resources/assets/basepower/models/block/infinite_quantum.json index 40f79af..8300510 100644 --- a/src/main/resources/assets/poweradvantage/models/block/infinite_quantum.json +++ b/src/main/resources/assets/basepower/models/block/infinite_quantum.json @@ -1,6 +1,6 @@ { "parent": "block/cube_all", "textures": { - "all": "poweradvantage:materials/metal_panel" + "all": "basepower:materials/metal_panel" } } \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/block/infinite_steam.json b/src/main/resources/assets/basepower/models/block/infinite_steam.json similarity index 52% rename from src/main/resources/assets/poweradvantage/models/block/infinite_steam.json rename to src/main/resources/assets/basepower/models/block/infinite_steam.json index 40f79af..8300510 100644 --- a/src/main/resources/assets/poweradvantage/models/block/infinite_steam.json +++ b/src/main/resources/assets/basepower/models/block/infinite_steam.json @@ -1,6 +1,6 @@ { "parent": "block/cube_all", "textures": { - "all": "poweradvantage:materials/metal_panel" + "all": "basepower:materials/metal_panel" } } \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/block/item_conveyor.json b/src/main/resources/assets/basepower/models/block/item_conveyor.json new file mode 100644 index 0000000..9da9824 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/item_conveyor.json @@ -0,0 +1,10 @@ +{ + "parent": "basepower:block/conveyor_base", + "textures": { + "top": "basepower:blocks/item_conveyor_top", + "bottom": "basepower:blocks/item_conveyor_top", + "side": "basepower:blocks/item_conveyor_side", + "end": "basepower:blocks/item_conveyor_end", + "rim": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/basepower/models/block/item_filter_block.json b/src/main/resources/assets/basepower/models/block/item_filter_block.json new file mode 100644 index 0000000..fadbf83 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/item_filter_block.json @@ -0,0 +1,10 @@ +{ + "parent": "basepower:block/conveyor_base", + "textures": { + "top": "basepower:blocks/item_conveyor_top", + "bottom": "basepower:blocks/filter_bottom", + "side": "basepower:blocks/filter_side_block", + "end": "basepower:blocks/item_conveyor_end", + "rim": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/basepower/models/block/item_filter_food.json b/src/main/resources/assets/basepower/models/block/item_filter_food.json new file mode 100644 index 0000000..67b14ad --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/item_filter_food.json @@ -0,0 +1,10 @@ +{ + "parent": "basepower:block/conveyor_base", + "textures": { + "top": "basepower:blocks/item_conveyor_top", + "bottom": "basepower:blocks/filter_bottom", + "side": "basepower:blocks/filter_side_food", + "end": "basepower:blocks/item_conveyor_end", + "rim": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/basepower/models/block/item_filter_fuel.json b/src/main/resources/assets/basepower/models/block/item_filter_fuel.json new file mode 100644 index 0000000..41c8e92 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/item_filter_fuel.json @@ -0,0 +1,10 @@ +{ + "parent": "basepower:block/conveyor_base", + "textures": { + "top": "basepower:blocks/item_conveyor_top", + "bottom": "basepower:blocks/filter_bottom", + "side": "basepower:blocks/filter_side_fuel", + "end": "basepower:blocks/item_conveyor_end", + "rim": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/basepower/models/block/item_filter_inventory.json b/src/main/resources/assets/basepower/models/block/item_filter_inventory.json new file mode 100644 index 0000000..cbec1c3 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/item_filter_inventory.json @@ -0,0 +1,10 @@ +{ + "parent": "basepower:block/conveyor_base", + "textures": { + "top": "basepower:blocks/item_conveyor_top", + "bottom": "basepower:blocks/filter_bottom", + "side": "basepower:blocks/filter_side_inventory", + "end": "basepower:blocks/item_conveyor_end", + "rim": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/basepower/models/block/item_filter_ore.json b/src/main/resources/assets/basepower/models/block/item_filter_ore.json new file mode 100644 index 0000000..040a4fd --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/item_filter_ore.json @@ -0,0 +1,10 @@ +{ + "parent": "basepower:block/conveyor_base", + "textures": { + "top": "basepower:blocks/item_conveyor_top", + "bottom": "basepower:blocks/filter_bottom", + "side": "basepower:blocks/filter_side_ore", + "end": "basepower:blocks/item_conveyor_end", + "rim": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/basepower/models/block/item_filter_overflow.json b/src/main/resources/assets/basepower/models/block/item_filter_overflow.json new file mode 100644 index 0000000..4f71669 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/item_filter_overflow.json @@ -0,0 +1,10 @@ +{ + "parent": "basepower:block/conveyor_base", + "textures": { + "top": "basepower:blocks/item_conveyor_top", + "bottom": "basepower:blocks/filter_bottom", + "side": "basepower:blocks/filter_side_overflow", + "end": "basepower:blocks/item_conveyor_end", + "rim": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/basepower/models/block/item_filter_plant.json b/src/main/resources/assets/basepower/models/block/item_filter_plant.json new file mode 100644 index 0000000..1e097b1 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/item_filter_plant.json @@ -0,0 +1,10 @@ +{ + "parent": "basepower:block/conveyor_base", + "textures": { + "top": "basepower:blocks/item_conveyor_top", + "bottom": "basepower:blocks/filter_bottom", + "side": "basepower:blocks/filter_side_plantable", + "end": "basepower:blocks/item_conveyor_end", + "rim": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/basepower/models/block/item_filter_smelt.json b/src/main/resources/assets/basepower/models/block/item_filter_smelt.json new file mode 100644 index 0000000..ee43633 --- /dev/null +++ b/src/main/resources/assets/basepower/models/block/item_filter_smelt.json @@ -0,0 +1,10 @@ +{ + "parent": "basepower:block/conveyor_base", + "textures": { + "top": "basepower:blocks/item_conveyor_top", + "bottom": "basepower:blocks/filter_bottom", + "side": "basepower:blocks/filter_side_smeltable", + "end": "basepower:blocks/item_conveyor_end", + "rim": "basepower:materials/steel" + } +} diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_0.json b/src/main/resources/assets/basepower/models/block/pipe1_0.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_0.json rename to src/main/resources/assets/basepower/models/block/pipe1_0.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_densuw.json b/src/main/resources/assets/basepower/models/block/pipe1_densuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_densuw.json rename to src/main/resources/assets/basepower/models/block/pipe1_densuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_desuw.json b/src/main/resources/assets/basepower/models/block/pipe1_desuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_desuw.json rename to src/main/resources/assets/basepower/models/block/pipe1_desuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_dnu.json b/src/main/resources/assets/basepower/models/block/pipe1_dnu.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_dnu.json rename to src/main/resources/assets/basepower/models/block/pipe1_dnu.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_ensw.json b/src/main/resources/assets/basepower/models/block/pipe1_ensw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_ensw.json rename to src/main/resources/assets/basepower/models/block/pipe1_ensw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_n.json b/src/main/resources/assets/basepower/models/block/pipe1_n.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_n.json rename to src/main/resources/assets/basepower/models/block/pipe1_n.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_ns.json b/src/main/resources/assets/basepower/models/block/pipe1_ns.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_ns.json rename to src/main/resources/assets/basepower/models/block/pipe1_ns.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_nsuw.json b/src/main/resources/assets/basepower/models/block/pipe1_nsuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_nsuw.json rename to src/main/resources/assets/basepower/models/block/pipe1_nsuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_nsw.json b/src/main/resources/assets/basepower/models/block/pipe1_nsw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_nsw.json rename to src/main/resources/assets/basepower/models/block/pipe1_nsw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_nuw.json b/src/main/resources/assets/basepower/models/block/pipe1_nuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_nuw.json rename to src/main/resources/assets/basepower/models/block/pipe1_nuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe1_nw.json b/src/main/resources/assets/basepower/models/block/pipe1_nw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe1_nw.json rename to src/main/resources/assets/basepower/models/block/pipe1_nw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_0.json b/src/main/resources/assets/basepower/models/block/pipe2_0.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_0.json rename to src/main/resources/assets/basepower/models/block/pipe2_0.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_densuw.json b/src/main/resources/assets/basepower/models/block/pipe2_densuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_densuw.json rename to src/main/resources/assets/basepower/models/block/pipe2_densuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_desuw.json b/src/main/resources/assets/basepower/models/block/pipe2_desuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_desuw.json rename to src/main/resources/assets/basepower/models/block/pipe2_desuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_dnu.json b/src/main/resources/assets/basepower/models/block/pipe2_dnu.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_dnu.json rename to src/main/resources/assets/basepower/models/block/pipe2_dnu.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_ensw.json b/src/main/resources/assets/basepower/models/block/pipe2_ensw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_ensw.json rename to src/main/resources/assets/basepower/models/block/pipe2_ensw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_n.json b/src/main/resources/assets/basepower/models/block/pipe2_n.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_n.json rename to src/main/resources/assets/basepower/models/block/pipe2_n.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_ns.json b/src/main/resources/assets/basepower/models/block/pipe2_ns.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_ns.json rename to src/main/resources/assets/basepower/models/block/pipe2_ns.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_nsuw.json b/src/main/resources/assets/basepower/models/block/pipe2_nsuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_nsuw.json rename to src/main/resources/assets/basepower/models/block/pipe2_nsuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_nsw.json b/src/main/resources/assets/basepower/models/block/pipe2_nsw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_nsw.json rename to src/main/resources/assets/basepower/models/block/pipe2_nsw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_nuw.json b/src/main/resources/assets/basepower/models/block/pipe2_nuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_nuw.json rename to src/main/resources/assets/basepower/models/block/pipe2_nuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe2_nw.json b/src/main/resources/assets/basepower/models/block/pipe2_nw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe2_nw.json rename to src/main/resources/assets/basepower/models/block/pipe2_nw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_0.json b/src/main/resources/assets/basepower/models/block/pipe3_0.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_0.json rename to src/main/resources/assets/basepower/models/block/pipe3_0.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_densuw.json b/src/main/resources/assets/basepower/models/block/pipe3_densuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_densuw.json rename to src/main/resources/assets/basepower/models/block/pipe3_densuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_desuw.json b/src/main/resources/assets/basepower/models/block/pipe3_desuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_desuw.json rename to src/main/resources/assets/basepower/models/block/pipe3_desuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_dnu.json b/src/main/resources/assets/basepower/models/block/pipe3_dnu.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_dnu.json rename to src/main/resources/assets/basepower/models/block/pipe3_dnu.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_ensw.json b/src/main/resources/assets/basepower/models/block/pipe3_ensw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_ensw.json rename to src/main/resources/assets/basepower/models/block/pipe3_ensw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_n.json b/src/main/resources/assets/basepower/models/block/pipe3_n.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_n.json rename to src/main/resources/assets/basepower/models/block/pipe3_n.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_ns.json b/src/main/resources/assets/basepower/models/block/pipe3_ns.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_ns.json rename to src/main/resources/assets/basepower/models/block/pipe3_ns.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_nsuw.json b/src/main/resources/assets/basepower/models/block/pipe3_nsuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_nsuw.json rename to src/main/resources/assets/basepower/models/block/pipe3_nsuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_nsw.json b/src/main/resources/assets/basepower/models/block/pipe3_nsw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_nsw.json rename to src/main/resources/assets/basepower/models/block/pipe3_nsw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_nuw.json b/src/main/resources/assets/basepower/models/block/pipe3_nuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_nuw.json rename to src/main/resources/assets/basepower/models/block/pipe3_nuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe3_nw.json b/src/main/resources/assets/basepower/models/block/pipe3_nw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe3_nw.json rename to src/main/resources/assets/basepower/models/block/pipe3_nw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_0.json b/src/main/resources/assets/basepower/models/block/pipe4_0.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_0.json rename to src/main/resources/assets/basepower/models/block/pipe4_0.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_densuw.json b/src/main/resources/assets/basepower/models/block/pipe4_densuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_densuw.json rename to src/main/resources/assets/basepower/models/block/pipe4_densuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_desuw.json b/src/main/resources/assets/basepower/models/block/pipe4_desuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_desuw.json rename to src/main/resources/assets/basepower/models/block/pipe4_desuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_dnu.json b/src/main/resources/assets/basepower/models/block/pipe4_dnu.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_dnu.json rename to src/main/resources/assets/basepower/models/block/pipe4_dnu.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_ensw.json b/src/main/resources/assets/basepower/models/block/pipe4_ensw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_ensw.json rename to src/main/resources/assets/basepower/models/block/pipe4_ensw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_n.json b/src/main/resources/assets/basepower/models/block/pipe4_n.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_n.json rename to src/main/resources/assets/basepower/models/block/pipe4_n.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_ns.json b/src/main/resources/assets/basepower/models/block/pipe4_ns.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_ns.json rename to src/main/resources/assets/basepower/models/block/pipe4_ns.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_nsuw.json b/src/main/resources/assets/basepower/models/block/pipe4_nsuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_nsuw.json rename to src/main/resources/assets/basepower/models/block/pipe4_nsuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_nsw.json b/src/main/resources/assets/basepower/models/block/pipe4_nsw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_nsw.json rename to src/main/resources/assets/basepower/models/block/pipe4_nsw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_nuw.json b/src/main/resources/assets/basepower/models/block/pipe4_nuw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_nuw.json rename to src/main/resources/assets/basepower/models/block/pipe4_nuw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/pipe4_nw.json b/src/main/resources/assets/basepower/models/block/pipe4_nw.json similarity index 100% rename from src/main/resources/assets/poweradvantage/models/block/pipe4_nw.json rename to src/main/resources/assets/basepower/models/block/pipe4_nw.json diff --git a/src/main/resources/assets/poweradvantage/models/block/steel_frame.json b/src/main/resources/assets/basepower/models/block/steel_frame.json similarity index 94% rename from src/main/resources/assets/poweradvantage/models/block/steel_frame.json rename to src/main/resources/assets/basepower/models/block/steel_frame.json index 6e5ef04..a423e34 100644 --- a/src/main/resources/assets/poweradvantage/models/block/steel_frame.json +++ b/src/main/resources/assets/basepower/models/block/steel_frame.json @@ -1,8 +1,8 @@ { "parent": "block/block", "textures": { - "face": "poweradvantage:blocks/steel_frame", - "particle": "poweradvantage:materials/steel" + "face": "basepower:blocks/steel_frame", + "particle": "basepower:materials/steel" }, "elements": [ { diff --git a/src/main/resources/assets/poweradvantage/models/block/still_off.json b/src/main/resources/assets/basepower/models/block/still_off.json similarity index 96% rename from src/main/resources/assets/poweradvantage/models/block/still_off.json rename to src/main/resources/assets/basepower/models/block/still_off.json index 132b402..8918690 100644 --- a/src/main/resources/assets/poweradvantage/models/block/still_off.json +++ b/src/main/resources/assets/basepower/models/block/still_off.json @@ -4,8 +4,8 @@ "top": "blocks/furnace_top", "front": "blocks/furnace_front_off", "side": "blocks/furnace_side", - "tank": "poweradvantage:materials/steel", - "particle": "poweradvantage:materials/steel" + "tank": "basepower:materials/steel", + "particle": "basepower:materials/steel" }, "elements": [ { diff --git a/src/main/resources/assets/poweradvantage/models/block/still_on.json b/src/main/resources/assets/basepower/models/block/still_on.json similarity index 96% rename from src/main/resources/assets/poweradvantage/models/block/still_on.json rename to src/main/resources/assets/basepower/models/block/still_on.json index 399a8e4..2e3bb66 100644 --- a/src/main/resources/assets/poweradvantage/models/block/still_on.json +++ b/src/main/resources/assets/basepower/models/block/still_on.json @@ -4,8 +4,8 @@ "top": "blocks/furnace_top", "front": "blocks/furnace_front_on", "side": "blocks/furnace_side", - "tank": "poweradvantage:materials/steel", - "particle": "poweradvantage:materials/steel" + "tank": "basepower:materials/steel", + "particle": "basepower:materials/steel" }, "elements": [ { diff --git a/src/main/resources/assets/basepower/models/item/bioplastic_ingot.json b/src/main/resources/assets/basepower/models/item/bioplastic_ingot.json new file mode 100644 index 0000000..96b8cfd --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/bioplastic_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "basepower:items/bioplastic_ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/bucket_crude_oil.json b/src/main/resources/assets/basepower/models/item/bucket_crude_oil.json new file mode 100644 index 0000000..bc0182f --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/bucket_crude_oil.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "basepower:items/bucket_crude_oil" + } +} diff --git a/src/main/resources/assets/basepower/models/item/bucket_refined_oil.json b/src/main/resources/assets/basepower/models/item/bucket_refined_oil.json new file mode 100644 index 0000000..145160a --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/bucket_refined_oil.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "basepower:items/bucket_refined_oil" + } +} diff --git a/src/main/resources/assets/basepower/models/item/converter_rf_electricity.json b/src/main/resources/assets/basepower/models/item/converter_rf_electricity.json new file mode 100644 index 0000000..8016dd4 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/converter_rf_electricity.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/converter_rf_electricity" +} diff --git a/src/main/resources/assets/basepower/models/item/converter_rf_quantum.json b/src/main/resources/assets/basepower/models/item/converter_rf_quantum.json new file mode 100644 index 0000000..20bffbe --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/converter_rf_quantum.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/converter_rf_quantum" +} diff --git a/src/main/resources/assets/basepower/models/item/converter_rf_steam.json b/src/main/resources/assets/basepower/models/item/converter_rf_steam.json new file mode 100644 index 0000000..77e6147 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/converter_rf_steam.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/converter_rf_steam" +} diff --git a/src/main/resources/assets/basepower/models/item/converter_tr_electricity.json b/src/main/resources/assets/basepower/models/item/converter_tr_electricity.json new file mode 100644 index 0000000..8c54bb8 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/converter_tr_electricity.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/converter_tr_electricity" +} diff --git a/src/main/resources/assets/basepower/models/item/fluid_discharge.json b/src/main/resources/assets/basepower/models/item/fluid_discharge.json new file mode 100644 index 0000000..d9af146 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/fluid_discharge.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/fluid_discharge" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/fluid_drain.json b/src/main/resources/assets/basepower/models/item/fluid_drain.json new file mode 100644 index 0000000..60de5a6 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/fluid_drain.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/fluid_drain" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/fluid_metal_tank.json b/src/main/resources/assets/basepower/models/item/fluid_metal_tank.json new file mode 100644 index 0000000..cc8c605 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/fluid_metal_tank.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/fluid_metal_tank" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/fluid_pipe.json b/src/main/resources/assets/basepower/models/item/fluid_pipe.json new file mode 100644 index 0000000..2cfca62 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/fluid_pipe.json @@ -0,0 +1,4 @@ +{ + "parent": "basepower:block/fluid_pipe_ns", + "ambientocclusion": false +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/fluid_pipe_terminal.json b/src/main/resources/assets/basepower/models/item/fluid_pipe_terminal.json new file mode 100644 index 0000000..2cfca62 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/fluid_pipe_terminal.json @@ -0,0 +1,4 @@ +{ + "parent": "basepower:block/fluid_pipe_ns", + "ambientocclusion": false +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/fluid_storage_tank.json b/src/main/resources/assets/basepower/models/item/fluid_storage_tank.json new file mode 100644 index 0000000..33831e3 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/fluid_storage_tank.json @@ -0,0 +1,4 @@ +{ + "parent": "basepower:block/fluid_storage_tank", + "ambientocclusion": false +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/fluid_switch.json b/src/main/resources/assets/basepower/models/item/fluid_switch.json new file mode 100644 index 0000000..e62bd15 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/fluid_switch.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/fluid_switch_on" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/infinite_electricity.json b/src/main/resources/assets/basepower/models/item/infinite_electricity.json new file mode 100644 index 0000000..a1abf24 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/infinite_electricity.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/infinite_electricity" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/infinite_quantum.json b/src/main/resources/assets/basepower/models/item/infinite_quantum.json new file mode 100644 index 0000000..53b56dd --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/infinite_quantum.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/infinite_quantum" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/infinite_steam.json b/src/main/resources/assets/basepower/models/item/infinite_steam.json new file mode 100644 index 0000000..e8f9061 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/infinite_steam.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/infinite_steam" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/item_conveyor.json b/src/main/resources/assets/basepower/models/item/item_conveyor.json new file mode 100644 index 0000000..f042d83 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/item_conveyor.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/item_conveyor" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/item_filter_block.json b/src/main/resources/assets/basepower/models/item/item_filter_block.json new file mode 100644 index 0000000..e820da7 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/item_filter_block.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/item_filter_block" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/item_filter_food.json b/src/main/resources/assets/basepower/models/item/item_filter_food.json new file mode 100644 index 0000000..96db616 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/item_filter_food.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/item_filter_food" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/item_filter_fuel.json b/src/main/resources/assets/basepower/models/item/item_filter_fuel.json new file mode 100644 index 0000000..1399fb3 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/item_filter_fuel.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/item_filter_fuel" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/item_filter_inventory.json b/src/main/resources/assets/basepower/models/item/item_filter_inventory.json new file mode 100644 index 0000000..03a135d --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/item_filter_inventory.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/item_filter_inventory" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/item_filter_ore.json b/src/main/resources/assets/basepower/models/item/item_filter_ore.json new file mode 100644 index 0000000..7a44c34 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/item_filter_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/item_filter_ore" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/item_filter_overflow.json b/src/main/resources/assets/basepower/models/item/item_filter_overflow.json new file mode 100644 index 0000000..caac642 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/item_filter_overflow.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/item_filter_overflow" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/item_filter_plant.json b/src/main/resources/assets/basepower/models/item/item_filter_plant.json new file mode 100644 index 0000000..40beb7a --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/item_filter_plant.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/item_filter_plant" +} \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/item_filter_smelt.json b/src/main/resources/assets/basepower/models/item/item_filter_smelt.json new file mode 100644 index 0000000..5386d84 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/item_filter_smelt.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/item_filter_smelt" +} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/rotator_tool.json b/src/main/resources/assets/basepower/models/item/rotator_tool.json similarity index 50% rename from src/main/resources/assets/poweradvantage/models/item/rotator_tool.json rename to src/main/resources/assets/basepower/models/item/rotator_tool.json index 498abaf..e096fa4 100644 --- a/src/main/resources/assets/poweradvantage/models/item/rotator_tool.json +++ b/src/main/resources/assets/basepower/models/item/rotator_tool.json @@ -1,6 +1,6 @@ { "parent": "item/handheld", "textures": { - "layer0": "poweradvantage:items/rotator_tool" + "layer0": "basepower:items/rotator_tool" } } \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/sprocket.json b/src/main/resources/assets/basepower/models/item/sprocket.json similarity index 53% rename from src/main/resources/assets/poweradvantage/models/item/sprocket.json rename to src/main/resources/assets/basepower/models/item/sprocket.json index f26d464..8555e9f 100644 --- a/src/main/resources/assets/poweradvantage/models/item/sprocket.json +++ b/src/main/resources/assets/basepower/models/item/sprocket.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "poweradvantage:items/sprocket" + "layer0": "basepower:items/sprocket" } } \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/starch.json b/src/main/resources/assets/basepower/models/item/starch.json similarity index 54% rename from src/main/resources/assets/poweradvantage/models/item/starch.json rename to src/main/resources/assets/basepower/models/item/starch.json index ac3db87..5e9dbcf 100644 --- a/src/main/resources/assets/poweradvantage/models/item/starch.json +++ b/src/main/resources/assets/basepower/models/item/starch.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "poweradvantage:items/starch" + "layer0": "basepower:items/starch" } } \ No newline at end of file diff --git a/src/main/resources/assets/basepower/models/item/steel_frame.json b/src/main/resources/assets/basepower/models/item/steel_frame.json new file mode 100644 index 0000000..78e655e --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/steel_frame.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/steel_frame" +} diff --git a/src/main/resources/assets/basepower/models/item/still.json b/src/main/resources/assets/basepower/models/item/still.json new file mode 100644 index 0000000..74f0491 --- /dev/null +++ b/src/main/resources/assets/basepower/models/item/still.json @@ -0,0 +1,3 @@ +{ + "parent": "basepower:block/still_off" +} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_flow.png b/src/main/resources/assets/basepower/textures/blocks/crude_oil_flow.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_flow.png rename to src/main/resources/assets/basepower/textures/blocks/crude_oil_flow.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_flow.png.mcmeta b/src/main/resources/assets/basepower/textures/blocks/crude_oil_flow.png.mcmeta similarity index 91% rename from src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_flow.png.mcmeta rename to src/main/resources/assets/basepower/textures/blocks/crude_oil_flow.png.mcmeta index de3267f..4f0718a 100644 --- a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_flow.png.mcmeta +++ b/src/main/resources/assets/basepower/textures/blocks/crude_oil_flow.png.mcmeta @@ -1,3 +1,3 @@ -{ - "animation": {} +{ + "animation": {} } \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_still.png b/src/main/resources/assets/basepower/textures/blocks/crude_oil_still.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_still.png rename to src/main/resources/assets/basepower/textures/blocks/crude_oil_still.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_still.png.mcmeta b/src/main/resources/assets/basepower/textures/blocks/crude_oil_still.png.mcmeta similarity index 89% rename from src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_still.png.mcmeta rename to src/main/resources/assets/basepower/textures/blocks/crude_oil_still.png.mcmeta index 4b721e0..0645f48 100644 --- a/src/main/resources/assets/poweradvantage/textures/blocks/crude_oil_still.png.mcmeta +++ b/src/main/resources/assets/basepower/textures/blocks/crude_oil_still.png.mcmeta @@ -1,5 +1,5 @@ -{ - "animation": { - "frametime": 2 - } -} +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_bottom.png b/src/main/resources/assets/basepower/textures/blocks/filter_bottom.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_bottom.png rename to src/main/resources/assets/basepower/textures/blocks/filter_bottom.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_block.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_block.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_block.png rename to src/main/resources/assets/basepower/textures/blocks/filter_side_block.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_food.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_food.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_food.png rename to src/main/resources/assets/basepower/textures/blocks/filter_side_food.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_fuel.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_fuel.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_fuel.png rename to src/main/resources/assets/basepower/textures/blocks/filter_side_fuel.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_inventory.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_inventory.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_inventory.png rename to src/main/resources/assets/basepower/textures/blocks/filter_side_inventory.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_ore.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_ore.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_ore.png rename to src/main/resources/assets/basepower/textures/blocks/filter_side_ore.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_overflow.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_overflow.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_overflow.png rename to src/main/resources/assets/basepower/textures/blocks/filter_side_overflow.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_plantable.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_plantable.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_plantable.png rename to src/main/resources/assets/basepower/textures/blocks/filter_side_plantable.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/filter_side_smeltable.png b/src/main/resources/assets/basepower/textures/blocks/filter_side_smeltable.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/filter_side_smeltable.png rename to src/main/resources/assets/basepower/textures/blocks/filter_side_smeltable.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_discharge_face.png b/src/main/resources/assets/basepower/textures/blocks/fluid_discharge_face.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_discharge_face.png rename to src/main/resources/assets/basepower/textures/blocks/fluid_discharge_face.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_discharge_side.png b/src/main/resources/assets/basepower/textures/blocks/fluid_discharge_side.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_discharge_side.png rename to src/main/resources/assets/basepower/textures/blocks/fluid_discharge_side.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_drain_face.png b/src/main/resources/assets/basepower/textures/blocks/fluid_drain_face.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_drain_face.png rename to src/main/resources/assets/basepower/textures/blocks/fluid_drain_face.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_drain_side.png b/src/main/resources/assets/basepower/textures/blocks/fluid_drain_side.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_drain_side.png rename to src/main/resources/assets/basepower/textures/blocks/fluid_drain_side.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_metal_tank_side.png b/src/main/resources/assets/basepower/textures/blocks/fluid_metal_tank_side.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_metal_tank_side.png rename to src/main/resources/assets/basepower/textures/blocks/fluid_metal_tank_side.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_metal_tank_top.png b/src/main/resources/assets/basepower/textures/blocks/fluid_metal_tank_top.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_metal_tank_top.png rename to src/main/resources/assets/basepower/textures/blocks/fluid_metal_tank_top.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_pipe.png b/src/main/resources/assets/basepower/textures/blocks/fluid_pipe.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_pipe.png rename to src/main/resources/assets/basepower/textures/blocks/fluid_pipe.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_switch_off.png b/src/main/resources/assets/basepower/textures/blocks/fluid_switch_off.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_switch_off.png rename to src/main/resources/assets/basepower/textures/blocks/fluid_switch_off.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/fluid_switch_on.png b/src/main/resources/assets/basepower/textures/blocks/fluid_switch_on.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/fluid_switch_on.png rename to src/main/resources/assets/basepower/textures/blocks/fluid_switch_on.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_end.png b/src/main/resources/assets/basepower/textures/blocks/item_conveyor_end.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_end.png rename to src/main/resources/assets/basepower/textures/blocks/item_conveyor_end.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_side.png b/src/main/resources/assets/basepower/textures/blocks/item_conveyor_side.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_side.png rename to src/main/resources/assets/basepower/textures/blocks/item_conveyor_side.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_top.png b/src/main/resources/assets/basepower/textures/blocks/item_conveyor_top.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/item_conveyor_top.png rename to src/main/resources/assets/basepower/textures/blocks/item_conveyor_top.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/metal_panel.png b/src/main/resources/assets/basepower/textures/blocks/metal_panel.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/metal_panel.png rename to src/main/resources/assets/basepower/textures/blocks/metal_panel.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/powercable.png b/src/main/resources/assets/basepower/textures/blocks/powercable.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/powercable.png rename to src/main/resources/assets/basepower/textures/blocks/powercable.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_flow.png b/src/main/resources/assets/basepower/textures/blocks/refined_oil_flow.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_flow.png rename to src/main/resources/assets/basepower/textures/blocks/refined_oil_flow.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_flow.png.mcmeta b/src/main/resources/assets/basepower/textures/blocks/refined_oil_flow.png.mcmeta similarity index 91% rename from src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_flow.png.mcmeta rename to src/main/resources/assets/basepower/textures/blocks/refined_oil_flow.png.mcmeta index de3267f..4f0718a 100644 --- a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_flow.png.mcmeta +++ b/src/main/resources/assets/basepower/textures/blocks/refined_oil_flow.png.mcmeta @@ -1,3 +1,3 @@ -{ - "animation": {} +{ + "animation": {} } \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_still.png b/src/main/resources/assets/basepower/textures/blocks/refined_oil_still.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_still.png rename to src/main/resources/assets/basepower/textures/blocks/refined_oil_still.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_still.png.mcmeta b/src/main/resources/assets/basepower/textures/blocks/refined_oil_still.png.mcmeta similarity index 89% rename from src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_still.png.mcmeta rename to src/main/resources/assets/basepower/textures/blocks/refined_oil_still.png.mcmeta index 4b721e0..0645f48 100644 --- a/src/main/resources/assets/poweradvantage/textures/blocks/refined_oil_still.png.mcmeta +++ b/src/main/resources/assets/basepower/textures/blocks/refined_oil_still.png.mcmeta @@ -1,5 +1,5 @@ -{ - "animation": { - "frametime": 2 - } -} +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/steel_frame.png b/src/main/resources/assets/basepower/textures/blocks/steel_frame.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/steel_frame.png rename to src/main/resources/assets/basepower/textures/blocks/steel_frame.png diff --git a/src/main/resources/assets/poweradvantage/textures/blocks/techreborn_converter.png b/src/main/resources/assets/basepower/textures/blocks/techreborn_converter.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/blocks/techreborn_converter.png rename to src/main/resources/assets/basepower/textures/blocks/techreborn_converter.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/fluid_discharge_gui.png b/src/main/resources/assets/basepower/textures/gui/container/fluid_discharge_gui.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/fluid_discharge_gui.png rename to src/main/resources/assets/basepower/textures/gui/container/fluid_discharge_gui.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/fluid_drain_gui.png b/src/main/resources/assets/basepower/textures/gui/container/fluid_drain_gui.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/fluid_drain_gui.png rename to src/main/resources/assets/basepower/textures/gui/container/fluid_drain_gui.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/fluid_metal_tank_gui.png b/src/main/resources/assets/basepower/textures/gui/container/fluid_metal_tank_gui.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/fluid_metal_tank_gui.png rename to src/main/resources/assets/basepower/textures/gui/container/fluid_metal_tank_gui.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/fluid_storage_tank_gui.png b/src/main/resources/assets/basepower/textures/gui/container/fluid_storage_tank_gui.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/fluid_storage_tank_gui.png rename to src/main/resources/assets/basepower/textures/gui/container/fluid_storage_tank_gui.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor.png rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_block.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_block.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_block.png rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_block.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_food.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_food.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_food.png rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_food.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_fuel.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_fuel.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_fuel.png rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_fuel.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_inventory.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_inventory.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_inventory.png rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_inventory.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_ore.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_ore.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_ore.png rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_ore.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_overflow.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_overflow.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_overflow.png rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_overflow.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_plant.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_plant.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_plant.png rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_plant.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_smelt.png b/src/main/resources/assets/basepower/textures/gui/container/item_conveyor_smelt.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/item_conveyor_smelt.png rename to src/main/resources/assets/basepower/textures/gui/container/item_conveyor_smelt.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/machineGUI_template.png b/src/main/resources/assets/basepower/textures/gui/container/machineGUI_template.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/machineGUI_template.png rename to src/main/resources/assets/basepower/textures/gui/container/machineGUI_template.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/player_inventory.png b/src/main/resources/assets/basepower/textures/gui/container/player_inventory.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/player_inventory.png rename to src/main/resources/assets/basepower/textures/gui/container/player_inventory.png diff --git a/src/main/resources/assets/poweradvantage/textures/gui/container/still_gui.png b/src/main/resources/assets/basepower/textures/gui/container/still_gui.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/gui/container/still_gui.png rename to src/main/resources/assets/basepower/textures/gui/container/still_gui.png diff --git a/src/main/resources/assets/poweradvantage/textures/items/bioplastic_ingot.png b/src/main/resources/assets/basepower/textures/items/bioplastic_ingot.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/items/bioplastic_ingot.png rename to src/main/resources/assets/basepower/textures/items/bioplastic_ingot.png diff --git a/src/main/resources/assets/poweradvantage/textures/items/bucket_crude_oil.png b/src/main/resources/assets/basepower/textures/items/bucket_crude_oil.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/items/bucket_crude_oil.png rename to src/main/resources/assets/basepower/textures/items/bucket_crude_oil.png diff --git a/src/main/resources/assets/poweradvantage/textures/items/bucket_refined_oil.png b/src/main/resources/assets/basepower/textures/items/bucket_refined_oil.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/items/bucket_refined_oil.png rename to src/main/resources/assets/basepower/textures/items/bucket_refined_oil.png diff --git a/src/main/resources/assets/poweradvantage/textures/items/rotator_tool.png b/src/main/resources/assets/basepower/textures/items/rotator_tool.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/items/rotator_tool.png rename to src/main/resources/assets/basepower/textures/items/rotator_tool.png diff --git a/src/main/resources/assets/poweradvantage/textures/items/sprocket.png b/src/main/resources/assets/basepower/textures/items/sprocket.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/items/sprocket.png rename to src/main/resources/assets/basepower/textures/items/sprocket.png diff --git a/src/main/resources/assets/poweradvantage/textures/items/starch.png b/src/main/resources/assets/basepower/textures/items/starch.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/items/starch.png rename to src/main/resources/assets/basepower/textures/items/starch.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/brass.png b/src/main/resources/assets/basepower/textures/materials/brass.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/brass.png rename to src/main/resources/assets/basepower/textures/materials/brass.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/copper.png b/src/main/resources/assets/basepower/textures/materials/copper.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/copper.png rename to src/main/resources/assets/basepower/textures/materials/copper.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/invar.png b/src/main/resources/assets/basepower/textures/materials/invar.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/invar.png rename to src/main/resources/assets/basepower/textures/materials/invar.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/iron.png b/src/main/resources/assets/basepower/textures/materials/iron.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/iron.png rename to src/main/resources/assets/basepower/textures/materials/iron.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/metal_panel.png b/src/main/resources/assets/basepower/textures/materials/metal_panel.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/metal_panel.png rename to src/main/resources/assets/basepower/textures/materials/metal_panel.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/plastic.png b/src/main/resources/assets/basepower/textures/materials/plastic.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/plastic.png rename to src/main/resources/assets/basepower/textures/materials/plastic.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/steel.png b/src/main/resources/assets/basepower/textures/materials/steel.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/steel.png rename to src/main/resources/assets/basepower/textures/materials/steel.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/steel_dark.png b/src/main/resources/assets/basepower/textures/materials/steel_dark.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/steel_dark.png rename to src/main/resources/assets/basepower/textures/materials/steel_dark.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/stone.png b/src/main/resources/assets/basepower/textures/materials/stone.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/stone.png rename to src/main/resources/assets/basepower/textures/materials/stone.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/stone_brick.png b/src/main/resources/assets/basepower/textures/materials/stone_brick.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/stone_brick.png rename to src/main/resources/assets/basepower/textures/materials/stone_brick.png diff --git a/src/main/resources/assets/poweradvantage/textures/materials/wood.png b/src/main/resources/assets/basepower/textures/materials/wood.png similarity index 100% rename from src/main/resources/assets/poweradvantage/textures/materials/wood.png rename to src/main/resources/assets/basepower/textures/materials/wood.png diff --git a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_electricity.json b/src/main/resources/assets/poweradvantage/blockstates/converter_rf_electricity.json deleted file mode 100644 index 97d881e..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_electricity.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:converter_rf_electricity", "y": 90 }, - "facing=north": { "model": "poweradvantage:converter_rf_electricity" }, - "facing=south": { "model": "poweradvantage:converter_rf_electricity", "y": 180 }, - "facing=west": { "model": "poweradvantage:converter_rf_electricity", "y": 270 } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_quantum.json b/src/main/resources/assets/poweradvantage/blockstates/converter_rf_quantum.json deleted file mode 100644 index 5e28590..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_quantum.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:converter_rf_quantum", "y": 90 }, - "facing=north": { "model": "poweradvantage:converter_rf_quantum" }, - "facing=south": { "model": "poweradvantage:converter_rf_quantum", "y": 180 }, - "facing=west": { "model": "poweradvantage:converter_rf_quantum", "y": 270 } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_steam.json b/src/main/resources/assets/poweradvantage/blockstates/converter_rf_steam.json deleted file mode 100644 index 110dd84..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/converter_rf_steam.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:converter_rf_steam", "y": 90 }, - "facing=north": { "model": "poweradvantage:converter_rf_steam" }, - "facing=south": { "model": "poweradvantage:converter_rf_steam", "y": 180 }, - "facing=west": { "model": "poweradvantage:converter_rf_steam", "y": 270 } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/converter_tr_electricity.json b/src/main/resources/assets/poweradvantage/blockstates/converter_tr_electricity.json deleted file mode 100644 index f3c6942..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/converter_tr_electricity.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:converter_tr_electricity", "y": 90 }, - "facing=north": { "model": "poweradvantage:converter_tr_electricity" }, - "facing=south": { "model": "poweradvantage:converter_tr_electricity", "y": 180 }, - "facing=west": { "model": "poweradvantage:converter_tr_electricity", "y": 270 } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_discharge.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_discharge.json deleted file mode 100644 index 33f9842..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/fluid_discharge.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:fluid_discharge", "y": 90 }, - "facing=north": { "model": "poweradvantage:fluid_discharge" }, - "facing=south": { "model": "poweradvantage:fluid_discharge", "y": 180 }, - "facing=west": { "model": "poweradvantage:fluid_discharge", "y": 270 } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_drain.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_drain.json deleted file mode 100644 index 3997fee..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/fluid_drain.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:fluid_drain", "y": 90 }, - "facing=north": { "model": "poweradvantage:fluid_drain" }, - "facing=south": { "model": "poweradvantage:fluid_drain", "y": 180 }, - "facing=west": { "model": "poweradvantage:fluid_drain", "y": 270 } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_metal_tank.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_metal_tank.json deleted file mode 100644 index 167fb81..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/fluid_metal_tank.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:fluid_metal_tank", "y": 90, "uvlock": true }, - "facing=north": { "model": "poweradvantage:fluid_metal_tank", "uvlock": true }, - "facing=south": { "model": "poweradvantage:fluid_metal_tank", "y": 180, "uvlock": true }, - "facing=west": { "model": "poweradvantage:fluid_metal_tank", "y": 270, "uvlock": true } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe.json deleted file mode 100644 index 3d94554..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "__comment": "blockstate parameters MUST be in alphabetical order!", - "variants": { - "down=false,east=false,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false }, - "down=true,east=false,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 90, "y": 0, "uvlock": false }, - "down=false,east=true,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=false,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=false,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 180, "uvlock": false }, - "down=false,east=false,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 270, "y": 0, "uvlock": false }, - "down=false,east=false,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 270, "uvlock": false }, - "down=true,east=true,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 180, "uvlock": false }, - "down=true,east=false,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 90, "uvlock": false }, - "down=true,east=false,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 270, "uvlock": false }, - "down=true,east=false,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_ns", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=false,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 0, "uvlock": false }, - "down=false,east=true,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=true,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 180, "uvlock": false }, - "down=false,east=true,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 180, "uvlock": false }, - "down=false,east=true,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_ns", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=false,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_ns", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=false,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 90, "uvlock": false }, - "down=false,east=false,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=false,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 270, "uvlock": false }, - "down=false,east=false,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 270, "uvlock": false }, - "down=false,east=false,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 0, "uvlock": false }, - "down=true,east=true,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 90, "uvlock": false }, - "down=true,east=true,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 180, "uvlock": false }, - "down=true,east=true,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 90, "uvlock": false }, - "down=true,east=true,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 90, "y": 90, "uvlock": false }, - "down=true,east=false,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=false,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 0, "uvlock": false }, - "down=true,east=false,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=false,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 180, "uvlock": false }, - "down=true,east=false,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 270, "uvlock": false }, - "down=true,east=false,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 270, "uvlock": false }, - "down=false,east=true,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 180, "uvlock": false }, - "down=false,east=true,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=true,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=true,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 180, "uvlock": false }, - "down=false,east=true,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 270, "uvlock": false }, - "down=false,east=true,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 270, "y": 90, "uvlock": false }, - "down=false,east=false,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 270, "y": 0, "uvlock": false }, - "down=false,east=false,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=false,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=false,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 270, "uvlock": false }, - "down=true,east=true,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 180, "uvlock": false }, - "down=true,east=true,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 90, "uvlock": false }, - "down=true,east=true,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 90, "uvlock": false }, - "down=true,east=true,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 180, "uvlock": false }, - "down=true,east=true,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 270, "uvlock": false }, - "down=true,east=true,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_ensw", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=false,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_ensw", "x": 90, "y": 90, "uvlock": false }, - "down=true,east=false,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 0, "uvlock": false }, - "down=true,east=false,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=false,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 270, "uvlock": false }, - "down=false,east=true,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 180, "uvlock": false }, - "down=false,east=true,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=true,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=true,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 270, "uvlock": false }, - "down=false,east=false,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 0, "uvlock": false }, - "down=true,east=true,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 270, "uvlock": false }, - "down=true,east=true,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 270, "y": 0, "uvlock": false }, - "down=true,east=true,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 180, "uvlock": false }, - "down=true,east=true,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 0, "uvlock": false }, - "down=true,east=false,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=true,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=true,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_densuw", "x": 0, "y": 0, "uvlock": false } - - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe_terminal.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe_terminal.json deleted file mode 100644 index a6e7720..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/fluid_pipe_terminal.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "__comment": "blockstate parameters MUST be in alphabetical order!", - "variants": { - "down=false,east=false,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_0", "x": 0, "y": 0, "uvlock": false }, - "down=true,east=false,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 90, "y": 0, "uvlock": false }, - "down=false,east=true,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=false,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=false,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 180, "uvlock": false }, - "down=false,east=false,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_n", "x": 270, "y": 0, "uvlock": false }, - "down=false,east=false,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_n", "x": 0, "y": 270, "uvlock": false }, - "down=true,east=true,north=false,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 180, "uvlock": false }, - "down=true,east=false,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 90, "uvlock": false }, - "down=true,east=false,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 270, "uvlock": false }, - "down=true,east=false,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_ns", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=false,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 90, "y": 0, "uvlock": false }, - "down=false,east=true,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=true,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 180, "uvlock": false }, - "down=false,east=true,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 180, "uvlock": false }, - "down=false,east=true,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_ns", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=false,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_ns", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=false,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 90, "uvlock": false }, - "down=false,east=false,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=false,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 270, "uvlock": false }, - "down=false,east=false,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 0, "y": 270, "uvlock": false }, - "down=false,east=false,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nw", "x": 270, "y": 0, "uvlock": false }, - "down=true,east=true,north=true,south=false,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 90, "uvlock": false }, - "down=true,east=true,north=false,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 180, "uvlock": false }, - "down=true,east=true,north=false,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 90, "uvlock": false }, - "down=true,east=true,north=false,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 90, "y": 90, "uvlock": false }, - "down=true,east=false,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=false,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 0, "uvlock": false }, - "down=true,east=false,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=false,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 180, "uvlock": false }, - "down=true,east=false,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 90, "y": 270, "uvlock": false }, - "down=true,east=false,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 0, "y": 270, "uvlock": false }, - "down=false,east=true,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 180, "uvlock": false }, - "down=false,east=true,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=true,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=true,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 180, "uvlock": false }, - "down=false,east=true,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 270, "uvlock": false }, - "down=false,east=true,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_dnu", "x": 270, "y": 90, "uvlock": false }, - "down=false,east=false,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_dnu", "x": 270, "y": 0, "uvlock": false }, - "down=false,east=false,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsw", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=false,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=false,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nuw", "x": 0, "y": 270, "uvlock": false }, - "down=true,east=true,north=true,south=true,up=false,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 180, "uvlock": false }, - "down=true,east=true,north=true,south=false,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 90, "uvlock": false }, - "down=true,east=true,north=true,south=false,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 90, "uvlock": false }, - "down=true,east=true,north=false,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 180, "uvlock": false }, - "down=true,east=true,north=false,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 270, "uvlock": false }, - "down=true,east=true,north=false,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_ensw", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=false,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_ensw", "x": 90, "y": 90, "uvlock": false }, - "down=true,east=false,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 180, "y": 0, "uvlock": false }, - "down=true,east=false,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=false,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 90, "y": 270, "uvlock": false }, - "down=false,east=true,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 180, "uvlock": false }, - "down=false,east=true,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_ensw", "x": 0, "y": 0, "uvlock": false }, - "down=false,east=true,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=true,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 270, "uvlock": false }, - "down=false,east=false,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_nsuw", "x": 0, "y": 0, "uvlock": false }, - "down=true,east=true,north=true,south=true,up=true,west=false": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 270, "uvlock": false }, - "down=true,east=true,north=true,south=true,up=false,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 270, "y": 0, "uvlock": false }, - "down=true,east=true,north=true,south=false,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 180, "uvlock": false }, - "down=true,east=true,north=false,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 0, "uvlock": false }, - "down=true,east=false,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 0, "y": 90, "uvlock": false }, - "down=false,east=true,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_desuw", "x": 90, "y": 0, "uvlock": false }, - "down=true,east=true,north=true,south=true,up=true,west=true": { "model": "poweradvantage:fluid_pipe_densuw", "x": 0, "y": 0, "uvlock": false } - - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_storage_tank.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_storage_tank.json deleted file mode 100644 index 1becb1c..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/fluid_storage_tank.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:fluid_storage_tank", "y": 90 }, - "facing=north": { "model": "poweradvantage:fluid_storage_tank" }, - "facing=south": { "model": "poweradvantage:fluid_storage_tank", "y": 180 }, - "facing=west": { "model": "poweradvantage:fluid_storage_tank", "y": 270 } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/fluid_switch.json b/src/main/resources/assets/poweradvantage/blockstates/fluid_switch.json deleted file mode 100644 index a3e5b65..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/fluid_switch.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "variants": { - "active=false": { "model": "poweradvantage:fluid_switch_off"}, - "active=true": { "model": "poweradvantage:fluid_switch_on"} - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/infinite_electricity.json b/src/main/resources/assets/poweradvantage/blockstates/infinite_electricity.json deleted file mode 100644 index 8cc55cc..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/infinite_electricity.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:infinite_electricity", "y": 90 }, - "facing=north": { "model": "poweradvantage:infinite_electricity" }, - "facing=south": { "model": "poweradvantage:infinite_electricity", "y": 180 }, - "facing=west": { "model": "poweradvantage:infinite_electricity", "y": 270 } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/infinite_quantum.json b/src/main/resources/assets/poweradvantage/blockstates/infinite_quantum.json deleted file mode 100644 index 7ba2ae4..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/infinite_quantum.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:infinite_quantum", "y": 90 }, - "facing=north": { "model": "poweradvantage:infinite_quantum" }, - "facing=south": { "model": "poweradvantage:infinite_quantum", "y": 180 }, - "facing=west": { "model": "poweradvantage:infinite_quantum", "y": 270 } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/infinite_steam.json b/src/main/resources/assets/poweradvantage/blockstates/infinite_steam.json deleted file mode 100644 index ea59a65..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/infinite_steam.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=east": { "model": "poweradvantage:infinite_steam", "y": 90 }, - "facing=north": { "model": "poweradvantage:infinite_steam" }, - "facing=south": { "model": "poweradvantage:infinite_steam", "y": 180 }, - "facing=west": { "model": "poweradvantage:infinite_steam", "y": 270 } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_conveyor.json b/src/main/resources/assets/poweradvantage/blockstates/item_conveyor.json deleted file mode 100644 index f000863..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/item_conveyor.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "facing=down": { "model": "poweradvantage:item_conveyor", "x": 90 }, - "facing=up": { "model": "poweradvantage:item_conveyor", "x": 270 }, - "facing=north": { "model": "poweradvantage:item_conveyor" }, - "facing=south": { "model": "poweradvantage:item_conveyor", "y": 180 }, - "facing=west": { "model": "poweradvantage:item_conveyor", "y": 270 }, - "facing=east": { "model": "poweradvantage:item_conveyor", "y": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_block.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_block.json deleted file mode 100644 index 9ac2714..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_block.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "poweradvantage:item_filter_block" }, - "facing=south": { "model": "poweradvantage:item_filter_block", "y": 180 }, - "facing=west": { "model": "poweradvantage:item_filter_block", "y": 270 }, - "facing=east": { "model": "poweradvantage:item_filter_block", "y": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_food.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_food.json deleted file mode 100644 index f3d0201..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_food.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "poweradvantage:item_filter_food" }, - "facing=south": { "model": "poweradvantage:item_filter_food", "y": 180 }, - "facing=west": { "model": "poweradvantage:item_filter_food", "y": 270 }, - "facing=east": { "model": "poweradvantage:item_filter_food", "y": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_fuel.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_fuel.json deleted file mode 100644 index e3ddd50..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_fuel.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "poweradvantage:item_filter_fuel" }, - "facing=south": { "model": "poweradvantage:item_filter_fuel", "y": 180 }, - "facing=west": { "model": "poweradvantage:item_filter_fuel", "y": 270 }, - "facing=east": { "model": "poweradvantage:item_filter_fuel", "y": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_inventory.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_inventory.json deleted file mode 100644 index cb50460..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_inventory.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "poweradvantage:item_filter_inventory" }, - "facing=south": { "model": "poweradvantage:item_filter_inventory", "y": 180 }, - "facing=west": { "model": "poweradvantage:item_filter_inventory", "y": 270 }, - "facing=east": { "model": "poweradvantage:item_filter_inventory", "y": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_ore.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_ore.json deleted file mode 100644 index 9983ebc..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_ore.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "poweradvantage:item_filter_ore" }, - "facing=south": { "model": "poweradvantage:item_filter_ore", "y": 180 }, - "facing=west": { "model": "poweradvantage:item_filter_ore", "y": 270 }, - "facing=east": { "model": "poweradvantage:item_filter_ore", "y": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_overflow.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_overflow.json deleted file mode 100644 index cae43ed..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_overflow.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "poweradvantage:item_filter_overflow" }, - "facing=south": { "model": "poweradvantage:item_filter_overflow", "y": 180 }, - "facing=west": { "model": "poweradvantage:item_filter_overflow", "y": 270 }, - "facing=east": { "model": "poweradvantage:item_filter_overflow", "y": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_plant.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_plant.json deleted file mode 100644 index ac947ea..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_plant.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "poweradvantage:item_filter_plant" }, - "facing=south": { "model": "poweradvantage:item_filter_plant", "y": 180 }, - "facing=west": { "model": "poweradvantage:item_filter_plant", "y": 270 }, - "facing=east": { "model": "poweradvantage:item_filter_plant", "y": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/item_filter_smelt.json b/src/main/resources/assets/poweradvantage/blockstates/item_filter_smelt.json deleted file mode 100644 index 072ae29..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/item_filter_smelt.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "poweradvantage:item_filter_smelt" }, - "facing=south": { "model": "poweradvantage:item_filter_smelt", "y": 180 }, - "facing=west": { "model": "poweradvantage:item_filter_smelt", "y": 270 }, - "facing=east": { "model": "poweradvantage:item_filter_smelt", "y": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/blockstates/steel_frame.json b/src/main/resources/assets/poweradvantage/blockstates/steel_frame.json deleted file mode 100644 index c39fa3b..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/steel_frame.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "normal": { "model": "poweradvantage:steel_frame" } - } -} diff --git a/src/main/resources/assets/poweradvantage/blockstates/still.json b/src/main/resources/assets/poweradvantage/blockstates/still.json deleted file mode 100644 index bcd36cb..0000000 --- a/src/main/resources/assets/poweradvantage/blockstates/still.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "variants": { - "active=false,facing=east": { "model": "poweradvantage:still_off", "y": 90 }, - "active=false,facing=north": { "model": "poweradvantage:still_off"}, - "active=false,facing=south": { "model": "poweradvantage:still_off", "y": 180}, - "active=false,facing=west": { "model": "poweradvantage:still_off", "y": 270}, - "active=true,facing=east": { "model": "poweradvantage:still_on", "y": 90 }, - "active=true,facing=north": { "model": "poweradvantage:still_on"}, - "active=true,facing=south": { "model": "poweradvantage:still_on", "y": 180}, - "active=true,facing=west": { "model": "poweradvantage:still_on", "y": 270} - } -} diff --git a/src/main/resources/assets/poweradvantage/lang/de_DE.lang b/src/main/resources/assets/poweradvantage/lang/de_DE.lang deleted file mode 100644 index 4ad6bc1..0000000 --- a/src/main/resources/assets/poweradvantage/lang/de_DE.lang +++ /dev/null @@ -1,55 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Große Ofen (formlos) -nei.poweradvantage.recipehandler.shapedfurnace.name=Große Ofen (geformt) - -tooltip.poweradvantage.empty=Leer -tooltip.poweradvantage.buckets_of=%x Eimer %y - -itemGroup.poweradvantage=Leistungsvorteil - -tile.poweradvantage.fluid_drain.name=Ablauf -tile.poweradvantage.fluid_discharge.name=Austragsrost -tile.poweradvantage.fluid_storage_tank.name=Lagertank -item.poweradvantage.fluid_storage_tank_item.name=Speicher -tile.poweradvantage.fluid_pipe.name=Rohr - -tile.poweradvantage.item_conveyor.name=Förderer -tile.poweradvantage.item_filter_block.name=Block Auswahl Förder -tile.poweradvantage.item_filter_food.name=Lebensmittel Auswahl Förder -tile.poweradvantage.item_filter_fuel.name=Brennstoff Auswahl Förder -tile.poweradvantage.item_filter_inventory.name=Anpassbare Auswahl Förder -tile.poweradvantage.item_filter_ore.name=Erz Auswahl Förder -tile.poweradvantage.item_filter_plant.name=Pflanze Auswahl Förder -tile.poweradvantage.item_filter_smelt.name=Kochbare Auswahl Förder -tile.poweradvantage.item_filter_overflow.name=Überlauf Auswahl Förder -tile.poweradvantage.steel_frame.name=Stahlrahmen - - -item.poweradvantage.starch.name=Kartoffelstärke -item.poweradvantage.bioplastic_ingot.name=Biokunststoff-Barren -item.poweradvantage.sprocket.name=Kettenrad - - -tile.poweradvantage.fluid_metal_tank.name=Metall-Lagertank -item.poweradvantage.rotator_tool.name=Drehwerkzeug - -tile.poweradvantage.infinite_steam.name=Unendlichen Dampfkraft -tile.poweradvantage.infinite_electricity.name=Unendliche Elektrische Leistung -tile.poweradvantage.infinite_quantum.name=Unendliche Quanten Leistung - -tile.poweradvantage.crude_oil.name=Rohöl -fluid.poweradvantage.crude_oil=Rohöl -item.bucket.crude_oil=Eimer Rohöl - - -tile.poweradvantage.still.name=Brennerei - -tile.poweradvantage.refined_oil.name=Raffiniertes Öl -fluid.poweradvantage.refined_oil=Raffiniertes Öl -item.bucket.refined_oil=Eimer für Raffiniertes Öl -tile.poweradvantage.fluid_switch.name=Ventil - -tile.poweradvantage.converter_rf_steam.name=Dampf-RF Leistungstransformator -tile.poweradvantage.converter_rf_electricity.name=Elektrizität-RF Leistungstransformator -tile.poweradvantage.converter_rf_quantum.name=Quant-RF Leistungstransformator -tile.poweradvantage.converter_tr_electricity.name=Elektrizität-EU Leistungstransformator diff --git a/src/main/resources/assets/poweradvantage/lang/en_AU.lang b/src/main/resources/assets/poweradvantage/lang/en_AU.lang deleted file mode 100644 index 4009dfa..0000000 --- a/src/main/resources/assets/poweradvantage/lang/en_AU.lang +++ /dev/null @@ -1,54 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) -nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped) - -tooltip.poweradvantage.empty=Empty -tooltip.poweradvantage.buckets_of=%x buckets of %y - -itemGroup.poweradvantage=Power Advantage - -tile.poweradvantage.fluid_drain.name=Drain -tile.poweradvantage.fluid_discharge.name=Discharge Grate -tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank -item.poweradvantage.fluid_storage_tank_item.name=Storage Tank -tile.poweradvantage.fluid_pipe.name=Pipe - -tile.poweradvantage.item_conveyor.name=Conveyor -tile.poweradvantage.item_filter_block.name=Block Filter Conveyor -tile.poweradvantage.item_filter_food.name=Food Filter Conveyor -tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor -tile.poweradvantage.item_filter_inventory.name=Filter Conveyor -tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor -tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor -tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor -tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor -tile.poweradvantage.steel_frame.name=Steel Frame - - -item.poweradvantage.starch.name=Starch -item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot -item.poweradvantage.sprocket.name=Sprocket - -tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank -item.poweradvantage.rotator_tool.name=Rotation Wrench - -tile.poweradvantage.infinite_steam.name=Unlimited Steam Power -tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power -tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power - -tile.poweradvantage.crude_oil.name=Crude Oil -fluid.poweradvantage.crude_oil=Crude Oil -item.bucket.crude_oil=Bucket of Crude Oil - - -tile.poweradvantage.still.name=Distillation Furnace - -tile.poweradvantage.refined_oil.name=Refined Oil -fluid.poweradvantage.refined_oil=Refined Oil -item.bucket.refined_oil=Bucket of Refined Oil -tile.poweradvantage.fluid_switch.name=Fluid Switch Valve - -tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer -tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer -tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer -tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/poweradvantage/lang/en_CA.lang b/src/main/resources/assets/poweradvantage/lang/en_CA.lang deleted file mode 100644 index 4009dfa..0000000 --- a/src/main/resources/assets/poweradvantage/lang/en_CA.lang +++ /dev/null @@ -1,54 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) -nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped) - -tooltip.poweradvantage.empty=Empty -tooltip.poweradvantage.buckets_of=%x buckets of %y - -itemGroup.poweradvantage=Power Advantage - -tile.poweradvantage.fluid_drain.name=Drain -tile.poweradvantage.fluid_discharge.name=Discharge Grate -tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank -item.poweradvantage.fluid_storage_tank_item.name=Storage Tank -tile.poweradvantage.fluid_pipe.name=Pipe - -tile.poweradvantage.item_conveyor.name=Conveyor -tile.poweradvantage.item_filter_block.name=Block Filter Conveyor -tile.poweradvantage.item_filter_food.name=Food Filter Conveyor -tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor -tile.poweradvantage.item_filter_inventory.name=Filter Conveyor -tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor -tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor -tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor -tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor -tile.poweradvantage.steel_frame.name=Steel Frame - - -item.poweradvantage.starch.name=Starch -item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot -item.poweradvantage.sprocket.name=Sprocket - -tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank -item.poweradvantage.rotator_tool.name=Rotation Wrench - -tile.poweradvantage.infinite_steam.name=Unlimited Steam Power -tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power -tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power - -tile.poweradvantage.crude_oil.name=Crude Oil -fluid.poweradvantage.crude_oil=Crude Oil -item.bucket.crude_oil=Bucket of Crude Oil - - -tile.poweradvantage.still.name=Distillation Furnace - -tile.poweradvantage.refined_oil.name=Refined Oil -fluid.poweradvantage.refined_oil=Refined Oil -item.bucket.refined_oil=Bucket of Refined Oil -tile.poweradvantage.fluid_switch.name=Fluid Switch Valve - -tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer -tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer -tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer -tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/poweradvantage/lang/en_EN.lang b/src/main/resources/assets/poweradvantage/lang/en_EN.lang deleted file mode 100644 index 4009dfa..0000000 --- a/src/main/resources/assets/poweradvantage/lang/en_EN.lang +++ /dev/null @@ -1,54 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) -nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped) - -tooltip.poweradvantage.empty=Empty -tooltip.poweradvantage.buckets_of=%x buckets of %y - -itemGroup.poweradvantage=Power Advantage - -tile.poweradvantage.fluid_drain.name=Drain -tile.poweradvantage.fluid_discharge.name=Discharge Grate -tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank -item.poweradvantage.fluid_storage_tank_item.name=Storage Tank -tile.poweradvantage.fluid_pipe.name=Pipe - -tile.poweradvantage.item_conveyor.name=Conveyor -tile.poweradvantage.item_filter_block.name=Block Filter Conveyor -tile.poweradvantage.item_filter_food.name=Food Filter Conveyor -tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor -tile.poweradvantage.item_filter_inventory.name=Filter Conveyor -tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor -tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor -tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor -tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor -tile.poweradvantage.steel_frame.name=Steel Frame - - -item.poweradvantage.starch.name=Starch -item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot -item.poweradvantage.sprocket.name=Sprocket - -tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank -item.poweradvantage.rotator_tool.name=Rotation Wrench - -tile.poweradvantage.infinite_steam.name=Unlimited Steam Power -tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power -tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power - -tile.poweradvantage.crude_oil.name=Crude Oil -fluid.poweradvantage.crude_oil=Crude Oil -item.bucket.crude_oil=Bucket of Crude Oil - - -tile.poweradvantage.still.name=Distillation Furnace - -tile.poweradvantage.refined_oil.name=Refined Oil -fluid.poweradvantage.refined_oil=Refined Oil -item.bucket.refined_oil=Bucket of Refined Oil -tile.poweradvantage.fluid_switch.name=Fluid Switch Valve - -tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer -tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer -tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer -tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/poweradvantage/lang/en_GB.lang b/src/main/resources/assets/poweradvantage/lang/en_GB.lang deleted file mode 100644 index 4c44e61..0000000 --- a/src/main/resources/assets/poweradvantage/lang/en_GB.lang +++ /dev/null @@ -1,53 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) -nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped) - -tooltip.poweradvantage.empty=Empty -tooltip.poweradvantage.buckets_of=%x buckets of %y - -itemGroup.poweradvantage=Power Advantage - -tile.poweradvantage.fluid_drain.name=Drain -tile.poweradvantage.fluid_discharge.name=Discharge Grate -tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank -item.poweradvantage.fluid_storage_tank_item.name=Storage Tank -tile.poweradvantage.fluid_pipe.name=Pipe - -tile.poweradvantage.item_conveyor.name=Conveyor -tile.poweradvantage.item_filter_block.name=Block Filter Conveyor -tile.poweradvantage.item_filter_food.name=Food Filter Conveyor -tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor -tile.poweradvantage.item_filter_inventory.name=Filter Conveyor -tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor -tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor -tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor -tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor -tile.poweradvantage.steel_frame.name=Steel Frame - - -item.poweradvantage.starch.name=Starch -item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot -item.poweradvantage.sprocket.name=Sprocket - -tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank -item.poweradvantage.rotator_tool.name=Rotation Wrench - -tile.poweradvantage.infinite_steam.name=Unlimited Steam Power -tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power -tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power - -tile.poweradvantage.crude_oil.name=Crude Oil -fluid.poweradvantage.crude_oil=Crude Oil -item.bucket.crude_oil=Bucket of Crude Oil - -tile.poweradvantage.still.name=Distillation Furnace - -tile.poweradvantage.refined_oil.name=Refined Oil -fluid.poweradvantage.refined_oil=Refined Oil -item.bucket.refined_oil=Bucket of Refined Oil -tile.poweradvantage.fluid_switch.name=Fluid Switch Valve - -tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer -tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer -tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer -tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/poweradvantage/lang/en_PT.lang b/src/main/resources/assets/poweradvantage/lang/en_PT.lang deleted file mode 100644 index 9d8cfee..0000000 --- a/src/main/resources/assets/poweradvantage/lang/en_PT.lang +++ /dev/null @@ -1,53 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) -nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped) - -tooltip.poweradvantage.empty=Empty -tooltip.poweradvantage.buckets_of=%x buckets of %y - -itemGroup.poweradvantage=Power Advantage - -tile.poweradvantage.fluid_drain.name=Drain -tile.poweradvantage.fluid_discharge.name=Discharge Grate -tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank -item.poweradvantage.fluid_storage_tank_item.name=Storage Tank -tile.poweradvantage.fluid_pipe.name=Pipe - -tile.poweradvantage.item_conveyor.name=Conveyor -tile.poweradvantage.item_filter_block.name=Block Filter Conveyor -tile.poweradvantage.item_filter_food.name=Food Filter Conveyor -tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor -tile.poweradvantage.item_filter_inventory.name=Filter Conveyor -tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor -tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor -tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor -tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor -tile.poweradvantage.steel_frame.name=Steel Frame - - -item.poweradvantage.starch.name=Starch -item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot -item.poweradvantage.sprocket.name=Sprocket - -tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank -item.poweradvantage.rotator_tool.name=Rotation Wrench - -tile.poweradvantage.infinite_steam.name=Unlimited Steam Power -tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power -tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power - -tile.poweradvantage.crude_oil.name=Black Gold -fluid.poweradvantage.crude_oil=Black Gold -item.bucket.crude_oil=Bucket o' Black Gold - -tile.poweradvantage.still.name='Stillery - -tile.poweradvantage.refined_oil.name=Lamp Oil -fluid.poweradvantage.refined_oil=Lamp Oil -item.bucket.refined_oil=Bucket o' Lamp Oil -tile.poweradvantage.fluid_switch.name=Big Red Valve - -tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer -tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer -tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer -tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/poweradvantage/lang/en_US.lang b/src/main/resources/assets/poweradvantage/lang/en_US.lang deleted file mode 100644 index f4fe620..0000000 --- a/src/main/resources/assets/poweradvantage/lang/en_US.lang +++ /dev/null @@ -1,52 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Large Furnace (Shapeless) -nei.poweradvantage.recipehandler.shapedfurnace.name=Large Furnace (Shaped) - -tooltip.poweradvantage.empty=Empty -tooltip.poweradvantage.buckets_of=%x buckets of %y - -itemGroup.poweradvantage=Power Advantage - -tile.poweradvantage.fluid_drain.name=Drain -tile.poweradvantage.fluid_discharge.name=Discharge Grate -tile.poweradvantage.fluid_storage_tank.name=Portable Fluid Tank -tile.poweradvantage.fluid_pipe.name=Pipe - -tile.poweradvantage.item_conveyor.name=Conveyor -tile.poweradvantage.item_filter_block.name=Block Filter Conveyor -tile.poweradvantage.item_filter_food.name=Food Filter Conveyor -tile.poweradvantage.item_filter_fuel.name=Fuel Filter Conveyor -tile.poweradvantage.item_filter_inventory.name=Filter Conveyor -tile.poweradvantage.item_filter_ore.name=Ore Filter Conveyor -tile.poweradvantage.item_filter_plant.name=Plantable Filter Conveyor -tile.poweradvantage.item_filter_smelt.name=Furnace Filter Conveyor -tile.poweradvantage.item_filter_overflow.name=Overflow Filter Conveyor -tile.poweradvantage.steel_frame.name=Steel Frame - - -item.poweradvantage.starch.name=Starch -item.poweradvantage.bioplastic_ingot.name=Bioplastic Ingot -item.poweradvantage.sprocket.name=Sprocket - - -tile.poweradvantage.fluid_metal_tank.name=Metal Fluid Tank -item.poweradvantage.rotator_tool.name=Rotation Wrench - -tile.poweradvantage.infinite_steam.name=Unlimited Steam Power -tile.poweradvantage.infinite_electricity.name=Unlimited Electrical Power -tile.poweradvantage.infinite_quantum.name=Unlimited Quantum Power - -tile.poweradvantage.crude_oil.name=Crude Oil -fluid.poweradvantage.crude_oil=Crude Oil -item.bucket.crude_oil=Bucket of Crude Oil - -tile.poweradvantage.still.name=Distillation Furnace -tile.poweradvantage.refined_oil.name=Refined Oil -fluid.poweradvantage.refined_oil=Refined Oil -item.bucket.refined_oil=Bucket of Refined Oil -tile.poweradvantage.fluid_switch.name=Fluid Switch Valve - -tile.poweradvantage.converter_rf_steam.name=Steam-RF Transformer -tile.poweradvantage.converter_rf_electricity.name=Electricity-RF Transformer -tile.poweradvantage.converter_rf_quantum.name=Quantum-RF Transformer -tile.poweradvantage.converter_tr_electricity.name=Electricity-EU Transformer diff --git a/src/main/resources/assets/poweradvantage/lang/es_ES.lang b/src/main/resources/assets/poweradvantage/lang/es_ES.lang deleted file mode 100644 index cd391ff..0000000 --- a/src/main/resources/assets/poweradvantage/lang/es_ES.lang +++ /dev/null @@ -1,56 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Gran Horno (no forma) -nei.poweradvantage.recipehandler.shapedfurnace.name=Gran Horno (en forma) - -tooltip.poweradvantage.empty=Vacío -tooltip.poweradvantage.buckets_of =%x cubos de %y - -itemGroup.poweradvantage=Ventaja de Energía - -tile.poweradvantage.fluid_drain.name=Drenaje -tile.poweradvantage.fluid_discharge.name=Descarga Grate -tile.poweradvantage.fluid_storage_tank.name=Tanque de almacenamiento -item.poweradvantage.fluid_storage_tank_item.name=Tanque de almacenamiento -tile.poweradvantage.fluid_pipe.name=Tubo - -tile.poweradvantage.item_conveyor.name=Transportadores -tile.poweradvantage.item_filter_block.name=Bloquear Filtro Transportadores -tile.poweradvantage.item_filter_food.name=Filtro Alimentos Transportadores -tile.poweradvantage.item_filter_fuel.name=Filtro de combustible Transportadores -tile.poweradvantage.item_filter_inventory.name=Filtro Transportadores -tile.poweradvantage.item_filter_ore.name=Ore Transportadores Filtro -tile.poweradvantage.item_filter_plant.name=Plantable Transportadores Filtro -tile.poweradvantage.item_filter_smelt.name=Horno Filtro Transportadores -tile.poweradvantage.item_filter_overflow.name=Desbordamiento Filtro Transportadores -tile.poweradvantage.steel_frame.name=Marco de Acero - - -item.poweradvantage.starch.name=Almidón -item.poweradvantage.bioplastic_ingot.name=Bioplástico Lingote -item.poweradvantage.sprocket.name=Piñón - - -tile.poweradvantage.fluid_metal_tank.name=Tanque de Almacenamiento de Acero -item.poweradvantage.rotator_tool.name=Herramienta de Rotación - -tile.poweradvantage.infinite_steam.name=La Energía de Vapor Infinito -tile.poweradvantage.infinite_electricity.name=Energía Eléctrica Infinito -tile.poweradvantage.infinite_quantum.name=Cuántica Infinito - -tile.poweradvantage.crude_oil.name=Petróleo Crudo -fluid.poweradvantage.crude_oil=Petróleo Crudo -item.bucket.crude_oil.name=Cubo de Crudo - - -tile.poweradvantage.still.name=Destilería - -tile.poweradvantage.refined_oil.name=Refinado de Petróleo -fluid.poweradvantage.refined_oil=Refinado de Petróleo -item.bucket.refined_oil.name=Cubo de Refinado de Petróleo -tile.poweradvantage.fluid_switch.name=Válvula - - -tile.poweradvantage.converter_rf_steam.name=Vapor-RF Transformador -tile.poweradvantage.converter_rf_electricity.name=Electricidad-RF Transformador -tile.poweradvantage.converter_rf_quantum.name=Cuántico-RF Transformador -tile.poweradvantage.converter_tr_electricity.name=Electricidad-EU Transformador diff --git a/src/main/resources/assets/poweradvantage/lang/es_MX.lang b/src/main/resources/assets/poweradvantage/lang/es_MX.lang deleted file mode 100644 index 775e4ea..0000000 --- a/src/main/resources/assets/poweradvantage/lang/es_MX.lang +++ /dev/null @@ -1,56 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Gran Horno (no forma) -nei.poweradvantage.recipehandler.shapedfurnace.name=Gran Horno (en forma) - -tooltip.poweradvantage.empty=Vacío -tooltip.poweradvantage.buckets_of=%x cubos de %y - -itemGroup.poweradvantage=Ventaja de Energía - -tile.poweradvantage.fluid_drain.name=Drenaje -tile.poweradvantage.fluid_discharge.name=Descarga Grate -tile.poweradvantage.fluid_storage_tank.name=Tanque de almacenamiento -item.poweradvantage.fluid_storage_tank_item.name=Tanque de almacenamiento -tile.poweradvantage.fluid_pipe.name=Tubo - -tile.poweradvantage.item_conveyor.name=Transportadores -tile.poweradvantage.item_filter_block.name=Bloquear Filtro Transportadores -tile.poweradvantage.item_filter_food.name=Filtro Alimentos Transportadores -tile.poweradvantage.item_filter_fuel.name=Filtro de combustible Transportadores -tile.poweradvantage.item_filter_inventory.name=Filtro Transportadores -tile.poweradvantage.item_filter_ore.name=Ore Transportadores Filtro -tile.poweradvantage.item_filter_plant.name=Plantable Transportadores Filtro -tile.poweradvantage.item_filter_smelt.name=Horno Filtro Transportadores -tile.poweradvantage.item_filter_overflow.name=Desbordamiento Filtro Transportadores -tile.poweradvantage.steel_frame.name=Marco de Acero - - -item.poweradvantage.starch.name=Almidón -item.poweradvantage.bioplastic_ingot.name=Bioplástico Lingote -item.poweradvantage.sprocket.name=Piñón - - -tile.poweradvantage.fluid_metal_tank.name=Tanque de Almacenamiento de Acero -item.poweradvantage.rotator_tool.name=Herramienta de Rotación - -tile.poweradvantage.infinite_steam.name=La Energía de Vapor Infinito -tile.poweradvantage.infinite_electricity.name=Energía Eléctrica Infinito -tile.poweradvantage.infinite_quantum.name=Cuántica Infinito - -tile.poweradvantage.crude_oil.name=Petróleo Crudo -fluid.poweradvantage.crude_oil=Petróleo Crudo -item.bucket.crude_oil.name=Cubo de Crudo - - -tile.poweradvantage.still.name=Destilería - -tile.poweradvantage.refined_oil.name=Refinado de Petróleo -fluid.poweradvantage.refined_oil=Refinado de Petróleo -item.bucket.refined_oil.name=Cubo de Refinado de Petróleo -tile.poweradvantage.fluid_switch.name=Válvula - - -tile.poweradvantage.converter_rf_steam.name=Vapor-RF Transformador -tile.poweradvantage.converter_rf_electricity.name=Electricidad-RF Transformador -tile.poweradvantage.converter_rf_quantum.name=Cuántico-RF Transformador -tile.poweradvantage.converter_tr_electricity.name=Electricidad-EU Transformador diff --git a/src/main/resources/assets/poweradvantage/lang/it_IT.lang b/src/main/resources/assets/poweradvantage/lang/it_IT.lang deleted file mode 100644 index bae57a5..0000000 --- a/src/main/resources/assets/poweradvantage/lang/it_IT.lang +++ /dev/null @@ -1,55 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Grande Fornace (informe) -nei.poweradvantage.recipehandler.shapedfurnace.name=Grande Fornace (forma) - -tooltip.poweradvantage.empty=vuoto -tooltip.poweradvantage.buckets_of=%x secchi d'%y - -itemGroup.poweradvantage=Potenza Advantage - -tile.poweradvantage.fluid_drain.name=Scarico -tile.poweradvantage.fluid_discharge.name=Griglia di scarico -tile.poweradvantage.fluid_storage_tank.name=Serbatoio -item.poweradvantage.fluid_storage_tank_item.name=Serbatoio -tile.poweradvantage.fluid_pipe.name=Tubo - -tile.poweradvantage.item_conveyor.name=Trasportatore -tile.poweradvantage.item_filter_block.name=Filtro di blocco trasportatore -tile.poweradvantage.item_filter_food.name=Filtro alimentare Conveyor -tile.poweradvantage.item_filter_fuel.name=carburante Filtro Conveyor -tile.poweradvantage.item_filter_inventory.name=Filtro Conveyor -tile.poweradvantage.item_filter_ore.name=Ore Filtro Conveyor -tile.poweradvantage.item_filter_plant.name=Plantable Filtro Conveyor -tile.poweradvantage.item_filter_smelt.name=Forno Filtro Conveyor -tile.poweradvantage.item_filter_overflow.name=Straripamento Filtro Conveyor -tile.poweradvantage.steel_frame.name=Steel Frame - - -item.poweradvantage.starch.name=Amido -item.poweradvantage.bioplastic_ingot.name=Bioplastica Lingotto -item.poweradvantage.sprocket.name=Sprocket - - -tile.poweradvantage.fluid_metal_tank.name=Serbatoio in Metallo -item.poweradvantage.rotator_tool.name=Strumento di Rotazione - -tile.poweradvantage.infinite_steam.name=Forza Vapore Infinite -tile.poweradvantage.infinite_electricity.name=Elettricità Infinite -tile.poweradvantage.infinite_quantum.name=Atomica Infinite - -tile.poweradvantage.crude_oil.name=Olio a Crudo -fluid.poweradvantage.crude_oil=Olio a Crudo -item.bucket.crude_oil.name=Secchio di Greggio - - -tile.poweradvantage.still.name=Distilleria -tile.poweradvantage.refined_oil.name=Olio Raffinato -fluid.poweradvantage.refined_oil=Olio Raffinato -item.bucket.refined_oil.name=Secchio di Olio Raffinato -tile.poweradvantage.fluid_switch.name=Valvola - - -tile.poweradvantage.converter_rf_steam.name=Vapore-RF Trasformatore -tile.poweradvantage.converter_rf_electricity.name=Elettricità-RF Trasformatore -tile.poweradvantage.converter_rf_quantum.name=Quantistico-RF Trasformatore -tile.poweradvantage.converter_tr_electricity.name=Elettricità-EU Trasformatore diff --git a/src/main/resources/assets/poweradvantage/lang/ja_JP.lang b/src/main/resources/assets/poweradvantage/lang/ja_JP.lang deleted file mode 100644 index fdb19de..0000000 --- a/src/main/resources/assets/poweradvantage/lang/ja_JP.lang +++ /dev/null @@ -1,56 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -Translate -nei.poweradvantage.recipehandler.shapelessfurnace.name=大型炉(型崩れ) -nei.poweradvantage.recipehandler.shapedfurnace.name=大型炉(形) - -tooltip.poweradvantage.empty=空 -tooltip.poweradvantage.buckets_of=%yの%xバケット - -itemGroup.poweradvantage=パワー·アドバンテージ - -tile.poweradvantage.fluid_drain.name=ドレン -tile.poweradvantage.fluid_discharge.name=放電グレート -tile.poweradvantage.fluid_storage_tank.name=貯蔵タンク -item.poweradvantage.fluid_storage_tank_item.name=貯蔵タンク -tile.poweradvantage.fluid_pipe.name=パイプ - -tile.poweradvantage.item_conveyor.name=コンベア -tile.poweradvantage.item_filter_block.name=ブロックフィルタコンベア -tile.poweradvantage.item_filter_food.name=フードフィルターコンベア -tile.poweradvantage.item_filter_fuel.name=燃料フィルターコンベア -tile.poweradvantage.item_filter_inventory.name=フィルタコンベヤー -tile.poweradvantage.item_filter_ore.name=鉱石フィルターコンベア -tile.poweradvantage.item_filter_plant.name=プラントフィルタコンベヤー -tile.poweradvantage.item_filter_smelt.name=炉フィルターコンベア -tile.poweradvantage.item_filter_overflow.name=オーバーフローフィルタコンベヤー -tile.poweradvantage.steel_frame.name=鉄骨 - - -item.poweradvantage.starch.name=デンプン -item.poweradvantage.bioplastic_ingot.name=は、バイオプラスチックインゴットを -item.poweradvantage.sprocket.name=スプロケット - -tile.poweradvantage.infinite_steam.name=無限の蒸気動力 -tile.poweradvantage.infinite_electricity.name=無限の電力 -tile.poweradvantage.infinite_quantum.name=無限の量子パワー - - -tile.poweradvantage.fluid_metal_tank.name=金属製貯蔵タンク -item.poweradvantage.rotator_tool.name=回転ツール - -tile.poweradvantage.crude_oil.name=原油 -fluid.poweradvantage.crude_oil=原油 -item.bucket.crude_oil.name=原油のバケット - - -tile.poweradvantage.still.name=蒸留酒製造所 -tile.poweradvantage.refined_oil.name=精製油 -fluid.poweradvantage.refined_oil=精製油 -item.bucket.refined_oil.name=精製油のバケツ -tile.poweradvantage.fluid_switch.name=バルブ - - -tile.poweradvantage.converter_rf_steam.name=蒸気-RFトランス -tile.poweradvantage.converter_rf_electricity.name=電気-RFトランス -tile.poweradvantage.converter_rf_quantum.name=量子-RFトランス -tile.poweradvantage.converter_tr_electricity.name=電気-EUトランス diff --git a/src/main/resources/assets/poweradvantage/lang/ko_KR.lang b/src/main/resources/assets/poweradvantage/lang/ko_KR.lang deleted file mode 100644 index e3aba15..0000000 --- a/src/main/resources/assets/poweradvantage/lang/ko_KR.lang +++ /dev/null @@ -1,56 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=대형 전기로 (못생긴) -nei.poweradvantage.recipehandler.shapedfurnace.name=대형 전기로 (모양) - -tooltip.poweradvantage.empty=빈 -tooltip.tooltip.poweradvantage.buckets_of=%는 X 버킷 - -itemGroup.poweradvantage=전원의 장점을 - -tile.poweradvantage.fluid_drain.name=드레인 -tile.poweradvantage.fluid_discharge.name=방전 화격자 -tile.poweradvantage.fluid_storage_tank.name=저장 탱크 -item.poweradvantage.fluid_storage_tank_item.name=는 저장 탱크를 -tile.poweradvantage.fluid_pipe.name=파이프 - -tile.poweradvantage.item_conveyor.name=컨베이어 -tile.poweradvantage.item_filter_block.name=블록 필터 컨베이어 -tile.poweradvantage.item_filter_food.name=식품 필터 컨베이어 -tile.poweradvantage.item_filter_fuel.name=연료 필터 컨베이어 -tile.poweradvantage.item_filter_inventory.name=필터 컨베이어 -tile.poweradvantage.item_filter_ore.name=광석 필터 컨베이어 -tile.poweradvantage.item_filter_plant.name=물만 주면 식물이 필터 컨베이어 -tile.poweradvantage.item_filter_smelt.name=노 필터 컨베이어 -tile.poweradvantage.item_filter_overflow.name=오버 플로우필터 컨베이어 -tile.poweradvantage.steel_frame.name=스틸 프레임 - - -item.poweradvantage.starch.name=전분 -item.poweradvantage.bioplastic_ingot.name=는 바이오 플라스틱 잉곳을 -item.poweradvantage.sprocket.name=스프로킷 - - -tile.poweradvantage.fluid_metal_tank.name=금속 저장조 -item.poweradvantage.rotator_tool.name=회전 도구 - - -tile.poweradvantage.infinite_steam.name=무한 증기 력 -tile.poweradvantage.infinite_electricity.name=무한 전력 -tile.poweradvantage.infinite_quantum.name=무한 양자 전력 - -tile.poweradvantage.crude_oil.name=원유 -fluid.poweradvantage.crude_oil=원유 -item.bucket.crude_oil.name=원유의 버킷 - - -tile.poweradvantage.still.name=증류소 -tile.poweradvantage.refined_oil.name=정유 -fluid.poweradvantage.refined_oil=정유 -item.bucket.refined_oil.name=정유의 통 -tile.poweradvantage.fluid_switch.name=판막 - - -tile.poweradvantage.converter_rf_steam.name=증기-RF 전원 트랜스 -tile.poweradvantage.converter_rf_electricity.name=전기-RF 전원 트랜스 -tile.poweradvantage.converter_rf_quantum.name=양자-RF 전원 트랜스 -tile.poweradvantage.converter_tr_electricity.name=전기-EU 전원 트랜스 diff --git a/src/main/resources/assets/poweradvantage/lang/pt_BR.lang b/src/main/resources/assets/poweradvantage/lang/pt_BR.lang deleted file mode 100644 index 7dcb668..0000000 --- a/src/main/resources/assets/poweradvantage/lang/pt_BR.lang +++ /dev/null @@ -1,54 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) -nei.poweradvantage.recipehandler.shapelessfurnace.name=Forno Grande (no forma) -nei.poweradvantage.recipehandler.shapedfurnace.name=Forno Grande (em forma) - -tooltip.poweradvantage.empty=vazio -tooltip.poweradvantage.buckets_of=%x baldes de %y - -itemGroup.poweradvantage=Vantagem de Poder - -tile.poweradvantage.fluid_drain.name=Dreno -tile.poweradvantage.fluid_discharge.name=Grate Discharge -tile.poweradvantage.fluid_storage_tank.name=Tanque de armazenamento -item.poweradvantage.fluid_storage_tank_item.name=Tanque de armazenamento -tile.poweradvantage.fluid_pipe.name=Tubulação - -tile.poweradvantage.item_conveyor.name=Transportador -tile.poweradvantage.item_filter_block.name=Bloquear filtro transportador -tile.poweradvantage.item_filter_food.name=Transportador Filtro de Alimentos -tile.poweradvantage.item_filter_fuel.name=Filtro de combustível Transportador -tile.poweradvantage.item_filter_inventory.name=Transportador Filtro -tile.poweradvantage.item_filter_ore.name=Ore Transportadora Filtro -tile.poweradvantage.item_filter_plant.name=Plantable Transportadora Filtro -tile.poweradvantage.item_filter_smelt.name=Fornalha Filtro Transportador -tile.poweradvantage.item_filter_overflow.name=Transbordamento Transportador Filtro -tile.poweradvantage.steel_frame.name=Armação de Aço - - -item.poweradvantage.starch.name=Amido -item.poweradvantage.bioplastic_ingot.name=Bioplastic lingote -item.poweradvantage.sprocket.name=Roda Dentada - - -tile.poweradvantage.fluid_metal_tank.name=Tanque de Armazenamento de Aço -item.poweradvantage.rotator_tool.name=Ferramenta de Rotação - -tile.poweradvantage.infinite_steam.name=Energia a Vapor Infinito -tile.poweradvantage.infinite_electricity.name=Energia Elétrica Infinito -tile.poweradvantage.infinite_quantum.name=Energia Quantum Infinito - -tile.poweradvantage.crude_oil.name=Óleo Cru -fluid.poweradvantage.crude_oil=Óleo Cru -item.bucket.crude_oil.name=Balde de Óleo Cru - - -tile.poweradvantage.still.name=Destilaria -tile.poweradvantage.refined_oil.name=Óleo Refinado -fluid.poweradvantage.refined_oil=Óleo Refinado -item.bucket.refined_oil.name=Balde de Óleo Refinado -tile.poweradvantage.fluid_switch.name=Válvula - -tile.poweradvantage.converter_rf_steam.name=Vapor-RF Transformador -tile.poweradvantage.converter_rf_electricity.name=Electricidade-RF Transformador -tile.poweradvantage.converter_rf_quantum.name=Quantidade-RF Transformador -tile.poweradvantage.converter_tr_electricity.name=Electricidade-EU Transformador diff --git a/src/main/resources/assets/poweradvantage/lang/zh_CN.lang b/src/main/resources/assets/poweradvantage/lang/zh_CN.lang deleted file mode 100644 index bbe2b0d..0000000 --- a/src/main/resources/assets/poweradvantage/lang/zh_CN.lang +++ /dev/null @@ -1,57 +0,0 @@ -language_support_goals=english (en_US,en_EN,en_CA,en_GB, en_AU, en_PT), spanish (es_MX,es_ES), chinese (zh_CN), japanese (ja_JA), portugese (pt_BR), german (de_DE), italian (it_IT), korean (ko_KR) - -nei.poweradvantage.recipehandler.shapelessfurnace.name=大熔炉(无形的) -nei.poweradvantage.recipehandler.shapedfurnace.name=大熔炉(有形的) - -tooltip.poweradvantage.empty=空 -tooltip.poweradvantage.buckets_of=%x水桶的%y - -itemGroup.poweradvantage=能量优势 - -tile.poweradvantage.fluid_drain.name=抽水机 -tile.poweradvantage.fluid_discharge.name=排液器 -tile.poweradvantage.fluid_storage_tank.name=便携式液体储罐 -item.poweradvantage.fluid_storage_tank_item.name=便携式液体储罐 -tile.poweradvantage.fluid_pipe.name=液体管 - -tile.poweradvantage.item_conveyor.name=输送机 -tile.poweradvantage.item_filter_block.name=方块过滤输送机 -tile.poweradvantage.item_filter_food.name=食品过滤输送机 -tile.poweradvantage.item_filter_fuel.name=燃料过滤输送机 -tile.poweradvantage.item_filter_inventory.name=选择过滤输送机 -tile.poweradvantage.item_filter_ore.name=矿物过滤输送机 -tile.poweradvantage.item_filter_plant.name=种子过滤输送机 -tile.poweradvantage.item_filter_smelt.name=熔炉过滤输送机 -tile.poweradvantage.item_filter_overflow.name=溢出过滤输送机 -tile.poweradvantage.steel_frame.name=钢框架 - - -item.poweradvantage.starch.name=淀粉 -item.poweradvantage.bioplastic_ingot.name=生物塑料锭 -item.poweradvantage.sprocket.name=链轮 - - -tile.poweradvantage.fluid_metal_tank.name=金属液罐 -item.poweradvantage.rotator_tool.name=旋转扳手 - -tile.poweradvantage.infinite_steam.name=无限蒸汽动力 -tile.poweradvantage.infinite_electricity.name=无限电力 -tile.poweradvantage.infinite_quantum.name=无限量子动力 - -tile.poweradvantage.crude_oil.name=原油 -fluid.poweradvantage.crude_oil=原油 -item.bucket.crude_oil.name=原油桶 - - -tile.poweradvantage.still.name=酒廠 - -tile.poweradvantage.refined_oil.name=成品油 -fluid.poweradvantage.refined_oil=成品油 -item.bucket.refined_oil.name=成品油的桶 -tile.poweradvantage.fluid_switch.name=閥 - - -tile.poweradvantage.converter_rf_steam.name=蒸汽-RF 變壓器 -tile.poweradvantage.converter_rf_electricity.name=電力-RF 變壓器 -tile.poweradvantage.converter_rf_quantum.name=量子-RF 變壓器 -tile.poweradvantage.converter_tr_electricity.name=電力-EU 變壓器 diff --git a/src/main/resources/assets/poweradvantage/models/block/converter_tr_electricity.json b/src/main/resources/assets/poweradvantage/models/block/converter_tr_electricity.json deleted file mode 100644 index 7dff7e5..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/converter_tr_electricity.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "poweradvantage:blocks/techreborn_converter" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_discharge.json b/src/main/resources/assets/poweradvantage/models/block/fluid_discharge.json deleted file mode 100644 index df0fc23..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_discharge.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/cube_bottom_top", - "textures": { - "top": "poweradvantage:blocks/fluid_discharge_side", - "bottom": "poweradvantage:blocks/fluid_discharge_face", - "side": "poweradvantage:blocks/fluid_discharge_side" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_drain.json b/src/main/resources/assets/poweradvantage/models/block/fluid_drain.json deleted file mode 100644 index 93445c1..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_drain.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/cube_bottom_top", - "textures": { - "top": "poweradvantage:blocks/fluid_drain_face", - "bottom": "poweradvantage:blocks/fluid_drain_side", - "side": "poweradvantage:blocks/fluid_drain_side" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_0.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_0.json deleted file mode 100644 index 51edd2d..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_0.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_0", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_densuw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_densuw.json deleted file mode 100644 index c5e1f92..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_densuw.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_densuw", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_desuw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_desuw.json deleted file mode 100644 index f6e67de..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_desuw.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_desuw", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_dnu.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_dnu.json deleted file mode 100644 index 5ba85dc..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_dnu.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_dnu", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ensw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ensw.json deleted file mode 100644 index b334234..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ensw.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_ensw", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_n.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_n.json deleted file mode 100644 index da4dd3c..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_n.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_n", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ns.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ns.json deleted file mode 100644 index c02fff4..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_ns.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_ns", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsuw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsuw.json deleted file mode 100644 index b5778cc..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsuw.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_nsuw", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsw.json deleted file mode 100644 index 1e3e253..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nsw.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_nsw", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nuw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nuw.json deleted file mode 100644 index 9506607..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nuw.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_nuw", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nw.json b/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nw.json deleted file mode 100644 index 3f87031..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_pipe_nw.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/block", - "parent": "poweradvantage:block/pipe4_nw", - "textures": { - "texture": "poweradvantage:blocks/fluid_pipe", - "particle": "poweradvantage:materials/iron" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_switch_off.json b/src/main/resources/assets/poweradvantage/models/block/fluid_switch_off.json deleted file mode 100644 index 99376fe..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_switch_off.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "poweradvantage:blocks/fluid_switch_off", - "particle": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/fluid_switch_on.json b/src/main/resources/assets/poweradvantage/models/block/fluid_switch_on.json deleted file mode 100644 index a09edb7..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/fluid_switch_on.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "poweradvantage:blocks/fluid_switch_on", - "particle": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/item_conveyor.json b/src/main/resources/assets/poweradvantage/models/block/item_conveyor.json deleted file mode 100644 index f176d90..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/item_conveyor.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "poweradvantage:block/conveyor_base", - "textures": { - "top": "poweradvantage:blocks/item_conveyor_top", - "bottom": "poweradvantage:blocks/item_conveyor_top", - "side": "poweradvantage:blocks/item_conveyor_side", - "end": "poweradvantage:blocks/item_conveyor_end", - "rim": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_block.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_block.json deleted file mode 100644 index 0d2c3a6..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/item_filter_block.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "poweradvantage:block/conveyor_base", - "textures": { - "top": "poweradvantage:blocks/item_conveyor_top", - "bottom": "poweradvantage:blocks/filter_bottom", - "side": "poweradvantage:blocks/filter_side_block", - "end": "poweradvantage:blocks/item_conveyor_end", - "rim": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_food.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_food.json deleted file mode 100644 index 2c1f658..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/item_filter_food.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "poweradvantage:block/conveyor_base", - "textures": { - "top": "poweradvantage:blocks/item_conveyor_top", - "bottom": "poweradvantage:blocks/filter_bottom", - "side": "poweradvantage:blocks/filter_side_food", - "end": "poweradvantage:blocks/item_conveyor_end", - "rim": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_fuel.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_fuel.json deleted file mode 100644 index d12bdef..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/item_filter_fuel.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "poweradvantage:block/conveyor_base", - "textures": { - "top": "poweradvantage:blocks/item_conveyor_top", - "bottom": "poweradvantage:blocks/filter_bottom", - "side": "poweradvantage:blocks/filter_side_fuel", - "end": "poweradvantage:blocks/item_conveyor_end", - "rim": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_inventory.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_inventory.json deleted file mode 100644 index 45200ce..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/item_filter_inventory.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "poweradvantage:block/conveyor_base", - "textures": { - "top": "poweradvantage:blocks/item_conveyor_top", - "bottom": "poweradvantage:blocks/filter_bottom", - "side": "poweradvantage:blocks/filter_side_inventory", - "end": "poweradvantage:blocks/item_conveyor_end", - "rim": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_ore.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_ore.json deleted file mode 100644 index 26dbe01..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/item_filter_ore.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "poweradvantage:block/conveyor_base", - "textures": { - "top": "poweradvantage:blocks/item_conveyor_top", - "bottom": "poweradvantage:blocks/filter_bottom", - "side": "poweradvantage:blocks/filter_side_ore", - "end": "poweradvantage:blocks/item_conveyor_end", - "rim": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_overflow.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_overflow.json deleted file mode 100644 index 8abd3a4..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/item_filter_overflow.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "poweradvantage:block/conveyor_base", - "textures": { - "top": "poweradvantage:blocks/item_conveyor_top", - "bottom": "poweradvantage:blocks/filter_bottom", - "side": "poweradvantage:blocks/filter_side_overflow", - "end": "poweradvantage:blocks/item_conveyor_end", - "rim": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_plant.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_plant.json deleted file mode 100644 index 4d16d31..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/item_filter_plant.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "poweradvantage:block/conveyor_base", - "textures": { - "top": "poweradvantage:blocks/item_conveyor_top", - "bottom": "poweradvantage:blocks/filter_bottom", - "side": "poweradvantage:blocks/filter_side_plantable", - "end": "poweradvantage:blocks/item_conveyor_end", - "rim": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/block/item_filter_smelt.json b/src/main/resources/assets/poweradvantage/models/block/item_filter_smelt.json deleted file mode 100644 index 49deac1..0000000 --- a/src/main/resources/assets/poweradvantage/models/block/item_filter_smelt.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "poweradvantage:block/conveyor_base", - "textures": { - "top": "poweradvantage:blocks/item_conveyor_top", - "bottom": "poweradvantage:blocks/filter_bottom", - "side": "poweradvantage:blocks/filter_side_smeltable", - "end": "poweradvantage:blocks/item_conveyor_end", - "rim": "poweradvantage:materials/steel" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/item/bioplastic_ingot.json b/src/main/resources/assets/poweradvantage/models/item/bioplastic_ingot.json deleted file mode 100644 index 8c08c41..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/bioplastic_ingot.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "poweradvantage:items/bioplastic_ingot" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/bucket_crude_oil.json b/src/main/resources/assets/poweradvantage/models/item/bucket_crude_oil.json deleted file mode 100644 index 2d78353..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/bucket_crude_oil.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "poweradvantage:items/bucket_crude_oil" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/item/bucket_refined_oil.json b/src/main/resources/assets/poweradvantage/models/item/bucket_refined_oil.json deleted file mode 100644 index eb64682..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/bucket_refined_oil.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "poweradvantage:items/bucket_refined_oil" - } -} diff --git a/src/main/resources/assets/poweradvantage/models/item/converter_rf_electricity.json b/src/main/resources/assets/poweradvantage/models/item/converter_rf_electricity.json deleted file mode 100644 index b9b0429..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/converter_rf_electricity.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/converter_rf_electricity" -} diff --git a/src/main/resources/assets/poweradvantage/models/item/converter_rf_quantum.json b/src/main/resources/assets/poweradvantage/models/item/converter_rf_quantum.json deleted file mode 100644 index ca2c0b8..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/converter_rf_quantum.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/converter_rf_quantum" -} diff --git a/src/main/resources/assets/poweradvantage/models/item/converter_rf_steam.json b/src/main/resources/assets/poweradvantage/models/item/converter_rf_steam.json deleted file mode 100644 index 1ca73e4..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/converter_rf_steam.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/converter_rf_steam" -} diff --git a/src/main/resources/assets/poweradvantage/models/item/converter_tr_electricity.json b/src/main/resources/assets/poweradvantage/models/item/converter_tr_electricity.json deleted file mode 100644 index 9a7a15f..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/converter_tr_electricity.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/converter_tr_electricity" -} diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_discharge.json b/src/main/resources/assets/poweradvantage/models/item/fluid_discharge.json deleted file mode 100644 index e0bcaee..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/fluid_discharge.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/fluid_discharge" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_drain.json b/src/main/resources/assets/poweradvantage/models/item/fluid_drain.json deleted file mode 100644 index fc98745..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/fluid_drain.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/fluid_drain" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_metal_tank.json b/src/main/resources/assets/poweradvantage/models/item/fluid_metal_tank.json deleted file mode 100644 index 97ecaa9..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/fluid_metal_tank.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/fluid_metal_tank" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_pipe.json b/src/main/resources/assets/poweradvantage/models/item/fluid_pipe.json deleted file mode 100644 index 097b735..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/fluid_pipe.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "poweradvantage:block/fluid_pipe_ns", - "ambientocclusion": false -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_pipe_terminal.json b/src/main/resources/assets/poweradvantage/models/item/fluid_pipe_terminal.json deleted file mode 100644 index 097b735..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/fluid_pipe_terminal.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "poweradvantage:block/fluid_pipe_ns", - "ambientocclusion": false -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_storage_tank.json b/src/main/resources/assets/poweradvantage/models/item/fluid_storage_tank.json deleted file mode 100644 index a337b20..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/fluid_storage_tank.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "poweradvantage:block/fluid_storage_tank", - "ambientocclusion": false -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/fluid_switch.json b/src/main/resources/assets/poweradvantage/models/item/fluid_switch.json deleted file mode 100644 index f00c542..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/fluid_switch.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/fluid_switch_on" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/infinite_electricity.json b/src/main/resources/assets/poweradvantage/models/item/infinite_electricity.json deleted file mode 100644 index 5b216c8..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/infinite_electricity.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/infinite_electricity" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/infinite_quantum.json b/src/main/resources/assets/poweradvantage/models/item/infinite_quantum.json deleted file mode 100644 index 03aab32..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/infinite_quantum.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/infinite_quantum" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/infinite_steam.json b/src/main/resources/assets/poweradvantage/models/item/infinite_steam.json deleted file mode 100644 index 231eb2c..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/infinite_steam.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/infinite_steam" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/item_conveyor.json b/src/main/resources/assets/poweradvantage/models/item/item_conveyor.json deleted file mode 100644 index 4fa32a5..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/item_conveyor.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/item_conveyor" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_block.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_block.json deleted file mode 100644 index 0e5aca2..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/item_filter_block.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/item_filter_block" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_food.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_food.json deleted file mode 100644 index f238e13..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/item_filter_food.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/item_filter_food" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_fuel.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_fuel.json deleted file mode 100644 index 4fb288b..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/item_filter_fuel.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/item_filter_fuel" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_inventory.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_inventory.json deleted file mode 100644 index 1e3a770..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/item_filter_inventory.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/item_filter_inventory" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_ore.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_ore.json deleted file mode 100644 index ba5c859..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/item_filter_ore.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/item_filter_ore" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_overflow.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_overflow.json deleted file mode 100644 index 92ae073..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/item_filter_overflow.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/item_filter_overflow" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_plant.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_plant.json deleted file mode 100644 index 74d9811..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/item_filter_plant.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/item_filter_plant" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/item_filter_smelt.json b/src/main/resources/assets/poweradvantage/models/item/item_filter_smelt.json deleted file mode 100644 index d4f0bc2..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/item_filter_smelt.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/item_filter_smelt" -} \ No newline at end of file diff --git a/src/main/resources/assets/poweradvantage/models/item/steel_frame.json b/src/main/resources/assets/poweradvantage/models/item/steel_frame.json deleted file mode 100644 index e87a33b..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/steel_frame.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/steel_frame" -} diff --git a/src/main/resources/assets/poweradvantage/models/item/still.json b/src/main/resources/assets/poweradvantage/models/item/still.json deleted file mode 100644 index e70ea2a..0000000 --- a/src/main/resources/assets/poweradvantage/models/item/still.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "poweradvantage:block/still_off" -} \ No newline at end of file diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index a78e751..611a5e3 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,11 +1,11 @@ [ { - "modid": "poweradvantage", - "name": "Power Advantage", + "modid": "basepower", + "name": "basePower", "description": "API for power DrCyano's power systems mods.", "version": "${version}", "mcversion": "${mcversion}", - "url": "https://github.com/MinecraftModDevelopmentMods/PowerAdvantage", + "url": "https://github.com/MinecraftModDevelopmentMods/basePower", "updateUrl": "", "authorList": ["DrCyano (aka Cyanobacterium)"], "credits": "The Forge and FML guys, for making the Forge modding API (you guys are awesome), engineers everywhere, and the mod author DrCyano (aka Cyanobacterium)", diff --git a/src/test/java/zone/moddev/mc/poweradvantage/UniversalBucketStartupTest.java b/src/test/java/zone/moddev/mc/basepower/UniversalBucketStartupTest.java similarity index 97% rename from src/test/java/zone/moddev/mc/poweradvantage/UniversalBucketStartupTest.java rename to src/test/java/zone/moddev/mc/basepower/UniversalBucketStartupTest.java index f52f34a..a7096ab 100644 --- a/src/test/java/zone/moddev/mc/poweradvantage/UniversalBucketStartupTest.java +++ b/src/test/java/zone/moddev/mc/basepower/UniversalBucketStartupTest.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage; +package zone.moddev.mc.basepower; import java.nio.charset.StandardCharsets; import java.nio.file.Files; diff --git a/src/test/java/zone/moddev/mc/basepower/compat/LegacyIdentityTest.java b/src/test/java/zone/moddev/mc/basepower/compat/LegacyIdentityTest.java new file mode 100644 index 0000000..708a540 --- /dev/null +++ b/src/test/java/zone/moddev/mc/basepower/compat/LegacyIdentityTest.java @@ -0,0 +1,124 @@ +package zone.moddev.mc.basepower.compat; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import net.minecraft.init.Bootstrap; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.event.FMLMissingMappingsEvent; +import net.minecraftforge.fml.common.registry.GameRegistry; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import static org.junit.Assert.*; + +public class LegacyIdentityTest { + @Rule public final TemporaryFolder temporary = new TemporaryFolder(); + @BeforeClass public static void bootstrap() { Bootstrap.register(); } + + @Test public void originalConfigIsCopiedOnceAndNewConfigWins() throws Exception { + Path config = temporary.newFolder().toPath(); + Path old = config.resolve("poweradvantage.cfg"), current = config.resolve("basepower.cfg"); + byte[] original = "options { S:recipe_mode=APOCALYPTIC }".getBytes(StandardCharsets.UTF_8); + Files.write(old, original); + LegacyIdentity.migrateConfiguration(current.toFile(), "poweradvantage"); + assertArrayEquals(original, Files.readAllBytes(current)); + byte[] edited = "new user authority".getBytes(StandardCharsets.UTF_8); + Files.write(current, edited); + LegacyIdentity.migrateConfiguration(current.toFile(), "poweradvantage"); + assertArrayEquals(edited, Files.readAllBytes(current)); + assertArrayEquals(original, Files.readAllBytes(old)); + } + + @Test public void originalTileLoadsAndSavesUnderTheNewCanonicalIdentity() { + LegacyIdentity.registerTileEntity(MigrationTile.class, "basepower.test_migration_tile"); + NBTTagCompound source = new NBTTagCompound(); + source.setString("id", "poweradvantage.test_migration_tile"); + source.setInteger("x", 7); source.setInteger("y", 64); source.setInteger("z", -11); + TileEntity loaded = TileEntity.create(null, source); + assertTrue(loaded instanceof MigrationTile); + NBTTagCompound saved = loaded.writeToNBT(new NBTTagCompound()); + assertEquals("basepower.test_migration_tile", saved.getString("id")); + assertEquals(7, saved.getInteger("x")); + assertEquals(-11, saved.getInteger("z")); + assertTrue(TileEntity.create(null, saved) instanceof MigrationTile); + } + + @Test public void unknownOwnedMappingsFailInsteadOfBeingDiscarded() { + ListMultimap missing = ArrayListMultimap.create(); + FMLMissingMappingsEvent.MissingMapping owned = new FMLMissingMappingsEvent.MissingMapping( + GameRegistry.Type.ITEM, new ResourceLocation("poweradvantage", "not_a_real_component"), 30000); + FMLMissingMappingsEvent.MissingMapping foreign = new FMLMissingMappingsEvent.MissingMapping( + GameRegistry.Type.ITEM, new ResourceLocation("unrelated", "not_a_real_component"), 30001); + missing.put("poweradvantage", owned); missing.put("unrelated", foreign); + LegacyIdentity.remapMissingMappings(new FMLMissingMappingsEvent(missing), "poweradvantage", "basepower"); + assertEquals(FMLMissingMappingsEvent.Action.FAIL, owned.getAction()); + assertEquals(FMLMissingMappingsEvent.Action.DEFAULT, foreign.getAction()); + } + + @Test public void bothBlockAndItemMappingsResolveTheExactRegisteredObject() { + ListMultimap missing = ArrayListMultimap.create(); + FMLMissingMappingsEvent.MissingMapping block = new FMLMissingMappingsEvent.MissingMapping( + GameRegistry.Type.BLOCK, new ResourceLocation("legacy_minecraft", "stone"), 2000); + FMLMissingMappingsEvent.MissingMapping item = new FMLMissingMappingsEvent.MissingMapping( + GameRegistry.Type.ITEM, new ResourceLocation("legacy_minecraft", "diamond"), 2001); + missing.put("legacy_minecraft", block); missing.put("legacy_minecraft", item); + LegacyIdentity.remapMissingMappings(new FMLMissingMappingsEvent(missing), "legacy_minecraft", "minecraft"); + assertEquals(FMLMissingMappingsEvent.Action.REMAP, block.getAction()); + assertEquals(FMLMissingMappingsEvent.Action.REMAP, item.getAction()); + assertSame(net.minecraft.init.Blocks.STONE, block.getTarget()); + assertSame(net.minecraft.init.Items.DIAMOND, item.getTarget()); + } + + @Test public void lootMigrationPreservesCustomValuesAndDoesNotActivateTwoCopies() throws Exception { + Path config = temporary.newFolder().toPath(); + Path old = config.resolve("additional-loot-tables/poweradvantage/chests/custom.json"); + Files.createDirectories(old.getParent()); + byte[] original = "{\"name\":\"poweradvantage:sprocket\",\"weight\":17,\"foreign\":\"basemetals:steel_ingot\"}" + .getBytes(StandardCharsets.UTF_8); + Files.write(old, original); + LegacyIdentity.migrateAdditionalLootTables(config, "poweradvantage", "basepower"); + Path current = config.resolve("additional-loot-tables/basepower/chests/custom.json"); + String migrated = new String(Files.readAllBytes(current), StandardCharsets.UTF_8); + assertTrue(migrated.contains("basepower:sprocket")); + assertTrue(migrated.contains("17")); assertTrue(migrated.contains("basemetals:steel_ingot")); + assertFalse(Files.exists(old)); + assertArrayEquals(original, Files.readAllBytes(old.resolveSibling("custom.json.before-basepower"))); + LegacyIdentity.migrateAdditionalLootTables(config, "poweradvantage", "basepower"); + assertEquals(migrated, new String(Files.readAllBytes(current), StandardCharsets.UTF_8)); + } + + @Test public void onlyExactNamespacePrefixesAreRewritten() { + assertEquals("basepower:sprocket", LegacyIdentity.remapIdentifier("poweradvantage:sprocket", "poweradvantage", "basepower")); + assertEquals("otherpoweradvantage:sprocket", LegacyIdentity.remapIdentifier("otherpoweradvantage:sprocket", "poweradvantage", "basepower")); + } + + @Test public void oldAndNewJarsCannotBeLoadedTogether() { + LegacyIdentity.requireReplacementsOnly(id -> false); + for (String name : new String[] { "poweradvantage", "steamadvantage", "electricadvantage" }) { + try { + LegacyIdentity.requireReplacementsOnly(name::equals); + fail("Mixed old/new mod sets must stop before configuration or world migration"); + } catch (IllegalStateException expected) { + assertTrue(expected.getMessage().contains(name)); + assertTrue(expected.getMessage().contains("Remove")); + } + } + } + + @Test public void steamLootKeepsTheFourPersistedEnchantmentKeysButRenamesItems() { + for (String name : new String[] { "rapid_reload", "powderless", "high_explosive", "recoil" }) { + assertEquals("steamadvantage:" + name, + LegacyIdentity.remapIdentifier("steamadvantage:" + name, "steamadvantage", "basesteam")); + } + assertEquals("basesteam:musket", LegacyIdentity.remapIdentifier("steamadvantage:musket", "steamadvantage", "basesteam")); + } + + public static class MigrationTile extends TileEntity { } +} diff --git a/src/test/java/zone/moddev/mc/basepower/compat/LegacyLevelDataTest.java b/src/test/java/zone/moddev/mc/basepower/compat/LegacyLevelDataTest.java new file mode 100644 index 0000000..97d9608 --- /dev/null +++ b/src/test/java/zone/moddev/mc/basepower/compat/LegacyLevelDataTest.java @@ -0,0 +1,120 @@ +package zone.moddev.mc.basepower.compat; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.io.OutputStream; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import static org.junit.Assert.*; + +public class LegacyLevelDataTest { + @Rule public final TemporaryFolder temporary = new TemporaryFolder(); + + private NBTTagCompound original() { + NBTTagCompound root = new NBTTagCompound(), forge = new NBTTagCompound(); + NBTTagList fluids = new NBTTagList(); + for (String id : new String[] { "poweradvantage:crude_oil", "minecraft:water", "basemetals:mercury", + "poweradvantage:refined_oil", "othermod:crude_oil" }) fluids.appendTag(new NBTTagString(id)); + forge.setTag("DefaultFluidList", fluids); + forge.setInteger("Unrelated", 12345); + root.setTag("Forge", forge); + root.setString("PlayerCustomText", "poweradvantage:crude_oil"); + root.setIntArray("Energy", new int[] { 0x3f800001, 0x44a00000 }); + return root; + } + + @Test public void onlyTheTwoOwnedFluidOwnerNamesChange() { + NBTTagCompound root = original(); + assertTrue(LegacyLevelData.remapFluidDefaults(root)); + NBTTagList fluids = root.getCompoundTag("Forge").getTagList("DefaultFluidList", 8); + assertEquals(5, fluids.tagCount()); + assertEquals("basepower:crude_oil", fluids.getStringTagAt(0)); + assertEquals("minecraft:water", fluids.getStringTagAt(1)); + assertEquals("basemetals:mercury", fluids.getStringTagAt(2)); + assertEquals("basepower:refined_oil", fluids.getStringTagAt(3)); + assertEquals("othermod:crude_oil", fluids.getStringTagAt(4)); + assertEquals("poweradvantage:crude_oil", root.getString("PlayerCustomText")); + assertEquals(12345, root.getCompoundTag("Forge").getInteger("Unrelated")); + assertArrayEquals(new int[] {0x3f800001, 0x44a00000}, root.getIntArray("Energy")); + assertFalse(LegacyLevelData.remapFluidDefaults(root)); + } + + @Test public void bothHeadersHaveExactBackupsAndAByteStableSecondPass() throws Exception { + Path world = temporary.newFolder().toPath(); + for (String name : new String[] { "level.dat", "level.dat_old" }) { + try (OutputStream output = Files.newOutputStream(world.resolve(name))) { + CompressedStreamTools.writeCompressed(original(), output); + } + } + byte[] before = Files.readAllBytes(world.resolve("level.dat")); + LegacyLevelData.migrateWorld(world); + byte[] migrated = Files.readAllBytes(world.resolve("level.dat")); + assertFalse(java.util.Arrays.equals(before, migrated)); + try (java.util.stream.Stream backups = Files.list(world.resolve("basepower-migration-backups"))) { + Path[] files = backups.toArray(Path[]::new); + assertEquals(2, files.length); + for (Path backup : files) assertArrayEquals(before, Files.readAllBytes(backup)); + } + LegacyLevelData.migrateWorld(world); + assertArrayEquals(migrated, Files.readAllBytes(world.resolve("level.dat"))); + assertArrayEquals(migrated, Files.readAllBytes(world.resolve("level.dat_old"))); + } + + @Test public void aWorldWithoutOwnedDefaultsIsNotRewritten() throws Exception { + Path world = temporary.newFolder().toPath(); + NBTTagCompound root = new NBTTagCompound(); root.setString("Untouched", "value"); + try (OutputStream output = Files.newOutputStream(world.resolve("level.dat"))) { + CompressedStreamTools.writeCompressed(root, output); + } + byte[] before = Files.readAllBytes(world.resolve("level.dat")); + LegacyLevelData.migrateWorld(world); + assertArrayEquals(before, Files.readAllBytes(world.resolve("level.dat"))); + assertFalse(Files.exists(world.resolve("basepower-migration-backups"))); + } + + @Test public void savedModOwnersChangeOnlyForInstalledReplacements() { + NBTTagCompound root = new NBTTagCompound(), fml = new NBTTagCompound(); + NBTTagList mods = new NBTTagList(); + for (String name : new String[] { "poweradvantage", "steamadvantage", "electricadvantage", "basemetals" }) { + NBTTagCompound mod = new NBTTagCompound(); mod.setString("ModId", name); mod.setString("ModVersion", "old-version"); + mods.appendTag(mod); + } + fml.setTag("ModList", mods); root.setTag("FML", fml); + java.util.Set installed = new java.util.HashSet<>(java.util.Arrays.asList("basepower", "basesteam")); + assertTrue(LegacyLevelData.remapModList(root, installed)); + assertEquals("basepower", mods.getCompoundTagAt(0).getString("ModId")); + assertEquals("basesteam", mods.getCompoundTagAt(1).getString("ModId")); + assertEquals("electricadvantage", mods.getCompoundTagAt(2).getString("ModId")); + assertEquals("basemetals", mods.getCompoundTagAt(3).getString("ModId")); + for (int index = 0; index < 4; index++) assertEquals("old-version", mods.getCompoundTagAt(index).getString("ModVersion")); + assertFalse(LegacyLevelData.remapModList(root, installed)); + } + + @Test public void ambiguousOldAndNewOwnersFailBeforeChangingTheHeader() throws Exception { + Path world = temporary.newFolder().toPath(); + NBTTagCompound root = original(), fml = new NBTTagCompound(); + NBTTagList mods = new NBTTagList(); + for (String name : new String[] { "poweradvantage", "basepower" }) { + NBTTagCompound mod = new NBTTagCompound(); mod.setString("ModId", name); mods.appendTag(mod); + } + fml.setTag("ModList", mods); root.setTag("FML", fml); + Path header = world.resolve("level.dat"); + try (OutputStream output = Files.newOutputStream(header)) { + CompressedStreamTools.writeCompressed(root, output); + } + byte[] before = Files.readAllBytes(header); + try { + LegacyLevelData.migrateWorld(world); + fail("An ambiguous old/new installation must not be silently accepted"); + } catch (IllegalStateException expected) { + assertTrue(expected.getMessage().contains("both poweradvantage and basepower")); + } + assertArrayEquals(before, Files.readAllBytes(header)); + assertFalse(Files.exists(world.resolve("basepower-migration-backups"))); + } +} diff --git a/src/test/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentityTest.java b/src/test/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentityTest.java new file mode 100644 index 0000000..4445015 --- /dev/null +++ b/src/test/java/zone/moddev/mc/basepower/compat/LegacyWorldgenIdentityTest.java @@ -0,0 +1,440 @@ +package zone.moddev.mc.basepower.compat; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import static org.junit.Assert.*; + +public class LegacyWorldgenIdentityTest { + @Rule public final TemporaryFolder temporary = new TemporaryFolder(); + + private Path root() throws IOException { return temporary.newFolder().toPath(); } + private Path put(Path root, String relative, String json) throws IOException { + Path path = root.resolve(relative); + Files.createDirectories(path.getParent()); + Files.write(path, json.getBytes(StandardCharsets.UTF_8)); + return path; + } + private JsonObject read(Path path) throws IOException { + return new JsonParser().parse(new String(Files.readAllBytes(path), StandardCharsets.UTF_8)).getAsJsonObject(); + } + private String os1(String owner) { + return "{\"dimensions\":[{\"dimension\":0,\"ores\":[{\"blockID\":\"" + owner + + ":crude_oil\",\"frequency\":0.25,\"minHeight\":16,\"maxHeight\":64}]}]}"; + } + private String provider(String owner, String block) { + return "{\"schema_version\":3,\"provider_revision\":1,\"provider_modid\":\"" + owner + + "\",\"fluid_deposits\":{\"" + owner + ":fluid_deposit/desert_crude_oil\":{\"block\":\"" + + block + "\",\"enabled\":false}}}"; + } + private List backups(Path root) throws IOException { + try (Stream walk = Files.walk(root)) { + return walk.filter(path -> path.getFileName().toString().endsWith(".bak")).collect(Collectors.toList()); + } + } + private void fails(Path root) throws Exception { + try { + LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower"); + fail("Expected fail-closed migration"); + } catch (IOException expected) { assertFalse(expected.getMessage().isEmpty()); } + } + + @Test public void oldOs1FilenameIsRetiredAndParametersAreUnchanged() throws Exception { + Path root = root(); + String original = os1("poweradvantage"); + Path old = put(root, "orespawn/poweradvantage.json", original); + assertEquals(2, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower")); + assertFalse(Files.exists(old)); + JsonObject ore = read(root.resolve("orespawn/basepower.json")).getAsJsonArray("dimensions") + .get(0).getAsJsonObject().getAsJsonArray("ores").get(0).getAsJsonObject(); + assertEquals("basepower:crude_oil", ore.get("blockID").getAsString()); + assertEquals(0.25, ore.get("frequency").getAsDouble(), 0); + assertEquals(64, ore.get("maxHeight").getAsInt()); + assertEquals(original, new String(Files.readAllBytes(backups(root).get(0)), StandardCharsets.UTF_8)); + assertEquals(0, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower")); + assertEquals(1, backups(root).size()); + } + + @Test public void explicitProviderPreventsBridgeOverwritingItFromEitherLegacyFilename() throws Exception { + Path root = root(); + Path explicit = put(root, "basepower-orespawn.json", provider("basepower", "othermod:oil")); + byte[] authority = Files.readAllBytes(explicit); + put(root, "orespawn/poweradvantage.json", os1("poweradvantage")); + put(root, "orespawn/basepower.json", os1("basepower")); + assertEquals(2, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower")); + assertArrayEquals(authority, Files.readAllBytes(explicit)); + assertFalse(Files.exists(root.resolve("orespawn/poweradvantage.json"))); + assertFalse(Files.exists(root.resolve("orespawn/basepower.json"))); + assertEquals(2, backups(root).size()); + } + + @Test public void oldProviderBecomesLoadedOwnerWithoutEnablingUserDisabledRule() throws Exception { + Path root = root(); + put(root, "poweradvantage-orespawn.json", provider("poweradvantage", "poweradvantage:crude_oil")); + assertEquals(2, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower")); + JsonObject migrated = read(root.resolve("basepower-orespawn.json")); + assertEquals("basepower", migrated.get("provider_modid").getAsString()); + JsonObject rule = migrated.getAsJsonObject("fluid_deposits") + .getAsJsonObject("basepower:fluid_deposit/desert_crude_oil"); + assertEquals("basepower:crude_oil", rule.get("block").getAsString()); + assertFalse(rule.get("enabled").getAsBoolean()); + assertEquals(0, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower")); + } + + @Test public void conflictingAuthoritiesFailBeforeAnyWriteOrBackup() throws Exception { + Path root = root(); + Path old = put(root, "poweradvantage-orespawn.json", provider("poweradvantage", "poweradvantage:crude_oil")); + put(root, "basepower-orespawn.json", provider("basepower", "othermod:oil")); + byte[] before = Files.readAllBytes(old); + fails(root); + assertArrayEquals(before, Files.readAllBytes(old)); + assertTrue(backups(root).isEmpty()); + } + + @Test public void savedWorldRewritesIdsManifestsAndSelectorsButNotTagsOrText() throws Exception { + Path world = root(); + Path profile = put(world, "serverconfig/orespawn-worldgen.json", "{\"schema_version\":5," + + "\"ores\":{\"electricadvantage:ore/lithium\":{\"block\":\"electricadvantage:li_ore\"," + + "\"enabled\":false,\"source_provider\":\"electricadvantage\",\"host_tags\":[\"electricadvantage:stone\"]," + + "\"host_blocks\":[\"electricadvantage:steel_frame\",{\"block\":\"other:stone\"}]," + + "\"notes\":\"electricadvantage:li_ore\"}},\"providers\":{\"electricadvantage\":{" + + "\"profile_defaults_applied\":true,\"known_ores\":[\"electricadvantage:ore/lithium\"]}}," + + "\"resource_sources\":{\"lithium\":\"electricadvantage\",\"sulfur\":\"none\"}," + + "\"description\":\"electricadvantage:li_ore\"}"); + Path unrelated = put(world, "another/serverconfig/orespawn-worldgen.json", "not JSON"); + assertEquals(1, LegacyWorldgenIdentity.migrateWorld(world, "electricadvantage", "baseelectric")); + JsonObject migrated = read(profile); + JsonObject rule = migrated.getAsJsonObject("ores").getAsJsonObject("baseelectric:ore/lithium"); + assertEquals("baseelectric:li_ore", rule.get("block").getAsString()); + assertEquals("baseelectric", rule.get("source_provider").getAsString()); + assertEquals("electricadvantage:stone", rule.getAsJsonArray("host_tags").get(0).getAsString()); + assertEquals("baseelectric:steel_frame", rule.getAsJsonArray("host_blocks").get(0).getAsString()); + assertEquals("electricadvantage:li_ore", rule.get("notes").getAsString()); + assertEquals("baseelectric", migrated.getAsJsonObject("resource_sources").get("lithium").getAsString()); + assertEquals("none", migrated.getAsJsonObject("resource_sources").get("sulfur").getAsString()); + assertFalse(migrated.getAsJsonObject("providers").has("electricadvantage")); + assertEquals("not JSON", new String(Files.readAllBytes(unrelated), StandardCharsets.UTF_8)); + assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, "electricadvantage", "baseelectric")); + } + + @Test public void legacyWorldRulesRememberModernDefaultsSoTheyCannotBeAddedAlongside() throws Exception { + Path world = root(); + Path profile = put(world, "serverconfig/orespawn-worldgen.json", "{\"schema_version\":5,\"ores\":{" + + "\"poweradvantage:legacy/poweradvantage_crude_oil_0\":{\"block\":\"poweradvantage:crude_oil\"," + + "\"enabled\":false}}}"); + LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"); + JsonObject migrated = read(profile); + assertTrue(migrated.getAsJsonObject("ores").has("basepower:legacy/basepower_crude_oil_0")); + JsonObject manifest = migrated.getAsJsonObject("providers").getAsJsonObject("basepower"); + assertTrue(manifest.get("profile_defaults_applied").getAsBoolean()); + assertEquals("basepower:fluid_deposit/desert_crude_oil", manifest.getAsJsonArray("known_fluid_deposits") + .get(0).getAsString()); + assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower")); + } + + @Test public void malformedOrDuplicateOwnedJsonFailsWithoutImportingDefaults() throws Exception { + for (String invalid : new String[] { "[]", "{unquoted:true}", "{\"dimensions\":[],\"dimensions\":[]}", + "{\"dimensions\":[]} {}", "{\"dimensions\":[{\"dimension\":null,\"ores\":[]}]}", + "{\"dimensions\":[{\"dimension\":0,\"ores\":[{\"blockID\":null}]}]}" }) { + Path root = root(); + Path old = put(root, "orespawn/poweradvantage.json", invalid); + fails(root); + assertEquals(invalid, new String(Files.readAllBytes(old), StandardCharsets.UTF_8)); + assertFalse(Files.exists(root.resolve("orespawn/basepower.json"))); + assertTrue(backups(root).isEmpty()); + } + } + + @Test public void keyCollisionsInWorldAreNotSilentlyMerged() throws Exception { + Path world = root(); + Path profile = put(world, "serverconfig/orespawn-worldgen.json", "{\"ores\":{" + + "\"poweradvantage:ore/custom\":{\"block\":\"poweradvantage:crude_oil\",\"enabled\":false}," + + "\"basepower:ore/custom\":{\"block\":\"basepower:crude_oil\",\"enabled\":true}}}"); + byte[] before = Files.readAllBytes(profile); + try { LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"); fail(); } + catch (IOException expected) { assertTrue(expected.getMessage().contains("Conflicting")); } + assertArrayEquals(before, Files.readAllBytes(profile)); + assertTrue(backups(world).isEmpty()); + } + + @Test public void existingBridgeMarkerCannotSilentlySkipLegacyAuthority() throws Exception { + Path root = root(); + put(root, "orespawn/poweradvantage.json", os1("poweradvantage")); + put(root, ".orespawn-legacy-bridge-migrated", "provider_schema=4"); + fails(root); + assertTrue(backups(root).isEmpty()); + } + + @Test public void standaloneOldImportsRequireReconciliationInsteadOfDuplicatingNewProvider() throws Exception { + Path root = root(); + put(root, "orespawn/poweradvantage.json", os1("poweradvantage")); + put(root, "orespawn-orespawn.json", "{\"ores\":{\"orespawn:legacy/poweradvantage/poweradvantage_crude_oil_0\":{" + + "\"block\":\"poweradvantage:crude_oil\"}}}"); + fails(root); + assertTrue(Files.exists(root.resolve("orespawn/poweradvantage.json"))); + assertTrue(backups(root).isEmpty()); + } + + @Test public void originalBackupSurvivesFurtherUserEditsAndSecondMigration() throws Exception { + Path world = root(); + Path profile = put(world, "serverconfig/orespawn-worldgen.json", "{\"ores\":{\"poweradvantage:ore/custom\":{" + + "\"block\":\"poweradvantage:crude_oil\",\"enabled\":false}}}"); + byte[] original = Files.readAllBytes(profile); + LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"); + Path backup = backups(world).get(0); + put(world, "serverconfig/orespawn-worldgen.json", "{\"ores\":{\"poweradvantage:ore/custom\":{" + + "\"block\":\"poweradvantage:crude_oil\",\"enabled\":true}}}"); + LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"); + assertArrayEquals(original, Files.readAllBytes(backup)); + assertEquals(2, backups(world).size()); + assertTrue(read(profile).getAsJsonObject("ores").getAsJsonObject("basepower:ore/custom") + .get("enabled").getAsBoolean()); + } + + @Test public void unsupportedPairsCannotBecomePathsAndMissingFilesAreNoOps() throws Exception { + Path root = root(); + try { LegacyWorldgenIdentity.migrateConfig(root, "../escape", "basepower"); fail(); } + catch (IllegalArgumentException expected) { assertTrue(backups(root).isEmpty()); } + assertEquals(0, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower")); + assertEquals(0, LegacyWorldgenIdentity.migrateWorld(root, "poweradvantage", "basepower")); + assertEquals("baseelectric", LegacyWorldgenIdentity.migrateSelectorValue("electricadvantage", + "electricadvantage", "baseelectric")); + assertEquals("other", LegacyWorldgenIdentity.migrateSelectorValue("other", "electricadvantage", "baseelectric")); + } + + @Test public void invalidLegacyNumbersAndUnsupportedDisableFailClosed() throws Exception { + for (String extra : new String[] { "\"frequency\":\"oops\"", "\"frequency\":-1", "\"size\":1.5", + "\"minHeight\":-1", "\"maxHeight\":257", "\"blockMeta\":16", "\"enabled\":false" }) { + Path root = root(); + put(root, "orespawn/poweradvantage.json", "{\"dimensions\":[{\"dimension\":0,\"ores\":[{" + + "\"blockID\":\"poweradvantage:crude_oil\"," + extra + "}]}]}"); + fails(root); + assertTrue(backups(root).isEmpty()); + } + } + + @Test public void os3BlockNamesAreScopedAndCustomGeneratorNamesAreNotRewritten() throws Exception { + Path root = root(); + put(root, "orespawn3/poweradvantage.json", "{\"version\":\"1.0\",\"spawns\":{\"custom\":{" + + "\"feature\":\"poweradvantage:generator\",\"blocks\":[{\"name\":\"poweradvantage:crude_oil\"," + + "\"chance\":100,\"metadata\":0}]}}}"); + assertEquals(2, LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower")); + JsonObject spawn = read(root.resolve("orespawn3/basepower.json")).getAsJsonObject("spawns").getAsJsonObject("custom"); + assertEquals("basepower:crude_oil", spawn.getAsJsonArray("blocks").get(0).getAsJsonObject().get("name").getAsString()); + assertEquals("poweradvantage:generator", spawn.get("feature").getAsString()); + } + + @Test public void preexistingCorruptBackupIsNeverOverwritten() throws Exception { + Path world = root(); + String json = "{\"ores\":{\"poweradvantage:ore/custom\":{\"block\":\"poweradvantage:crude_oil\"}}}"; + Path profile = put(world, "serverconfig/orespawn-worldgen.json", json); + LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"); + Path backup = backups(world).get(0); + Files.write(backup, "corrupt".getBytes(StandardCharsets.UTF_8)); + Files.write(profile, json.getBytes(StandardCharsets.UTF_8)); + try { LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"); fail(); } + catch (IOException expected) { assertTrue(expected.getMessage().contains("backup conflict")); } + assertEquals("corrupt", new String(Files.readAllBytes(backup), StandardCharsets.UTF_8)); + assertEquals(json, new String(Files.readAllBytes(profile), StandardCharsets.UTF_8)); + } + + @Test public void wrongProviderFilenameAndPendingImportBesideSavedRulesAreRejected() throws Exception { + Path root = root(); + put(root, "poweradvantage-orespawn.json", provider("basepower", "basepower:crude_oil")); + fails(root); + assertTrue(backups(root).isEmpty()); + Path other = root(); + put(other, "orespawn/poweradvantage.json", os1("poweradvantage")); + put(other, "orespawn-worldgen.json", "{\"fluid_deposits\":{\"poweradvantage:fluid_deposit/desert_crude_oil\":{" + + "\"block\":\"poweradvantage:crude_oil\"}}}"); + fails(other); + assertTrue(backups(other).isEmpty()); + } + + @Test public void linkedAncestorCannotRedirectWorldMigration() throws Exception { + Path world = root(); + Path outside = root(); + Path original = put(outside, "orespawn-worldgen.json", "{\"block\":\"poweradvantage:crude_oil\"}"); + try { Files.createSymbolicLink(world.resolve("serverconfig"), outside); } + catch (IOException | UnsupportedOperationException | SecurityException unavailable) { + org.junit.Assume.assumeNoException(unavailable); + } + byte[] before = Files.readAllBytes(original); + try { LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower"); fail(); } + catch (IOException expected) { assertTrue(expected.getMessage().contains("linked/reparse")); } + assertArrayEquals(before, Files.readAllBytes(original)); + } + + @Test public void bothOwnedPairsMigrateOneGlobalProfileWithoutLosingEitherAuthority() throws Exception { + Path config = root(); + Path global = put(config, "orespawn-worldgen.json", "{\"schema_version\":6," + + "\"fluid_deposits\":{\"poweradvantage:fluid_deposit/desert_crude_oil\":{" + + "\"block\":\"poweradvantage:crude_oil\",\"enabled\":false,\"source_provider\":\"poweradvantage\"}}," + + "\"ores\":{\"electricadvantage:ore/lithium\":{\"block\":\"electricadvantage:li_ore\"," + + "\"enabled\":false,\"source_mod\":\"electricadvantage\"},\"electricadvantage:ore/sulfur\":{" + + "\"block\":\"othermod:sulfur\",\"enabled\":true}},\"providers\":{" + + "\"poweradvantage\":{\"provider_revision\":3,\"profile_defaults_applied\":true," + + "\"known_fluid_deposits\":[\"poweradvantage:fluid_deposit/desert_crude_oil\"]}," + + "\"electricadvantage\":{\"provider_revision\":7,\"profile_defaults_applied\":true," + + "\"known_ores\":[\"electricadvantage:ore/lithium\",\"electricadvantage:ore/sulfur\"]}}," + + "\"ore_providers\":{\"electricadvantage\":{\"provider_revision\":7," + + "\"known_ores\":[\"electricadvantage:ore/lithium\"]}}," + + "\"resource_sources\":{\"crude_oil\":\"poweradvantage\",\"lithium\":\"electricadvantage\",\"sulfur\":\"none\"}," + + "\"retrogen\":{\"enabled\":false,\"force\":false,\"revision\":17},\"notes\":null}"); + assertEquals(1, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower")); + assertEquals(1, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric")); + JsonObject migrated = read(global); + JsonObject oil = migrated.getAsJsonObject("fluid_deposits").getAsJsonObject("basepower:fluid_deposit/desert_crude_oil"); + assertEquals("basepower:crude_oil", oil.get("block").getAsString()); + assertFalse(oil.get("enabled").getAsBoolean()); + JsonObject lithium = migrated.getAsJsonObject("ores").getAsJsonObject("baseelectric:ore/lithium"); + assertEquals("baseelectric:li_ore", lithium.get("block").getAsString()); + assertFalse(lithium.get("enabled").getAsBoolean()); + assertEquals("othermod:sulfur", migrated.getAsJsonObject("ores").getAsJsonObject("baseelectric:ore/sulfur") + .get("block").getAsString()); + assertEquals(3, migrated.getAsJsonObject("providers").getAsJsonObject("basepower").get("provider_revision").getAsInt()); + assertEquals(7, migrated.getAsJsonObject("providers").getAsJsonObject("baseelectric").get("provider_revision").getAsInt()); + assertTrue(migrated.getAsJsonObject("ore_providers").has("baseelectric")); + assertEquals("basepower", migrated.getAsJsonObject("resource_sources").get("crude_oil").getAsString()); + assertEquals("baseelectric", migrated.getAsJsonObject("resource_sources").get("lithium").getAsString()); + assertEquals("none", migrated.getAsJsonObject("resource_sources").get("sulfur").getAsString()); + assertEquals(17, migrated.getAsJsonObject("retrogen").get("revision").getAsInt()); + assertFalse(migrated.getAsJsonObject("retrogen").get("force").getAsBoolean()); + assertTrue(migrated.get("notes").isJsonNull()); + byte[] firstPass = Files.readAllBytes(global); + List beforeBackups = backups(config); + assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower")); + assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric")); + assertArrayEquals(firstPass, Files.readAllBytes(global)); + assertEquals(beforeBackups, backups(config)); + } + + @Test public void maintainedGlobalProfileIsAnExactNoOpOnRestart() throws Exception { + Path config = root(); + Path profile = put(config, "orespawn-worldgen.json", currentProfile(8, "basepower")); + byte[] before = Files.readAllBytes(profile); + assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower")); + assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric")); + assertArrayEquals(before, Files.readAllBytes(profile)); + assertTrue(backups(config).isEmpty()); + } + + @Test public void maintainedWorldProfileIsAnExactNoOpOnRestart() throws Exception { + Path world = root(); + Path profile = put(world, "serverconfig/orespawn-worldgen.json", currentProfile(7, "basepower")); + byte[] before = Files.readAllBytes(profile); + assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower")); + assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, "electricadvantage", "baseelectric")); + assertArrayEquals(before, Files.readAllBytes(profile)); + assertTrue(backups(world).isEmpty()); + } + + @Test public void maintainedProfilesMigrateIdentityWithoutChangingGenerationChoices() throws Exception { + Path config = root(); + Path world = root(); + Path global = put(config, "orespawn-worldgen.json", currentProfile(8, "poweradvantage")); + Path saved = put(world, "serverconfig/orespawn-worldgen.json", currentProfile(7, "poweradvantage")); + byte[] globalBefore = Files.readAllBytes(global), worldBefore = Files.readAllBytes(saved); + assertEquals(1, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower")); + assertEquals(1, LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower")); + for (Path path : new Path[] { global, saved }) { + JsonObject expected = new JsonParser().parse(currentProfile(path.equals(global) ? 8 : 7, "basepower")).getAsJsonObject(); + assertEquals(expected, read(path)); + } + assertArrayEquals(globalBefore, Files.readAllBytes(backups(config).get(0))); + assertArrayEquals(worldBefore, Files.readAllBytes(backups(world).get(0))); + byte[] globalAfter = Files.readAllBytes(global), worldAfter = Files.readAllBytes(saved); + assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "poweradvantage", "basepower")); + assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, "poweradvantage", "basepower")); + assertArrayEquals(globalAfter, Files.readAllBytes(global)); + assertArrayEquals(worldAfter, Files.readAllBytes(saved)); + assertEquals(1, backups(config).size()); + assertEquals(1, backups(world).size()); + } + + @Test public void unknownGlobalAndWorldSchemasStillFailBeforeAnyWrite() throws Exception { + for (boolean global : new boolean[] { true, false }) { + Path root = root(); + Path profile = put(root, global ? "orespawn-worldgen.json" : "serverconfig/orespawn-worldgen.json", + currentProfile(global ? 9 : 8, "poweradvantage")); + byte[] before = Files.readAllBytes(profile); + try { + if (global) LegacyWorldgenIdentity.migrateConfig(root, "poweradvantage", "basepower"); + else LegacyWorldgenIdentity.migrateWorld(root, "poweradvantage", "basepower"); + fail("Unknown schema must not be rewritten or downgraded"); + } catch (IOException expected) { assertTrue(expected.getMessage().contains("Unsupported worldgen profile schema")); } + assertArrayEquals(before, Files.readAllBytes(profile)); + assertTrue(backups(root).isEmpty()); + } + } + + private String currentProfile(int schema, String owner) { + return "{\"schema_version\":" + schema + ",\"biome_defaults_revision\":3,\"ore_defaults_revision\":10," + + "\"geology_mode\":\"legacy\",\"manage_vanilla_ores\":false,\"suppress_all_ore_features\":true," + + "\"fluid_deposits\":{\"" + owner + ":fluid_deposit/desert_crude_oil\":{" + + "\"block\":\"" + owner + ":crude_oil\",\"enabled\":false,\"source_provider\":\"" + owner + "\"}}," + + "\"providers\":{\"" + owner + "\":{\"provider_revision\":3,\"profile_defaults_applied\":true," + + "\"known_fluid_deposits\":[\"" + owner + ":fluid_deposit/desert_crude_oil\"]}}," + + "\"resource_sources\":{\"crude_oil\":\"" + owner + "\",\"sulfur\":\"mineralogy\"}," + + "\"retrogen\":{\"enabled\":false,\"force\":false,\"revision\":17}," + + "\"worldgen_aliases\":{\"example:stone\":\"minecraft:stone\"}," + + "\"formations\":{\"algorithm\":\"stable_layers\",\"custom\":{\"waviness_amplitude\":60}}," + + "\"notes\":\"poweradvantage:crude_oil\"}\n"; + } + + @Test public void bothLegacyAuthoritiesShareGlobalAndWorldProfilesWithNoFreshDefaultReinsertion() throws Exception { + Path config = root(); + Path world = root(); + String json = "{\"schema_version\":5,\"ores\":{" + + "\"poweradvantage:legacy/poweradvantage_crude_oil_0\":{\"block\":\"poweradvantage:crude_oil\",\"enabled\":false}," + + "\"electricadvantage:legacy/electricadvantage_li_ore_0\":{\"block\":\"electricadvantage:li_ore\",\"enabled\":true}," + + "\"electricadvantage:legacy/electricadvantage_sulfur_ore_1\":{\"block\":\"electricadvantage:sulfur_ore\",\"enabled\":false}}}"; + Path global = put(config, "orespawn-worldgen.json", json); + Path saved = put(world, "serverconfig/orespawn-worldgen.json", json); + for (String[] pair : new String[][] { { "poweradvantage", "basepower" }, { "electricadvantage", "baseelectric" } }) { + assertEquals(1, LegacyWorldgenIdentity.migrateConfig(config, pair[0], pair[1])); + assertEquals(1, LegacyWorldgenIdentity.migrateWorld(world, pair[0], pair[1])); + } + assertEquals(read(global), read(saved)); + JsonObject profile = read(saved); + assertEquals(3, profile.getAsJsonObject("ores").entrySet().size()); + assertFalse(profile.has("fluid_deposits")); + JsonObject manifests = profile.getAsJsonObject("providers"); + assertEquals("basepower:fluid_deposit/desert_crude_oil", manifests.getAsJsonObject("basepower") + .getAsJsonArray("known_fluid_deposits").get(0).getAsString()); + assertEquals(2, manifests.getAsJsonObject("baseelectric").getAsJsonArray("known_ores").size()); + byte[] globalBefore = Files.readAllBytes(global); + byte[] worldBefore = Files.readAllBytes(saved); + for (String[] pair : new String[][] { { "poweradvantage", "basepower" }, { "electricadvantage", "baseelectric" } }) { + assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, pair[0], pair[1])); + assertEquals(0, LegacyWorldgenIdentity.migrateWorld(world, pair[0], pair[1])); + } + assertArrayEquals(globalBefore, Files.readAllBytes(global)); + assertArrayEquals(worldBefore, Files.readAllBytes(saved)); + assertEquals(2, backups(config).size()); + assertEquals(2, backups(world).size()); + } + + @Test public void electricOs1PlusDimensionsAndTwoOutputsSurviveFilenameMigration() throws Exception { + Path config = root(); + put(config, "orespawn/electricadvantage.json", "{\"dimensions\":[{\"dimension\":\"+\",\"ores\":[" + + "{\"blockID\":\"electricadvantage:li_ore\",\"size\":8,\"variation\":2,\"frequency\":0.125,\"minHeight\":1,\"maxHeight\":32}," + + "{\"blockID\":\"electricadvantage:sulfur_ore\",\"size\":16,\"variation\":8,\"frequency\":1,\"minHeight\":1,\"maxHeight\":32}]}]}"); + assertEquals(2, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric")); + JsonObject dimension = read(config.resolve("orespawn/baseelectric.json")).getAsJsonArray("dimensions").get(0).getAsJsonObject(); + assertEquals("+", dimension.get("dimension").getAsString()); + assertEquals(2, dimension.getAsJsonArray("ores").size()); + assertEquals("baseelectric:li_ore", dimension.getAsJsonArray("ores").get(0).getAsJsonObject().get("blockID").getAsString()); + assertEquals("baseelectric:sulfur_ore", dimension.getAsJsonArray("ores").get(1).getAsJsonObject().get("blockID").getAsString()); + assertEquals(0, LegacyWorldgenIdentity.migrateConfig(config, "electricadvantage", "baseelectric")); + } +} diff --git a/src/test/java/zone/moddev/mc/poweradvantage/compat/OreDictionaryFallbackTest.java b/src/test/java/zone/moddev/mc/basepower/compat/OreDictionaryFallbackTest.java similarity index 95% rename from src/test/java/zone/moddev/mc/poweradvantage/compat/OreDictionaryFallbackTest.java rename to src/test/java/zone/moddev/mc/basepower/compat/OreDictionaryFallbackTest.java index abccd97..1aec96a 100644 --- a/src/test/java/zone/moddev/mc/poweradvantage/compat/OreDictionaryFallbackTest.java +++ b/src/test/java/zone/moddev/mc/basepower/compat/OreDictionaryFallbackTest.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.compat; +package zone.moddev.mc.basepower.compat; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -126,8 +126,8 @@ private static ItemBlock steelBlock(String itemName, String blockName) { Item plain = new Item(); plain.setRegistryName(new ResourceLocation("basemetals", "steel_block")); for (Item candidate : new Item[]{plain, - steelBlock("poweradvantage:steel_frame", "poweradvantage:steel_frame"), - steelBlock("basemetals:steel_block", "poweradvantage:steel_frame"), + steelBlock("basepower:steel_frame", "basepower:steel_frame"), + steelBlock("basemetals:steel_block", "basepower:steel_frame"), steelBlock("basemetals:steel", "basemetals:steel")}) { Registry registry = new Registry(); registry.steel = candidate; @@ -173,13 +173,14 @@ private static ItemBlock steelBlock(String itemName, String blockName) { } @Test public void lifecycleHookPrecedesFuelAndRecipeInitialization() throws Exception { - String source = new String(Files.readAllBytes(Paths.get("src/main/java/zone/moddev/mc/poweradvantage/PowerAdvantage.java")), StandardCharsets.UTF_8); + String source = new String(Files.readAllBytes(Paths.get("src/main/java/zone/moddev/mc/basepower/PowerAdvantage.java")), StandardCharsets.UTF_8); String init = source.substring(source.indexOf("public void init(FMLInitializationEvent event)"), source.indexOf("private void clientInit")); String hook = "BaseMetalsCompat.registerOreDictionaryFallbacks();"; assertTrue(init.indexOf(hook) >= 0); assertEquals(init.indexOf(hook), init.lastIndexOf(hook)); assertTrue(init.indexOf(hook) < init.indexOf("init.Fuels.init();")); assertTrue(init.indexOf(hook) < init.indexOf("init.Recipes.init();")); - assertTrue(source.contains("after:basemetals")); + assertTrue("Saved generation settings must migrate before OreSpawn reads them", + source.contains("required-before:orespawn@[4.0.6,5.0.0)")); } } diff --git a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManagerTest.java b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManagerTest.java similarity index 96% rename from src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManagerTest.java rename to src/test/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManagerTest.java index 89633b9..a034120 100644 --- a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/ConduitNetworkManagerTest.java +++ b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/ConduitNetworkManagerTest.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.conduitnetwork; +package zone.moddev.mc.basepower.conduitnetwork; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -7,7 +7,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import org.junit.Test; -import zone.moddev.mc.poweradvantage.math.BlockPos4D; +import zone.moddev.mc.basepower.math.BlockPos4D; public class ConduitNetworkManagerTest { private final ConduitNetworkManager manager = new ConduitNetworkManager(new ConduitType("test")); diff --git a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/LoadedConduitNetworkTest.java b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/LoadedConduitNetworkTest.java similarity index 99% rename from src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/LoadedConduitNetworkTest.java rename to src/test/java/zone/moddev/mc/basepower/conduitnetwork/LoadedConduitNetworkTest.java index 06ee70f..ba5baad 100644 --- a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/LoadedConduitNetworkTest.java +++ b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/LoadedConduitNetworkTest.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.conduitnetwork; +package zone.moddev.mc.basepower.conduitnetwork; import static org.junit.Assert.*; @@ -29,7 +29,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.junit.BeforeClass; import org.junit.Test; -import zone.moddev.mc.poweradvantage.math.BlockPos4D; +import zone.moddev.mc.basepower.math.BlockPos4D; public class LoadedConduitNetworkTest { private static final ConduitType TYPE = new ConduitType("test-chunk-boundary"); diff --git a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/PowerTransferAccountingTest.java b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/PowerTransferAccountingTest.java similarity index 97% rename from src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/PowerTransferAccountingTest.java rename to src/test/java/zone/moddev/mc/basepower/conduitnetwork/PowerTransferAccountingTest.java index 070739c..709e594 100644 --- a/src/test/java/zone/moddev/mc/poweradvantage/conduitnetwork/PowerTransferAccountingTest.java +++ b/src/test/java/zone/moddev/mc/basepower/conduitnetwork/PowerTransferAccountingTest.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.conduitnetwork; +package zone.moddev.mc.basepower.conduitnetwork; import cyano.poweradvantage.api.*; import java.util.Arrays; diff --git a/src/test/java/zone/moddev/mc/poweradvantage/init/LegacyOreSpawnMigrationTest.java b/src/test/java/zone/moddev/mc/basepower/init/LegacyOreSpawnMigrationTest.java similarity index 92% rename from src/test/java/zone/moddev/mc/poweradvantage/init/LegacyOreSpawnMigrationTest.java rename to src/test/java/zone/moddev/mc/basepower/init/LegacyOreSpawnMigrationTest.java index 6cf56ff..a902bda 100644 --- a/src/test/java/zone/moddev/mc/poweradvantage/init/LegacyOreSpawnMigrationTest.java +++ b/src/test/java/zone/moddev/mc/basepower/init/LegacyOreSpawnMigrationTest.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -30,7 +30,7 @@ public void legacyOilIsOneRetainedRuleAndOverridesFreshApiDefaults() throws Exce Class bridge = Class.forName("com.mcmoddev.orespawn.compat.LegacyOs3Bridge"); Method translate = bridge.getDeclaredMethod("translateOs1ForTests", String.class, JsonObject.class); translate.setAccessible(true); - JsonObject converted = (JsonObject) translate.invoke(null, "poweradvantage", legacy); + JsonObject converted = (JsonObject) translate.invoke(null, "basepower", legacy); assertEquals(1, converted.getAsJsonObject("spawns").entrySet().size()); assertEquals(1, OreSpawnWorldGen.createProvider().toJson() .getAsJsonObject("fluid_deposits").entrySet().size()); @@ -38,7 +38,7 @@ public void legacyOilIsOneRetainedRuleAndOverridesFreshApiDefaults() throws Exce Path config = temporary.newFolder("config").toPath(); Path legacyDirectory = Files.createDirectories(config.resolve("orespawn")); Files.copy(getClass().getResourceAsStream("/orespawn-legacy/poweradvantage.json"), - legacyDirectory.resolve("poweradvantage.json")); + legacyDirectory.resolve("basepower.json")); assertTrue(OreSpawnWorldGen.describeOverride(config).contains("legacy importer authority")); } } \ No newline at end of file diff --git a/src/test/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGenTest.java b/src/test/java/zone/moddev/mc/basepower/init/OreSpawnWorldGenTest.java similarity index 83% rename from src/test/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGenTest.java rename to src/test/java/zone/moddev/mc/basepower/init/OreSpawnWorldGenTest.java index 45eff7a..a53fb95 100644 --- a/src/test/java/zone/moddev/mc/poweradvantage/init/OreSpawnWorldGenTest.java +++ b/src/test/java/zone/moddev/mc/basepower/init/OreSpawnWorldGenTest.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.init; +package zone.moddev.mc.basepower.init; import com.google.gson.JsonObject; import org.junit.Test; @@ -11,12 +11,12 @@ public class OreSpawnWorldGenTest { public void desertOilProviderUsesStableIdentityAndCoveredLakeGeometry() { JsonObject root = OreSpawnWorldGen.createProvider().toJson(); assertEquals(4, root.get("schema_version").getAsInt()); - assertEquals("poweradvantage", root.get("provider_modid").getAsString()); + assertEquals("basepower", root.get("provider_modid").getAsString()); JsonObject deposits = root.getAsJsonObject("fluid_deposits"); assertEquals(1, deposits.entrySet().size()); JsonObject deposit = deposits.getAsJsonObject( - "poweradvantage:fluid_deposit/desert_crude_oil"); - assertEquals("poweradvantage:crude_oil", deposit.get("block").getAsString()); + "basepower:fluid_deposit/desert_crude_oil"); + assertEquals("basepower:crude_oil", deposit.get("block").getAsString()); assertTrue(deposit.get("enabled").getAsBoolean()); JsonObject overworld = deposit.getAsJsonObject("dimensions") .getAsJsonObject("minecraft:overworld"); diff --git a/src/test/java/zone/moddev/mc/poweradvantage/machines/conveyors/ConveyorTransferTest.java b/src/test/java/zone/moddev/mc/basepower/machines/conveyors/ConveyorTransferTest.java similarity index 95% rename from src/test/java/zone/moddev/mc/poweradvantage/machines/conveyors/ConveyorTransferTest.java rename to src/test/java/zone/moddev/mc/basepower/machines/conveyors/ConveyorTransferTest.java index f0b4d91..0632749 100644 --- a/src/test/java/zone/moddev/mc/poweradvantage/machines/conveyors/ConveyorTransferTest.java +++ b/src/test/java/zone/moddev/mc/basepower/machines/conveyors/ConveyorTransferTest.java @@ -1,4 +1,4 @@ -package zone.moddev.mc.poweradvantage.machines.conveyors; +package zone.moddev.mc.basepower.machines.conveyors; import net.minecraft.inventory.InventoryBasic; import net.minecraft.item.ItemStack; @@ -6,7 +6,7 @@ import net.minecraft.util.EnumFacing; import org.junit.BeforeClass; import org.junit.Test; -import zone.moddev.mc.poweradvantage.util.InventoryWrapper; +import zone.moddev.mc.basepower.util.InventoryWrapper; import static org.junit.Assert.*; public class ConveyorTransferTest { diff --git a/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidCapabilityRoutingTest.java b/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidCapabilityRoutingTest.java new file mode 100644 index 0000000..95a15ba --- /dev/null +++ b/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/FluidCapabilityRoutingTest.java @@ -0,0 +1,78 @@ +package zone.moddev.mc.basepower.machines.fluidmachines; + +import cyano.poweradvantage.api.simple.TileEntitySimpleFluidMachine; +import cyano.poweradvantage.api.fluid.FluidRequest; +import java.lang.reflect.Constructor; +import java.util.concurrent.Callable; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.*; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; +import org.junit.*; +import static org.junit.Assert.*; + +public class FluidCapabilityRoutingTest { + private static Capability original; + + @BeforeClass public static void bootstrap() throws Exception { + net.minecraft.init.Bootstrap.register(); + original=CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY; + if(original==null) { + // Unit tests do not run FML's capability-field injection. + Constructor constructor=Capability.class.getDeclaredConstructor(String.class,Capability.IStorage.class,Callable.class); + constructor.setAccessible(true); + CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY=constructor.newInstance("fluid-routing-test",null,null); + } + } + @AfterClass public static void restore() { CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY=original; } + + private static final class TwoTank extends TileEntitySimpleFluidMachine { + final FluidTank input=new FluidTank(1000); + TwoTank() { super(1000,"test"); } + @Override protected ItemStack[] getInventory() { return new ItemStack[0]; } + @Override public void tickUpdate(boolean server) {} + @Override public FluidTank getTank() { return tank; } + @Override public boolean isFluidSource() { return true; } + @Override public boolean isFluidSink() { return true; } + @Override public FluidRequest getFluidRequest(Fluid offer) { return FluidRequest.REQUEST_NOTHING; } + @Override public boolean canAccept(Fluid offer) { return offer==FluidRegistry.WATER; } + @Override public int fill(EnumFacing face,FluidStack packet,boolean execute) { + return packet!=null && canFill(face,packet.getFluid()) ? input.fill(packet,execute) : 0; + } + @Override public boolean canFill(EnumFacing face,Fluid fluid) { return face==EnumFacing.UP && fluid==FluidRegistry.WATER; } + @Override public FluidTankInfo[] getTankInfo(EnumFacing face) { return new FluidTankInfo[]{input.getInfo(),tank.getInfo()}; } + } + + @Test public void capabilityFillsTheOverriddenInputRatherThanExposingOutputTank() { + TwoTank tile=new TwoTank(); + IFluidHandler port=tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,EnumFacing.UP); + assertEquals(1000,port.fill(new FluidStack(FluidRegistry.WATER,1000),true)); + assertEquals(1000,tile.input.getFluidAmount()); + assertEquals(0,tile.getTank().getFluidAmount()); + } + @Test public void capabilityHonorsFluidAndSideRestrictions() { + TwoTank tile=new TwoTank(); + assertEquals(0,tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,EnumFacing.UP).fill(new FluidStack(FluidRegistry.LAVA,1000),true)); + assertEquals(0,tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,EnumFacing.DOWN).fill(new FluidStack(FluidRegistry.WATER,1000),true)); + assertEquals(0,tile.input.getFluidAmount());assertEquals(0,tile.getTank().getFluidAmount()); + } + @Test public void simulationCapacityAndBothTankPropertiesRemainAccurate() { + TwoTank tile=new TwoTank();IFluidHandler port=tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,EnumFacing.UP); + assertEquals(1000,port.fill(new FluidStack(FluidRegistry.WATER,1000),false)); + assertEquals(0,tile.input.getFluidAmount());assertEquals(0,tile.getTank().getFluidAmount()); + tile.input.fill(new FluidStack(FluidRegistry.WATER,999),true); + assertEquals(1,port.fill(new FluidStack(FluidRegistry.WATER,10),true)); + assertEquals(0,port.fill(new FluidStack(FluidRegistry.WATER,1),true)); + assertEquals(2,port.getTankProperties().length); + } + @Test public void drainStillReturnsOnlyOutputAndNeverTheInputReserve() { + TwoTank tile=new TwoTank();tile.input.fill(new FluidStack(FluidRegistry.WATER,1000),true); + tile.getTank().fill(new FluidStack(FluidRegistry.LAVA,500),true); + IFluidHandler port=tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,EnumFacing.UP); + assertEquals(250,port.drain(250,false).amount);assertEquals(500,tile.getTank().getFluidAmount()); + assertEquals(500,port.drain(600,true).amount);assertNull(port.drain(1,true)); + assertEquals(1000,tile.input.getFluidAmount()); + } +} diff --git a/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankDescriptionTest.java b/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankDescriptionTest.java new file mode 100644 index 0000000..61f425e --- /dev/null +++ b/src/test/java/zone/moddev/mc/basepower/machines/fluidmachines/StorageTankDescriptionTest.java @@ -0,0 +1,40 @@ +package zone.moddev.mc.basepower.machines.fluidmachines; + +import java.io.InputStream; +import net.minecraft.init.Bootstrap; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.text.translation.LanguageMap; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; + +/** Actual item-description generation, not just the presence of language keys. */ +public class StorageTankDescriptionTest { + @BeforeClass public static void bootstrap() throws Exception { + Bootstrap.register(); + try (InputStream input = StorageTankDescriptionTest.class.getResourceAsStream("/assets/basepower/lang/en_US.lang")) { + assertNotNull(input); + LanguageMap.inject(input); + } + } + + @Test public void anEmptyTankItemActuallyRetainsItsTranslatedDescription() { + ItemStack item = new ItemStack(Items.PAPER); + new StorageTankBlock().displayInformation(item); + assertNotNull("Generated description must be attached to the item", item.getTagCompound()); + assertEquals("Empty", item.getTagCompound().getCompoundTag("display").getTagList("Lore", 8).getStringTagAt(0)); + } + + @Test public void aFilledTankUsesTheNewTranslationWithoutChangingItsContents() { + ItemStack item = new ItemStack(Items.PAPER); + NBTTagCompound tag = new NBTTagCompound(); tag.setInteger("Volume", 2500); tag.setString("FluidID", "water"); + item.setTagCompound(tag); + new StorageTankBlock().displayInformation(item); + assertEquals("2.5 buckets of water", tag.getCompoundTag("display").getTagList("Lore", 8).getStringTagAt(0)); + assertEquals(2500, tag.getInteger("Volume")); + assertEquals("water", tag.getString("FluidID")); + assertEquals(1, item.stackSize); + } +} diff --git a/src/test/java/zone/moddev/mc/poweradvantage/registry/MachineGuiTitleTest.java b/src/test/java/zone/moddev/mc/basepower/registry/MachineGuiTitleTest.java similarity index 82% rename from src/test/java/zone/moddev/mc/poweradvantage/registry/MachineGuiTitleTest.java rename to src/test/java/zone/moddev/mc/basepower/registry/MachineGuiTitleTest.java index d56b772..697e441 100644 --- a/src/test/java/zone/moddev/mc/poweradvantage/registry/MachineGuiTitleTest.java +++ b/src/test/java/zone/moddev/mc/basepower/registry/MachineGuiTitleTest.java @@ -1,7 +1,7 @@ -package zone.moddev.mc.poweradvantage.registry; +package zone.moddev.mc.basepower.registry; -import zone.moddev.mc.poweradvantage.machines.fluidmachines.MetalTankTileEntity; -import zone.moddev.mc.poweradvantage.machines.fluidmachines.StorageTankTileEntity; +import zone.moddev.mc.basepower.machines.fluidmachines.MetalTankTileEntity; +import zone.moddev.mc.basepower.machines.fluidmachines.StorageTankTileEntity; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; @@ -21,9 +21,9 @@ public class MachineGuiTitleTest { } @Test public void tankNamesUseTheirPublishedTranslationsRatherThanJavaClassNames() throws Exception { - assertCaption(new StorageTankTileEntity(), "tile.poweradvantage.fluid_storage_tank.name", + assertCaption(new StorageTankTileEntity(), "tile.basepower.fluid_storage_tank.name", "Portable Fluid Tank"); - assertCaption(new MetalTankTileEntity(), "tile.poweradvantage.fluid_metal_tank.name", + assertCaption(new MetalTankTileEntity(), "tile.basepower.fluid_metal_tank.name", "Metal Fluid Tank"); } @@ -46,7 +46,7 @@ private static void assertCaption(IInventory tank, String key, String literal) t assertEquals(key, ((TextComponentTranslation) caption).getKey()); Properties english = new Properties(); try (InputStream stream = MachineGuiTitleTest.class.getResourceAsStream( - "/assets/poweradvantage/lang/en_US.lang")) { + "/assets/basepower/lang/en_US.lang")) { assertNotNull("Published Power Advantage English language resource", stream); english.load(new InputStreamReader(stream, StandardCharsets.UTF_8)); } diff --git a/src/test/resources/orespawn-legacy/poweradvantage.json b/src/test/resources/orespawn-legacy/poweradvantage.json index 70899f3..861b8d1 100644 --- a/src/test/resources/orespawn-legacy/poweradvantage.json +++ b/src/test/resources/orespawn-legacy/poweradvantage.json @@ -15,4 +15,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/test-rig/README.md b/test-rig/README.md index 64a1952..b93cf61 100644 --- a/test-rig/README.md +++ b/test-rig/README.md @@ -1,6 +1,10 @@ # Advantage Works 1.10.2 Test Rig -> **Commissioning notice:** This harness builds disposable works. It is not a gameplay mod, registers no content, and must never be shipped inside a PowerAdvantage jar. +The current targets are basePower, baseSteam and baseElectric. Station IDs and operator commands stay unchanged. Original-release Advantage fixtures are read-only migration sources, not interchangeable runtime dependencies. See [Moving From Advantage To basePower](../docs/1.10/base-migration.md) before testing an existing world. + +See [Recipe Progression Checks](../docs/1.10/recipe-progression-checks.md) for finite-material native crafting, hammer and merchant transactions, and the connected oil/plastic and steam starter plant. This is separate from the older recipe-registration audit, whose partial results are retained. + +> **Commissioning notice:** This harness builds disposable works. It is not a gameplay mod, registers no content, and must never be shipped inside a basePower jar. The rig turns the 20 cards in the [Advantage Works handbook](../docs/1.10/README.md) plus a public-API fixture into one walkable superflat server world. Power Works lies west of the central concourse, Steam Works north, Electric Works east, and the drill, lift, turbine, pumping, musket, and turret proving grounds south. @@ -67,7 +71,7 @@ gradlew.bat -p test-rig verifyWorksPackagedCurrent -PworksStations=E-01 -PworksS Every machinery profile still builds and checks the complete works; the selection controls which stations are started, stopped, and checkpointed around the full process restart. Normal-world generation profiles deliberately skip station construction. The configured run duration is also used as a post-restart settle interval before assertions, allowing an eight-tick distribution cycle to complete. Use `worksServerPort` when another local server occupies the profile's default port. The effective station list, duration, and port are recorded in `run-manifest.json`. -The development profile uses current PowerAdvantage source plus the sibling SteamAdvantage and ElectricAdvantage deobf jars. PowerAdvantage supplies the pinned OreSpawn 4 development runtime; BaseMetals and Mineralogy remain absent so their integrations are visibly skipped. +The development profile uses current basePower source plus the sibling baseSteam and baseElectric deobf jars. basePower supplies the pinned OreSpawn 4 development runtime; BaseMetals and Mineralogy remain absent so their integrations are visibly skipped. ## Run matrix @@ -127,4 +131,14 @@ The sampler records block counts, sampled biome centers, any deposit-producing c ## Release isolation -`verifyHarnessIsolation` opens the PowerAdvantage release jar and rejects any `zone/moddev/mc/advantageworks` class or `assets/advantageworkstest` resource. The normal PowerAdvantage build never includes the nested `test-rig` source set. +`verifyHarnessIsolation` opens the basePower release jar and rejects any `zone/moddev/mc/advantageworks` class or `assets/advantageworkstest` resource. The normal basePower build never includes the nested `test-rig` source set. + +## Migration Evidence + +The native migration runners distinguish three kinds of evidence: + +- Connected original-release worlds prove saved-state preservation and paid work without replacing machines, followed by a full server restart. +- The larger passive original-release fixture checks saved blocks, metadata, inventories and typed NBT before machinery can tick. +- Newly constructed nested inventory and entity fixtures test additional migration cases. They are synthetic tests, not evidence that a historical player used that exact arrangement. + +Each run pins the candidate jars, server code, fixture and test protocol. Failed receipts remain available. A known dependency warning may only be classified after a fresh, hash-bound dependency-only control and candidate behaviour check; it is not a blanket permission to ignore startup errors. Endurance means a measured 30-minute finite-resource operating run, not a shortened smoke run. diff --git a/test-rig/build.gradle b/test-rig/build.gradle index 04d5bb0..61dd764 100644 --- a/test-rig/build.gradle +++ b/test-rig/build.gradle @@ -59,7 +59,7 @@ dependencies { runnerImplementation 'com.google.code.gson:gson:2.8.0' testImplementation 'junit:junit:4.13.2' compileOnly files(project.findProperty('powerAdvantageDeobfJar') - ?: '../build/libs-dev/PowerAdvantage-2.4.3.110021-deobf.jar') + ?: '../build/libs-dev/basePower-2.4.4.110021-deobf.jar') } tasks.named('processResources', ProcessResources) { @@ -160,7 +160,7 @@ tasks.register('verifyHarnessIsolation') { group = 'verification' description = 'Confirms the PowerAdvantage release contains no test-harness content.' doLast { - File powerJar = file('../build/libs/PowerAdvantage-2.4.3.110021.jar') + File powerJar = file('../build/libs/basePower-2.4.4.110021.jar') if (!powerJar.isFile()) { throw new GradleException("Build PowerAdvantage first: ${powerJar}") } @@ -180,3 +180,8 @@ tasks.register('verifyHarnessIsolation') { tasks.named('check') { dependsOn tasks.named('verifyHarnessIsolation') } + +tasks.named('test', Test) { + inputs.dir('profiles') + inputs.file('src/main/java/zone/moddev/mc/advantageworks/NativeSurvivalProgressionProbe.java') +} diff --git a/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/ClientResourceProbe.java b/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/ClientResourceProbe.java index f39effa..53f5575 100644 --- a/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/ClientResourceProbe.java +++ b/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/ClientResourceProbe.java @@ -19,7 +19,7 @@ /** Native, worldless GUI capture only; no operating or migration claims. */ @Mod(modid = ClientResourceProbe.MODID, name = "Advantage GUI Capture", version = "1.0.0.110021", clientSideOnly = true, acceptedMinecraftVersions = "[1.10.2]", - dependencies = "required-after:poweradvantage;required-after:steamadvantage;required-after:electricadvantage") + dependencies = "required-after:basepower;required-after:basesteam;required-after:baseelectric") @Mod.EventBusSubscriber(value = Side.CLIENT) public final class ClientResourceProbe { static final String MODID = "advantageclientresources"; @@ -44,7 +44,7 @@ public final class ClientResourceProbe { && Boolean.getBoolean("advantageworks.machineGuiLayouts"), "All three mods and the GUI audit are required"); JsonArray mods = new JsonArray(); JsonObject versions = new JsonObject(); - for (String id : new String[]{"poweradvantage", "steamadvantage", "electricadvantage"}) { + for (String id : new String[]{"basepower", "basesteam", "baseelectric"}) { ModContainer mod = Loader.instance().getIndexedModList().get(id); require(mod != null, "Combined launch omitted " + id); String expected = System.getProperty("advantageworks.expectedVersion." + id); diff --git a/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/MachineGuiLayoutProbe.java b/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/MachineGuiLayoutProbe.java index c8a901e..e7e760b 100644 --- a/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/MachineGuiLayoutProbe.java +++ b/test-rig/client-resources/java/zone/moddev/mc/advantageworks/client/MachineGuiLayoutProbe.java @@ -36,7 +36,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.fml.common.registry.ForgeRegistries; -import zone.moddev.mc.poweradvantage.registry.MachineGUIRegistry; +import zone.moddev.mc.basepower.registry.MachineGUIRegistry; /** Renders every registered machine screen, not just its detached decorations. */ final class MachineGuiLayoutProbe { @@ -161,11 +161,11 @@ static void verify(Minecraft minecraft, JsonObject result) { require(screen.hovered() == menu.inventorySlots.get(menu.inventorySlots.size() - 9), "Inventory hitbox is misaligned"); ImageIO.write(tooltip, "png", new File("machine-gui-layouts/" + id.replace(':', '-') + "-tooltip.png")); inventory.setInventorySlotContents(0, null); - if (block == zone.moddev.mc.poweradvantage.init.Blocks.metal_storage_tank) { + if (block == zone.moddev.mc.basepower.init.Blocks.metal_storage_tank) { negativeControls += verifyMissingLabelControls(minecraft, screen); verifyLongName(minecraft, (SimpleMachineGUI) definition, menu, inventory); } - if (block == zone.moddev.mc.poweradvantage.init.Blocks.metal_storage_tank) { + if (block == zone.moddev.mc.basepower.init.Blocks.metal_storage_tank) { verifyHelperLimits(screen); } row.addProperty("renders", renders); @@ -387,10 +387,10 @@ private static void require(boolean value, String message) { } private static void verifyHelperLimits(RecordingScreen screen) throws Exception { - for (String name : new String[]{"zone.moddev.mc.electricadvantage.gui.GUIHelper", - "zone.moddev.mc.steamadvantage.gui.GUIHelper"}) { - if (!net.minecraftforge.fml.common.Loader.isModLoaded(name.contains("electricadvantage") ? "electricadvantage" : "steamadvantage")) continue; - String[] methods = name.contains("electricadvantage") ? new String[]{"drawProgressBar"} + for (String name : new String[]{"zone.moddev.mc.baseelectric.gui.GUIHelper", + "zone.moddev.mc.basesteam.gui.GUIHelper"}) { + if (!net.minecraftforge.fml.common.Loader.isModLoaded(name.contains("baseelectric") ? "baseelectric" : "basesteam")) continue; + String[] methods = name.contains("baseelectric") ? new String[]{"drawProgressBar"} : new String[]{"drawDownArrowProgress", "drawFlameProgress"}; for (String method : methods) { Method draw = Class.forName(name).getMethod(method, int.class, int.class, float.class, SimpleMachineGUI.GUIContainer.class); diff --git a/test-rig/client-resources/resources/gui-label-expectations.json b/test-rig/client-resources/resources/gui-label-expectations.json index 2f82b82..bdbb23d 100644 --- a/test-rig/client-resources/resources/gui-label-expectations.json +++ b/test-rig/client-resources/resources/gui-label-expectations.json @@ -3,44 +3,44 @@ "inventory": "Inventory", "layout": { "height": 240, "machineTop": 12, "machineHeight": 128, "inventoryTop": 150, "titleY": 1, "inventoryLabelY": 140, "inventoryRows": [158, 176, 194, 216] }, "machines": { - "poweradvantage:fluid_drain": "Drain", - "poweradvantage:fluid_discharge": "Discharge Grate", - "poweradvantage:fluid_storage_tank": "Portable Fluid Tank", - "poweradvantage:fluid_metal_tank": "Metal Fluid Tank", - "poweradvantage:still": "Distillation Furnace", - "poweradvantage:item_conveyor": "Conveyor", - "poweradvantage:item_filter_block": "Block Filter Conveyor", - "poweradvantage:item_filter_food": "Food Filter Conveyor", - "poweradvantage:item_filter_fuel": "Fuel Filter Conveyor", - "poweradvantage:item_filter_inventory": "Filter Conveyor", - "poweradvantage:item_filter_ore": "Ore Filter Conveyor", - "poweradvantage:item_filter_plant": "Plantable Filter Conveyor", - "poweradvantage:item_filter_smelt": "Furnace Filter Conveyor", - "poweradvantage:item_filter_overflow": "Overflow Filter Conveyor", - "steamadvantage:steam_boiler_coal": "Coal-Fired Steam Boiler", - "steamadvantage:steam_boiler_electric": "Electric Steam Boiler", - "steamadvantage:steam_boiler_geothermal": "Geothermal Steam Boiler", - "steamadvantage:steam_boiler_oil": "Oil-Burning Steam Boiler", - "steamadvantage:steam_tank": "Steam Boiler Tank", - "steamadvantage:steam_furnace": "Steam-Powered Furnace", - "steamadvantage:steam_crusher": "Steam-Powered Rock Crusher", - "steamadvantage:steam_drill": "Steam-Powered Drill", - "steamadvantage:steam_still": "Steam-Powered Still", - "steamadvantage:steam_pump": "Steam-Powered Pump", - "electricadvantage:electric_battery_array": "Battery Array", - "electricadvantage:electric_crusher": "Electric Rock Crusher", - "electricadvantage:electric_drill": "Electric Mining Drill", - "electricadvantage:electric_fabricator": "Automated Assembler", - "electricadvantage:electric_furnace": "Electric Arc Furnace", - "electricadvantage:electric_oven": "Electric Oven", - "electricadvantage:electric_pump": "Electric Pump", - "electricadvantage:electric_still": "Electric Distiller", - "electricadvantage:growth_chamber": "Growth Chamber", - "electricadvantage:growth_chamber_controller": "Growth Chamber Control Unit", - "electricadvantage:hydroelectric_generator": "Hydroelectric Generator", - "electricadvantage:laser_turret": "Laser Turret", - "electricadvantage:photovoltaic_generator": "Photovoltaic Generator", - "electricadvantage:plastic_refinery": "Petro-Plastic Refinery", - "electricadvantage:steam_powered_generator": "Steam-Powered Electric Generator" + "basepower:fluid_drain": "Drain", + "basepower:fluid_discharge": "Discharge Grate", + "basepower:fluid_storage_tank": "Portable Fluid Tank", + "basepower:fluid_metal_tank": "Metal Fluid Tank", + "basepower:still": "Distillation Furnace", + "basepower:item_conveyor": "Conveyor", + "basepower:item_filter_block": "Block Filter Conveyor", + "basepower:item_filter_food": "Food Filter Conveyor", + "basepower:item_filter_fuel": "Fuel Filter Conveyor", + "basepower:item_filter_inventory": "Filter Conveyor", + "basepower:item_filter_ore": "Ore Filter Conveyor", + "basepower:item_filter_plant": "Plantable Filter Conveyor", + "basepower:item_filter_smelt": "Furnace Filter Conveyor", + "basepower:item_filter_overflow": "Overflow Filter Conveyor", + "basesteam:steam_boiler_coal": "Coal-Fired Steam Boiler", + "basesteam:steam_boiler_electric": "Electric Steam Boiler", + "basesteam:steam_boiler_geothermal": "Geothermal Steam Boiler", + "basesteam:steam_boiler_oil": "Oil-Burning Steam Boiler", + "basesteam:steam_tank": "Steam Boiler Tank", + "basesteam:steam_furnace": "Steam-Powered Furnace", + "basesteam:steam_crusher": "Steam-Powered Rock Crusher", + "basesteam:steam_drill": "Steam-Powered Drill", + "basesteam:steam_still": "Steam-Powered Still", + "basesteam:steam_pump": "Steam-Powered Pump", + "baseelectric:electric_battery_array": "Battery Array", + "baseelectric:electric_crusher": "Electric Rock Crusher", + "baseelectric:electric_drill": "Electric Mining Drill", + "baseelectric:electric_fabricator": "Automated Assembler", + "baseelectric:electric_furnace": "Electric Arc Furnace", + "baseelectric:electric_oven": "Electric Oven", + "baseelectric:electric_pump": "Electric Pump", + "baseelectric:electric_still": "Electric Distiller", + "baseelectric:growth_chamber": "Growth Chamber", + "baseelectric:growth_chamber_controller": "Growth Chamber Control Unit", + "baseelectric:hydroelectric_generator": "Hydroelectric Generator", + "baseelectric:laser_turret": "Laser Turret", + "baseelectric:photovoltaic_generator": "Photovoltaic Generator", + "baseelectric:plastic_refinery": "Petro-Plastic Refinery", + "baseelectric:steam_powered_generator": "Steam-Powered Electric Generator" } } diff --git a/test-rig/client-resources/resources/mcmod.info b/test-rig/client-resources/resources/mcmod.info index f74821d..b3d9aa2 100644 --- a/test-rig/client-resources/resources/mcmod.info +++ b/test-rig/client-resources/resources/mcmod.info @@ -6,6 +6,6 @@ "version": "1.0.0.110021", "mcversion": "1.10.2", "authorList": ["Advantage Works"], - "dependencies": ["poweradvantage", "steamadvantage", "electricadvantage"] + "dependencies": ["basepower", "basesteam", "baseelectric"] } ] diff --git a/test-rig/client-resources/run.ps1 b/test-rig/client-resources/run.ps1 index 34add1a..6618ec8 100644 --- a/test-rig/client-resources/run.ps1 +++ b/test-rig/client-resources/run.ps1 @@ -101,7 +101,7 @@ try { $inputReport.runner = Get-Record $PSCommandPath $inputReport.expectations = Get-Record (Join-Path $PSScriptRoot 'resources/gui-label-expectations.json') New-Item -ItemType Directory -Path (Join-Path $runtime 'mods') | Out-Null - $candidates = @{ poweradvantage = $PowerJar; steamadvantage = $SteamJar; electricadvantage = $ElectricJar; advantageclientresources = $ProbeJar } + $candidates = @{ basepower = $PowerJar; basesteam = $SteamJar; baseelectric = $ElectricJar; advantageclientresources = $ProbeJar } $candidateRecords = [ordered]@{} $versions = @{} foreach ($id in $candidates.Keys) { @@ -143,7 +143,7 @@ try { $arguments = @([regex]::Matches($attributes['org.eclipse.jdt.launching.PROGRAM_ARGUMENTS'], '"[^"]*"|\S+') | ForEach-Object { $_.Value.Trim('"') }) $vmArguments = @([regex]::Matches($attributes['org.eclipse.jdt.launching.VM_ARGUMENTS'], '"[^"]*"|\S+') | ForEach-Object { $_.Value.Trim('"') }) $vmArguments += '-Dadvantageworks.clientResources=true','-Dadvantageworks.requireExtensions=true','-Dadvantageworks.machineGuiLayouts=true','-Xmx2G' - foreach ($id in 'poweradvantage','steamadvantage','electricadvantage') { $vmArguments += "-Dadvantageworks.expectedVersion.$id=$($versions[$id])" } + foreach ($id in 'basepower','basesteam','baseelectric') { $vmArguments += "-Dadvantageworks.expectedVersion.$id=$($versions[$id])" } $inputReport.environment = $environment $inputReport.program_arguments = $arguments $inputReport.vm_arguments = $vmArguments @@ -172,7 +172,7 @@ try { $phase = 'native-report' $report = Get-Content -LiteralPath (Join-Path $runtime 'client-resources.json') -Raw | ConvertFrom-Json Assert-GuiReport $report (Join-Path $runtime 'machine-gui-layouts') - foreach ($id in 'poweradvantage','steamadvantage','electricadvantage') { + foreach ($id in 'basepower','basesteam','baseelectric') { if ($report.mod_versions.$id -cne $versions[$id]) { throw "Native loaded version mismatch: $id" } } foreach ($record in $candidateRecords.Values) { diff --git a/test-rig/migration/audit_survival110.py b/test-rig/migration/audit_survival110.py new file mode 100644 index 0000000..f312d08 --- /dev/null +++ b/test-rig/migration/audit_survival110.py @@ -0,0 +1,93 @@ +"""Independent checks on recorded native progression evidence, not a recipe planner.""" +import argparse +from collections import Counter, defaultdict +import io +import base64 +import json +from pathlib import Path +import nbtlib +from rig_transport import digest, write_json + + +def require(value, reason): + if not value: raise AssertionError(reason) + + +def hammer_witness(stock, uses, crafted, durability): + tools=defaultdict(list) + for encoded in stock: + item=nbtlib.File.parse(io.BytesIO(base64.b64decode(encoded,validate=True))) + identifier=str(item["id"])+"@0" + if identifier in durability: + require(isinstance(item["Damage"],nbtlib.Short) and isinstance(item["Count"],nbtlib.Byte),"Untyped tool damage/count") + tools[identifier].extend([int(item["Damage"])]*int(item["Count"])) + for identifier, count in crafted.items(): + capacity=durability[identifier]+1 + broken, damage=divmod(uses[identifier],capacity) + expected=[0]*(count-broken) + require(bool(expected) or damage==0,"Missing replacement hammer") + if damage: expected[0]=damage + require(sorted(tools[identifier])==sorted(expected),"Recorded native hammer damage disagrees with actual crush count") + + +def audit_case(case): + phases=case["phaseReports"] + require(case["status"]=="PASS" and phases["resume"]["status"]=="PASS" and phases["inspect"]["status"]=="PASS","Incomplete native case") + first=phases["first"]["actions"];later=phases["continue"]["actions"] + require(len(first)+len(later)==case["actions"],"Action coverage mismatch") + uses=Counter();crushes=Counter();crafted=Counter();boundaries=[];trades=0 + durability=case["economy"]["toolDurability"] + offers={row["id"]:row for row in case["economy"]["trades"]} + for receipts in (first,later): + for row in receipts: + require(row["status"]=="PASS","Failed native action") + if row["kind"]=="craft" and row["output"] in durability: + delta=row["after"].get(row["output"],0)-row["before"].get(row["output"],0) + require(delta>0,"No real hammer crafted");crafted[row["output"]]+=delta + if row["kind"]=="crush": + # Tool selection is retained in the pinned plan; native receipts expose its actual stock/damage. + candidates=[tool for tool in durability if row["before"].get(tool,0)>0] + require(len(candidates)==1,"Ambiguous tool witness; extend the independent auditor") + crushes[candidates[0]]+=1 + if row["kind"]=="trade": + trades+=1;uses[row["offer"]]+=1 + require(row["usesAfter"]==uses[row["offer"]]<=offers[row["offer"]]["maxUses"],"Merchant uses reset, duplicated or exceeded native offer stock") + boundaries.append((dict(crushes),dict(crafted))) + hammer_witness(phases["first"]["stockTyped"],Counter(boundaries[0][0]),Counter(boundaries[0][1]),durability) + hammer_witness(phases["continue"]["stockTyped"],crushes,crafted,durability) + require(phases["first"]["stockTyped"]==phases["continue"]["resumedStockTyped"],"Cold tool/item state changed") + require(phases["resume"]["stockTyped"]==phases["inspect"]["stockTyped"],"Final cold item state changed") + roots=set(phases["first"]["initialStock"]) + obtained=roots|{row["output"] for row in first+later}|{"baseelectric:petrolplastic_ingot@0"} + gaps=[] + for item,row in case["coverage"].items(): + if row["status"] in ("NATIVE_OBTAINED_FINITE_STOCK","LIVE_PRODUCED"): + require(item in obtained,"Registry item was credited without any production or resource witness") + elif row["status"]=="NO_FINITE_ROUTE":gaps.append(item) + else:require(row["status"]=="EXCLUDED" and bool(row.get("reason")),"Unclassified target") + require(set(gaps)<={"baseelectric:li_nugget@0"},"New progression gap cannot be hidden as a known unused item") + return dict(status="PASS",actions=case["actions"],trades=trades,hammerCrushes=sum(crushes.values()), + merchantOffersUsed=len(uses),registryTargets=len(case["coverage"]),unprovenItems=gaps, + maximumSteamTemperature=phases["resume"]["maximumSteamFurnaceTemperature"]) + + +def audit(report): + require(report["status"]=="PASS" and report["protocolUnchanged"] is True and report["manifestUnchanged"] is True,"Unsealed or failed native run") + expected={mode+suffix for mode in ("normal","tech_progression","apocalyptic") for suffix in ("-rubber","-no-rubber")} + require(set(report["cases"])==expected,"All six mode/configuration cases required") + result={name:audit_case(case) for name,case in report["cases"].items()} + for name in ("apocalyptic-rubber","apocalyptic-no-rubber"): + require(result[name]["trades"]>0,"Apocalyptic bootstrap has no paid native trading evidence") + economy=report["cases"][name]["economy"] + require(economy["physicalChestsSampled"]==448 and economy["nonemptyPhysicalChests"]>0,"Missing actual-chest positive control") + return dict(status="PASS",cases=result,scope="Recorded native hammer damage, trade stock, coverage and restart checks") + + +if __name__=="__main__": + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument("receipt",type=Path);parser.add_argument("--output",type=Path,required=True) + args=parser.parse_args() + if args.output.exists():raise FileExistsError(args.output) + result=audit(json.loads(args.receipt.read_text(encoding="utf-8"))) + result.update(receipt=str(args.receipt.resolve()),receiptSha256=digest(args.receipt),auditorSha256=digest(Path(__file__))) + write_json(args.output,result);print(json.dumps(result,indent=2)) diff --git a/test-rig/migration/native110.py b/test-rig/migration/native110.py index 2c4734a..9e8a54b 100644 --- a/test-rig/migration/native110.py +++ b/test-rig/migration/native110.py @@ -66,7 +66,13 @@ def pinned_profile(manifest_path, key): raise ValueError("Wrong Advantage platform version") if jar["id"] in ids: raise ValueError("Duplicate mod identity") ids.add(jar["id"]); jars.append(path) - if key != "target110" or target["launcher"] != LAUNCHER or not {"poweradvantage", "advantageworkstest"} <= ids: + legacy = {"poweradvantage", "steamadvantage", "electricadvantage"} + current = {"basepower", "basesteam", "baseelectric"} + if ids & legacy and ids & current: + raise ValueError("Mixed historical and renamed target identities") + if any(not jar["version"].endswith(".110021") for jar in target["jars"] if jar["id"] in current): + raise ValueError("Wrong renamed Advantage platform version") + if key != "target110" or target["launcher"] != LAUNCHER or "advantageworkstest" not in ids or not ids & {"poweradvantage", "basepower"}: raise ValueError("Incomplete/wrong native110 input profile") if digest(seed / LAUNCHER) != target["launcher_sha256"].upper() or not (seed / "libraries").is_dir(): raise AssertionError("Native Forge 25 seed changed") diff --git a/test-rig/migration/native110_harvest.py b/test-rig/migration/native110_harvest.py index a539598..7ae137b 100644 --- a/test-rig/migration/native110_harvest.py +++ b/test-rig/migration/native110_harvest.py @@ -41,20 +41,20 @@ NA_REASON = f"Minecraft {MINECRAFT} has no waterlogged blockstate/fluid API" # Historical GUIBlock explicitly sets light opacity to zero, independent of # PhotovoltaicGeneratorBlock's full-cube/opaque overrides. Preserve both facts. -PROPERTIES = {"solar/native-solidity": ("electricadvantage:photovoltaic_generator", True, 0), - "frame/native-opacity": ("poweradvantage:steel_frame", False, 0)} +PROPERTIES = {"solar/native-solidity": ("baseelectric:photovoltaic_generator", True, 0), + "frame/native-opacity": ("basepower:steel_frame", False, 0)} def block_identity(name): - if name.startswith("sulfur/"): return "electricadvantage:sulfur_ore" - if name.startswith("lithium/"): return "electricadvantage:li_ore" - if name.startswith("frame/"): return "poweradvantage:steel_frame" - return "electricadvantage:" + ("electric_conduit" if name.startswith("wire/") else "electric_track") + if name.startswith("sulfur/"): return "baseelectric:sulfur_ore" + if name.startswith("lithium/"): return "baseelectric:li_ore" + if name.startswith("frame/"): return "basepower:steel_frame" + return "baseelectric:" + ("electric_conduit" if name.startswith("wire/") else "electric_track") def drop_identity(name): if not EXPECTED[name][3]: return "" - if name in ("sulfur/wood", "sulfur/stone"): return "electricadvantage:sulfur_powder" + if name in ("sulfur/wood", "sulfur/stone"): return "baseelectric:sulfur_powder" return block_identity(name) @@ -163,7 +163,7 @@ def run(args): require_disjoint(output, args.target_manifest) target = pinned_profile(args.target_manifest.resolve(), "target110") for protected in (target[0], *target[2]): require_disjoint(output, protected) - if not {"poweradvantage","steamadvantage","electricadvantage","advantageworkstest"} <= {identity(jar)[0] for jar in target[2]}: + if not {"basepower","basesteam","baseelectric","advantageworkstest"} <= {identity(jar)[0] for jar in target[2]}: raise AssertionError("Harvest requires all three Advantage mods and the native harness") expected_code = read_json(args.target_manifest)["target110"].get("serverCode") if not expected_code: raise AssertionError("Harvest requires an exact sealed server-code inventory") diff --git a/test-rig/migration/native110_machine_operations.py b/test-rig/migration/native110_machine_operations.py index 31c4ccd..3694eb1 100644 --- a/test-rig/migration/native110_machine_operations.py +++ b/test-rig/migration/native110_machine_operations.py @@ -15,7 +15,7 @@ import nbtlib from rig_transport import digest, write_json -from native110 import RIG, LAUNCHER, output_path, pinned_profile, require_disjoint +from native110 import RIG, LAUNCHER, identity, output_path, pinned_profile, require_disjoint from native110_code import Server, code_files, verify_code, INVENTORY from native110_lifecycle import prepare, read_json, require_native_boot, verify_staged @@ -25,7 +25,7 @@ "conveyor/blocked", "conveyor/item-entity", "conveyor/nbt-preserved", "filter/block", "filter/food", "filter/fuel", "filter/ore", "filter/plant", "filter/smelt", "filter/inventory-0", "filter/inventory-1", "filter/inventory-2", "filter/inventory-3", "filter/overflow-0", "filter/overflow-1", "filter/overflow-2", "filter/overflow-3", - "drain/minecraft_water", "drain/poweradvantage_crude_oil", "drain/poweradvantage_refined_oil", + "drain/minecraft_water", "drain/basepower_crude_oil", "drain/basepower_refined_oil", "drain/non-source", "tank/filter-true", "tank/filter-false", "tank/full", "fluid-switch/true", "fluid-switch/false", "discharge/true", "discharge/false", "conveyor/locked-source", "conveyor/locked-destination", "still/production", "still/no-fuel", "still/invalid", "still/full", "still/one-space", "still/redstone"}, @@ -168,21 +168,26 @@ def actors(case): def pin(args): + pinned_profile(args.base.resolve(), "target110") base = read_json(args.base) destination = args.output.resolve() if destination.exists(): raise FileExistsError(destination) destination.mkdir(parents=True) replacements = { - "poweradvantage": RIG.parent / "build/libs/PowerAdvantage-2.4.3.110021.jar", - "steamadvantage": RIG.parent.parent / "SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar", - "electricadvantage": RIG.parent.parent / "ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar", + "basepower": RIG.parent / "build/libs/basePower-2.4.4.110021.jar", + "basesteam": RIG.parent.parent / "SteamAdvantage/SteamAdvantage/build/libs/baseSteam-2.2.6.110021.jar", + "baseelectric": RIG.parent.parent / "ElectricAdvantage/ElectricAdvantage/build/libs/baseElectric-2.2.6.110021.jar", "advantageworkstest": RIG / "build/gradle/libs/AdvantageWorksTestHarness-1.1.0.110021.jar", } if getattr(args, "original_production", False): replacements = {key: value for key, value in replacements.items() if key == "advantageworkstest"} target = copy.deepcopy(base["target110"]) + renamed = {"poweradvantage": "basepower", "steamadvantage": "basesteam", "electricadvantage": "baseelectric"} for jar in target["jars"]: - source = replacements.get(jar["id"], Path(jar["path"])) + wanted = jar["id"] if getattr(args, "original_production", False) else renamed.get(jar["id"], jar["id"]) + source = replacements.get(wanted, (args.base.resolve().parent / jar["path"]).resolve()) + actual_id, version = identity(source) + if actual_id != wanted: raise AssertionError("Wrong candidate mod identity: " + str(source)) checksum = digest(source) folder = destination / "artifacts" / checksum folder.mkdir(parents=True, exist_ok=True) @@ -190,8 +195,8 @@ def pin(args): if path.exists(): raise FileExistsError(path) shutil.copy2(source, path) if digest(path) != checksum: raise AssertionError("Archive copy differs") - jar.update(path=str(path), originPath=str(source), sha256=checksum) - if jar["id"] in replacements: jar["sourceRef"] = "LOCAL_OPERATING_CANDIDATE_" + args.label + jar.update(id=actual_id, version=version, path=str(path), originPath=str(source), sha256=checksum) + if wanted in replacements: jar["sourceRef"] = "LOCAL_OPERATING_CANDIDATE_" + args.label target["qualificationStatus"] = "UNQUALIFIED_OPERATING_CANDIDATE" target["scope"] = args.label target["serverCode"] = {"files": code_files(Path(target["seed"]))} diff --git a/test-rig/migration/native110_rebrand_bucket_proof.py b/test-rig/migration/native110_rebrand_bucket_proof.py new file mode 100644 index 0000000..3b71df3 --- /dev/null +++ b/test-rig/migration/native110_rebrand_bucket_proof.py @@ -0,0 +1,390 @@ +"""Fresh Base24 dependency-only baseline + full renamed candidate, exactly four boots. + +Only this helper's process-local callbacks hold the single exact diagnostic. +Ordinary auditors and frozen helpers are never edited. A failed strict receipt +is mandatory before a separately recorded proof-bound migration rerun. +""" +import argparse +from datetime import datetime, timezone +import importlib +import os +from pathlib import Path +import re +import shutil +import socket +import traceback +from unittest.mock import patch +import uuid + +import nbtlib + +import legacy_bucket_proof as legacy +import native110_machine_operations as operating +from native110 import identity, output_path, require_disjoint +from native110_code import INVENTORY, Server, verify_code +from native110_lifecycle import verify_staged +from native110_rebrand_connected import TARGET_IDS, bind_target +from rig_transport import WORLD, digest, stage, write_json + +KIND = "REBRAND_BASE24_FRESH_FOUR_BOOT_V1" +BOOT_LABELS = {"baseline-first", "baseline-restart", "candidate-operate", "candidate-restart"} +BOOTSTRAP = {"minecraft", "mcp", "FML", "Forge"} +PROBE_SHA = "B9F756681593B508A8E3222BD592A3DFCB474303532B154045893B3C585EF1D3" +PASSIVE_PROBE_SHA = "79157E31FFAF5D66CCDC8030EB7B8C37D0E0D33FD6A601D119F59904A461AAD4" +MODS_LOADED = re.compile(r"^\[\d\d:\d\d:\d\d\] \[Server thread/INFO\] \[FML\]: Forge Mod Loader has successfully loaded \d+ mods\s*$") + + +def require(value, message): + if not value: raise AssertionError(message) + + +def protocol_files(): + return [Path(__file__), *[Path(__file__).with_name(name) for name in + ("legacy_bucket_proof.py", "native110_machine_operations.py", "native110_rebrand_connected.py", + "native110_rebrand_passive.py", "native110_connected.py", "legacy_connected_oracle.py", "semantic_machine_audit.py", + "native110.py", "native110_code.py", "native110_lifecycle.py", "native110_diagnostics.py", "rig_transport.py")]] + + +def pins(path): + profile, _ = bind_target(path) + bound = legacy.pins(path) + require({m["id"] for m in bound["mods"]} == TARGET_IDS and len(bound["mods"]) == 6, "Full six-mod candidate required") + for mod in bound["mods"]: + require(identity(Path(mod["path"])) == (mod["id"], mod["version"]), "Candidate metadata changed") + return profile, bound + + +def bind_candidate(document, candidate): + require(document.get("kind") == KIND and document.get("status") == "PASS", "Not a fresh completed renamed-candidate proof") + require(document.get("candidate") == candidate, "Proof does not bind the entire exact candidate, manifest and Forge inventory") + + +def require_four_boots(boots, role): + require(len(boots) == 4 and {r.get("label") for r in boots} == BOOT_LABELS, "Exactly four distinct physical boots required") + for boot in boots: + diagnostic = boot.get("diagnostic", {}) + require(boot.get("status") == "PASS_BOOT" and type(boot.get("exitCode")) is int and boot["exitCode"] == 0, + "Every physical process must exit cleanly") + require(diagnostic.get("originalSeverity") == "ERROR" and legacy.LATE_BUCKET.fullmatch(diagnostic.get("message", "")), + "Only the exact one Base Metals diagnostic is eligible") + require(role.get("status") == "PASS" and role.get("operationCases") == 3 and role.get("exactColdCases") == 3 + and set(role.get("startupFlags", {})) == {"operate", "restart"}, "All three native bucket/oil cases and cold comparisons are mandatory") + + +def require_baseline_mods(actual, expected): + require(set(expected) == {"basemetals", "orespawn"}, "Baseline declares only Base24 and the same OreSpawn") + require({k: v for k, v in actual.items() if k not in BOOTSTRAP} == expected, "Baseline loaded a harness, Power or another undeclared mod") + + +def observer_sha(mode): + require(mode in ("connected", "passive-source355", "synthetic-nested"), "Unknown source observer mode") + return PROBE_SHA if mode == "connected" else PASSIVE_PROBE_SHA + + +def require_destination_inventory(actual, candidate, mode): + expected = {Path(m["path"]).name: m["sha256"] for m in candidate["mods"]} + extra = {k: v for k, v in actual.items() if k not in expected} + require(len(extra) == 1 and next(iter(extra.values())) == observer_sha(mode), + "Only this mode's exact authentic source observer may supplement the full candidate") + expected.update(extra) + require(actual == expected, "Destination differs from the complete proven candidate") + + +def mod_list(path): + rows = nbtlib.load(path)["FML"]["ModList"] + actual = {str(row["ModId"]): str(row["ModVersion"]) for row in rows} + require(len(actual) == len(rows), "Duplicate saved loaded-mod identity") + return actual + + +def audit_boot(path): + path = Path(path) + return legacy.held_diagnostics(path.read_text(encoding="utf-8", errors="replace").splitlines(), + legacy.BASE_SHA, digest(path.parent / legacy.LAUNCHER)) + + +def seal_sources(output): + seals = {str(p): digest(p) for p in protocol_files()} + for path in protocol_files(): + dest = output / "protocol-sources" / path.name + dest.parent.mkdir(exist_ok=True) + shutil.copy2(path, dest) + return seals + + +def collect(args): + output = output_path(args.output) + candidate_profile, candidate = pins(args.candidate_manifest.resolve()) + dependencies = [m for m in candidate["mods"] if m["id"] in {"basemetals", "orespawn"}] + baseline_profile = candidate_profile[:2] + ([Path(m["path"]) for m in dependencies],) + for protected in (args.candidate_manifest, candidate_profile[0], *candidate_profile[2]): require_disjoint(output, protected) + for port in (args.port, args.port + 1): + with socket.socket() as listener: listener.bind(("127.0.0.1", port)) + output.mkdir(parents=True, exist_ok=False) + token = uuid.uuid4().hex + report = dict(kind=KIND, status=legacy.PENDING, token=token, candidate=candidate, + baseline=dict(mods=dependencies, codeInventory=candidate["codeInventory"]), boots=[], candidateRole={}, classification=None, + scope="Two dependency-only baseline boots without harness/Power, then full six-mod candidate oil/bucket operation and cold restart", + startedAtUtc=datetime.now(timezone.utc).isoformat(), protocolSha256=seal_sources(output)) + receipt = output / "native110-rebrand-bucket-proof.json" + write_json(receipt, report) + server = None + try: + root = output / "baseline" + launcher = stage(root, baseline_profile) + props = root / "server.properties" + props.write_text(props.read_text().replace("server-port=25584", "server-port=" + str(args.port))) + write_json(root / INVENTORY, candidate["codeInventory"]) + write_json(output / "baseline-inputs.json", report["baseline"]) + expected = {m["id"]: m["runtimeVersion"] for m in dependencies} + for phase in ("first", "restart"): + verify_staged(root, baseline_profile) + verify_code(root, candidate["codeInventory"]) + server = Server(root, args.java8, launcher, phase) + server.send("save-all flush") + server.wait("Saved the world", 120) + server.close(); server = None + diagnostic = audit_boot(root / ("console-" + phase + ".log")) + saved = output / ("baseline-level-" + phase + ".dat") + shutil.copy2(root / WORLD / "level.dat", saved) + loaded = mod_list(saved) + require_baseline_mods(loaded, expected) + report["boots"].append(dict(label="baseline-" + phase, status="PASS_BOOT", exitCode=0, + log="baseline/console-" + phase + ".log", diagnostic=diagnostic, savedModList=loaded, + savedLevel=saved.name)) + write_json(receipt, report) + + def pending_candidate_boot(path): + path = Path(path) + require(path.parent.resolve() == (output / "candidate").resolve(), "Unexpected candidate runtime") + phase = {"console-operate.log": "operate", "console-restart.log": "restart"}.get(path.name) + require(phase is not None, "Unexpected candidate boot phase") + verify_staged(path.parent, candidate_profile) + verify_code(path.parent, candidate["codeInventory"]) + diagnostic = audit_boot(path) + write_json(path.with_suffix(".diagnostics.json"), diagnostic) + report["boots"].append(dict(label="candidate-" + phase, status="PASS_BOOT", exitCode=0, + log="candidate/" + path.name, diagnostic=diagnostic)) + write_json(receipt, report) + + with patch.dict(os.environ, {"ADVWORKS_BUCKET_PROOF": token}), \ + patch.object(operating, "require_native_boot", pending_candidate_boot): + code = operating.run(argparse.Namespace(manifest=args.candidate_manifest, output=output / "candidate", + java8=args.java8, port=args.port + 1, group="power/bucket")) + require(code == 0, "Full renamed candidate bucket operation/cold campaign failed") + report["candidateRole"] = legacy.validate_role(operating, output / "candidate", token, candidate) + require_four_boots(report["boots"], report["candidateRole"]) + require(pins(args.candidate_manifest)[1] == candidate, "Candidate inputs changed") + require(report["protocolSha256"] == {str(p): digest(p) for p in protocol_files()}, "Proof protocol changed") + report.update(status="PASS", classification=dict(severity="NOTICE", originalSeverity="ERROR", + exactDiagnostic="REDUNDANT_BASE24_ENABLE_UNIVERSAL_BUCKET_AFTER_INIT", + candidateManifestSha256=candidate["manifestSha256"], baseSha256=legacy.BASE_SHA, forgeSha256=legacy.PUBLIC_FORGE_SHA)) + except BaseException as error: + report.update(status="FAIL", classification=None, failure=str(error), traceback=traceback.format_exc()) + finally: + if server: + try: server.close() + except BaseException as error: report.update(status="FAIL", classification=None, shutdownError=str(error)) + report["completedAtUtc"] = datetime.now(timezone.utc).isoformat() + report["filesSha256"] = {p.relative_to(output).as_posix(): digest(p) for p in output.rglob("*") if p.is_file() and p != receipt} + write_json(receipt, report) + return int(report["status"] != "PASS") + + +def verify_proof(path, checksum): + path = path.resolve() + require(digest(path) == checksum.upper(), "Explicit fresh proof receipt hash changed") + document = legacy.read(path) + _, candidate = pins(Path(document["candidate"]["manifest"])) + bind_candidate(document, candidate) + classification = document.get("classification") or {} + require(classification == dict(severity="NOTICE", originalSeverity="ERROR", + exactDiagnostic="REDUNDANT_BASE24_ENABLE_UNIVERSAL_BUCKET_AFTER_INIT", + candidateManifestSha256=candidate["manifestSha256"], baseSha256=legacy.BASE_SHA, forgeSha256=legacy.PUBLIC_FORGE_SHA), + "Incomplete or broadened classification") + actual = {} + for file in path.parent.rglob("*"): + if file.is_file() and file != path: + require(file.resolve().is_relative_to(path.parent), "Sealed evidence escapes the proof root") + actual[file.relative_to(path.parent).as_posix()] = digest(file) + require(actual and actual == document.get("filesSha256"), "Fresh proof raw evidence changed, disappeared or was added") + require(document["protocolSha256"] == {str(p): digest(p) for p in protocol_files()}, "Proof is bound to another protocol") + baseline = document["baseline"] + require(baseline["codeInventory"] == candidate["codeInventory"] and baseline["mods"] == + [m for m in candidate["mods"] if m["id"] in {"basemetals", "orespawn"}], "Baseline dependencies/Forge differ from candidate") + for boot in document["boots"]: + diagnostic = audit_boot(path.parent / boot["log"]) + require(diagnostic == boot["diagnostic"], "Original boot diagnostic changed") + if boot["label"].startswith("baseline-"): + loaded = mod_list(path.parent / boot["savedLevel"]) + require_baseline_mods(loaded, {m["id"]: m["runtimeVersion"] for m in baseline["mods"]}) + require(loaded == boot["savedModList"], "Baseline saved loaded-mod evidence changed") + role = legacy.validate_role(operating, path.parent / "candidate", document["token"], candidate) + require(role == document["candidateRole"], "Candidate bucket/cold evidence changed") + require_four_boots(document["boots"], role) + for name in ("baseline", "candidate"): + verify_code(path.parent / name, candidate["codeInventory"]) + expected = {Path(m["path"]).name: m["sha256"] for m in (baseline["mods"] if name == "baseline" else candidate["mods"])} + require({p.name: digest(p) for p in (path.parent / name / "mods").glob("*.jar")} == expected, "Proof staged mod inventory changed") + return document + + +def require_strict_failure(path, checksum, candidate): + require(digest(path) == checksum.upper(), "Retained strict failure receipt changed") + failed = legacy.read(path) + require(failed.get("status") == "FAIL" and failed.get("targetManifestSha256") == candidate["manifestSha256"], + "Retained strict failure belongs to another target or is not FAIL") + message = failed.get("failure", "") + prefix = re.match(r"^Native runtime diagnostic at line \d+: (.*)$", message) + require(prefix and legacy.LATE_BUCKET.fullmatch(prefix.group(1)), "Strict primary failure is not solely the exact known Base24 diagnostic") + return failed + + +def rerun(args): + document = verify_proof(args.proof, args.proof_sha256) + _, candidate = pins(args.target_manifest) + bind_candidate(document, candidate) + require_strict_failure(args.strict_failure, args.strict_failure_sha256, candidate) + module = importlib.import_module("native110_rebrand_connected" if args.mode == "connected" else "native110_rebrand_passive") + output = output_path(args.output) + for protected in (args.proof.parent, args.strict_failure.parent): require_disjoint(output, protected) + receipt = output.parent / (output.name + "-fresh-bucket-permit.json") + require(not receipt.exists(), "Refusing to overwrite a permit receipt") + report = dict(status=legacy.PENDING, kind=KIND, mode=args.mode, proof=str(args.proof.resolve()), proofSha256=args.proof_sha256.upper(), + strictFailure=str(args.strict_failure.resolve()), strictFailureSha256=args.strict_failure_sha256.upper(), + candidate=candidate, boots={}, classification=None, protocolSha256={str(p): digest(p) for p in protocol_files()}, + sourceObserver=dict(modid="advantagemigrationprobe", version="1.0.0", sha256=observer_sha(args.mode)), + startedAtUtc=datetime.now(timezone.utc).isoformat()) + write_json(receipt, report) + expected_versions = {m["id"]: m["runtimeVersion"] for m in candidate["mods"]} + original_class = module.NativeServer if args.mode == "connected" else module.PassiveServer + + def destination(root): + require(root.resolve() == output, "Unexpected proof-bound destination") + actual = {p.name: digest(p) for p in (root / "mods").glob("*.jar")} + require_destination_inventory(actual, candidate, args.mode) + verify_code(root, candidate["codeInventory"]) + + class BoundServer(original_class): + def read(self): + for line in self.process.stdout: + if MODS_LOADED.fullmatch(line): + try: + self.bucket_marker.touch(exist_ok=False) + self.bucket_armed = True + except OSError as error: self.arm_error = str(error) + self.log.write(line); self.log.flush(); self.lines.put(line) + + def __init__(self, runtime, java, launcher, label): + self.root = Path(runtime).resolve() + destination(self.root) + require(label in ("converted", "restarted") and label not in report["boots"], "Unexpected/duplicate destination boot") + self.record = dict(status=legacy.PENDING, label=label, token=uuid.uuid4().hex) + report["boots"][label] = self.record + self.bucket_marker = self.root / "advantage-machine-operation.allow" + require(not self.bucket_marker.exists(), "Machine operating authority leaked into pre-init") + self.bucket_armed = False; self.arm_error = None + phase = "operate" if label == "converted" else "restart" + self.flags_path = self.root / ("bucket-startup-" + phase + ".json") + require(not self.flags_path.exists(), "Fresh per-process bucket flags are required") + try: + with patch.dict(os.environ, {"ADVWORKS_BUCKET_PROOF": self.record["token"]}): + super().__init__(runtime, java, launcher, label) + require(self.bucket_armed and self.arm_error is None, "Post-mod-loading bucket witness was not armed") + self.flags_sha = digest(self.flags_path) + versions = dict(expected_versions) + versions["advantagemigrationprobe"] = "1.0.0" + legacy.startup_flags(legacy.read(self.flags_path), self.record["token"], versions) + except BaseException: + if getattr(self, "process", None) is not None and self.process.poll() is None: + try: self.close() + except BaseException: pass + raise + finally: + if self.bucket_armed: self.bucket_marker.unlink(missing_ok=True) + + def close(self): + try: + # Preserve the inherited command restriction, clean exit and code custody; + # replace only this explicitly proven runtime's diagnostic decision. + try: + Server.close(self) + finally: + if args.mode == "connected": + write_json(Path(self.log.name).with_suffix(".commands.json"), self.commands) + destination(self.root) + require(digest(args.proof) == args.proof_sha256.upper(), "Protected proof receipt changed") + require(not hasattr(self, "flags_sha") or digest(self.flags_path) == self.flags_sha, "Fresh startup flags changed") + versions = dict(expected_versions) + versions["advantagemigrationprobe"] = "1.0.0" + flags = legacy.read(self.flags_path) + legacy.startup_flags(flags, self.record["token"], versions) + diagnostic = audit_boot(Path(self.log.name)) + self.record.update(status="PASS_BOOT", exitCode=self.process.returncode, startupFlags=flags, + startupSha256=digest(self.flags_path), logSha256=digest(Path(self.log.name)), diagnostic=diagnostic) + write_json(receipt, report) + except BaseException as error: + self.record.update(status="FAIL", failure=str(error)); write_json(receipt, report) + raise + + try: + arguments = argparse.Namespace(target_manifest=args.target_manifest, output=args.output, java8=args.java8, port=args.port) + if args.mode == "connected": + arguments.source_report = args.source_report; arguments.source_report_sha256 = args.source_report_sha256 + else: + arguments.mode = args.mode; arguments.source_fixture = args.source_fixture; arguments.source_profile = args.source_profile + with patch.object(module, "NativeServer" if args.mode == "connected" else "PassiveServer", BoundServer): + code = module.run(arguments) + name = "native110-rebrand-connected-results.json" if args.mode == "connected" else ( + "native110-rebrand-passive-results.json" if args.mode == "passive-source355" else "native110-rebrand-synthetic-nested-results.json") + primary = legacy.read(output / name) + require(code == 0 and primary.get("status") == "PASS" and primary.get("sourceUnchanged") is True, + "Unchanged primary migration/work/preservation protocol did not pass") + require(set(report["boots"]) == {"converted", "restarted"} and all(b.get("status") == "PASS_BOOT" + and type(b.get("exitCode")) is int and b["exitCode"] == 0 for b in report["boots"].values()), "Two fresh validated rerun boots required") + report.update(status="PASS", classification="FRESH_FOUR_BOOT_PROOF_BOUND_EXACT_BASE24_NOTICE_ONLY", primaryReceiptSha256=digest(output / name)) + except BaseException as error: + report.update(status="FAIL", classification=None, failure=str(error), traceback=traceback.format_exc()) + finally: + try: + verify_proof(args.proof, args.proof_sha256) + require_strict_failure(args.strict_failure, args.strict_failure_sha256, candidate) + require(pins(args.target_manifest)[1] == candidate, "Candidate changed") + require(report["protocolSha256"] == {str(p): digest(p) for p in protocol_files()}, "Rerun protocol changed") + report["protectedEvidenceUnchanged"] = True + except BaseException as error: + report.update(status="FAIL", classification=None, protectedEvidenceUnchanged=False, custodyFailure=str(error)) + report["completedAtUtc"] = datetime.now(timezone.utc).isoformat() + report["filesSha256"] = {p.relative_to(output).as_posix(): digest(p) for p in output.rglob("*") if p.is_file()} if output.exists() else {} + write_json(receipt, report) + return int(report["status"] != "PASS") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + commands = parser.add_subparsers(dest="command", required=True) + collect_parser = commands.add_parser("collect") + collect_parser.add_argument("--candidate-manifest", type=Path, required=True) + rerun_parser = commands.add_parser("rerun") + rerun_parser.add_argument("--proof", type=Path, required=True) + rerun_parser.add_argument("--proof-sha256", required=True) + rerun_parser.add_argument("--strict-failure", type=Path, required=True) + rerun_parser.add_argument("--strict-failure-sha256", required=True) + rerun_parser.add_argument("--target-manifest", type=Path, required=True) + rerun_parser.add_argument("--mode", choices=("connected", "passive-source355", "synthetic-nested"), required=True) + rerun_parser.add_argument("--source-report", type=Path) + rerun_parser.add_argument("--source-report-sha256") + rerun_parser.add_argument("--source-fixture", type=Path) + rerun_parser.add_argument("--source-profile", type=Path) + for command in (collect_parser, rerun_parser): + command.add_argument("--output", type=Path, required=True) + command.add_argument("--java8", type=Path, required=True) + command.add_argument("--port", type=int, required=True) + args = parser.parse_args() + if args.command == "rerun": + if args.mode == "connected" and (not args.source_report or not args.source_report_sha256): parser.error("Connected requires its sealed original source report") + if args.mode != "connected" and (not args.source_fixture or not args.source_profile): parser.error("Passive/synthetic mode requires the authentic source fixture and profile") + return collect(args) if args.command == "collect" else rerun(args) + + +if __name__ == "__main__": raise SystemExit(main()) diff --git a/test-rig/migration/native110_rebrand_connected.py b/test-rig/migration/native110_rebrand_connected.py new file mode 100644 index 0000000..87dc3a2 --- /dev/null +++ b/test-rig/migration/native110_rebrand_connected.py @@ -0,0 +1,270 @@ +"""Original released Cyano 1.10 -> renamed 1.10, on copies and strict diagnostics. + +No historical diagnostic permit is imported. New warnings/errors need new proof. +Only expected identity fields are translated; raw fixtures and snapshots stay intact. +""" +import argparse +import base64 +import copy +from datetime import datetime, timezone +import gzip +import io +from pathlib import Path +import shutil +import socket +import traceback + +import nbtlib + +import legacy_connected_oracle as oracle +import semantic_machine_audit +from native110 import output_path, pinned_profile, require_disjoint +from native110_code import INVENTORY, verify_code +from native110_connected import NativeServer +from native110_lifecycle import read_json, verify_staged +from rig_transport import WORLD, digest, fingerprint, write_json + +NAMESPACES = {"poweradvantage": "basepower", "steamadvantage": "basesteam", "electricadvantage": "baseelectric"} +TARGET_IDS = {"basepower", "basesteam", "baseelectric", "basemetals", "orespawn", "advantageworkstest"} +ORIGINAL_JARS = { + "PowerAdvantage_1.10.2-2.3.0.jar": "47CD509C1141095BFE1C8C7DD689C2ECD3F99C89195E34A88CC9E0B5FC12413E", + "SteamAdvantage_1.10.2-2.2.0.jar": "34A0C46C7B36DEF313F35720BD788539BDEECAD3C30880D30D82BC84E35AD9A5", + "ElectricAdvantage_1.10.2-2.2.0.jar": "61AE5343A79F518F54F1717D508EA3F6DA7209EE69B0C4433E0B7A9722213EE0", + "BaseMetals_1.10.2-2.4.0.11.jar": "A225D3E24CD37C377A9D843861FC13BDDB0B88F799D3D3AEDBC8B1DC636BB5E5", + "OreSpawn_1.10.2-1.1.0.jar": "91345E4B825AA06E05F470066F467AABA0C7A2804A8DBCA4D3CD1905ED53607C", + "AdvantageMigrationProbe-110-1.0.0.jar": "B9F756681593B508A8E3222BD592A3DFCB474303532B154045893B3C585EF1D3", +} +TANKS = {"Tank", "InputTank", "TankIn", "TankOut", "FuelTank", "WaterTank"} + + +def mapped_id(value, namespaces): + domain, separator, path = value.partition(":") + return namespaces.get(domain, domain) + separator + path if separator else value + + +def target_id(value): + return mapped_id(value, NAMESPACES) + + +def tile_alias(value): + if value == "Chest": return "minecraft:chest" + for namespace in (*NAMESPACES, *NAMESPACES.values()): + for prefix in (namespace + ".", "minecraft:" + namespace + "."): + if value.startswith(prefix): return namespace + ":" + value[len(prefix):] + return value + + +def binary_nbt(row): + return nbtlib.File.parse(io.BytesIO(gzip.decompress(base64.b64decode(row["nbtBase64"], validate=True)))) + + +def encode_nbt(tag): + output = io.BytesIO() + tag.write(output) + return base64.b64encode(gzip.compress(output.getvalue())).decode("ascii") + + +def identity_nbt(tag, namespaces): + """Translate tile IDs, inventory stack IDs and named tank fluids, never free text.""" + result = copy.deepcopy(tag) + if "id" in result and isinstance(result["id"], nbtlib.String): + result["id"] = nbtlib.String(mapped_id(tile_alias(str(result["id"])), namespaces)) + + def contents(value): + if not isinstance(value, nbtlib.Compound): return + for key, child in value.items(): + if key in ("Items", "Inventory") and isinstance(child, nbtlib.List): + for stack in child: + if isinstance(stack, nbtlib.Compound) and "Count" in stack and isinstance(stack.get("id"), nbtlib.String): + stack["id"] = nbtlib.String(mapped_id(str(stack["id"]), namespaces)) + if key in TANKS and isinstance(child, nbtlib.Compound) and isinstance(child.get("FluidName"), nbtlib.String): + child["FluidName"] = nbtlib.String(mapped_id(str(child["FluidName"]), namespaces)) + if isinstance(child, nbtlib.Compound): contents(child) + elif isinstance(child, nbtlib.List): + for entry in child: contents(entry) + contents(result) + return result + + +def preservation(before, after): + def rows(document, expected): + result = {} + for row in document["snapshot"]: + if row["id"] in result: raise AssertionError("Duplicate connected witness") + value = {key: row[key] for key in ("station", "kind", "name", "x", "y", "z", "actualName", "properties")} + if expected: value["actualName"] = target_id(value["actualName"]) + if "nbt" in row and "nbtBase64" not in row: raise AssertionError("Missing typed native NBT") + if "nbtBase64" in row: + tag = identity_nbt(binary_nbt(row), NAMESPACES if expected else {}) + if expected and row["actualName"] == "steamadvantage:steam_drill" and "Facing" not in tag: + facings = ("down", "up", "north", "south", "west", "east") + tag["Facing"] = nbtlib.Byte(facings.index(row["properties"]["facing"])) + value["nbt"] = oracle.saved_tile_nbt(tag) + for field in ("ForgeData", "ForgeCaps"): + if value["nbt"].get(field) == {}: value["nbt"].pop(field) + result[row["id"]] = value + return result + left, right = rows(before, True), rows(after, False) + changed = sorted(key for key in left.keys() | right.keys() if left.get(key) != right.get(key)) + return dict(status="FAIL" if changed else "PASS", changed=changed, + comparison="Exact witnesses, block states and typed NBT; only expected namespace fields and documented legacy serializer aliases") + + +def require_passive(document): + if (document.get("held") is not True or type(document.get("buildCallsThisProcess")) is not int + or document["buildCallsThisProcess"] != 0 or type(document.get("advancedTicks")) is not int + or document["advancedTicks"] != 0 or type(document.get("requestedTicks")) is not int + or document["requestedTicks"] != 0): + raise AssertionError("Loaded comparison requires zero ticks, zero construction and held machines") + + +def operation_view(document): + # Only an in-memory comparison view for the unchanged finite-work oracles. + result = copy.deepcopy(document) + reverse = {new: old for old, new in NAMESPACES.items()} + for row in result["snapshot"]: + row["actualName"] = mapped_id(row["actualName"], reverse) + if "nbtBase64" in row: row["nbtBase64"] = encode_nbt(identity_nbt(binary_nbt(row), reverse)) + return result + + +def sealed_json(path, checksum): + path = Path(path).resolve() + if digest(path) != checksum.upper(): raise AssertionError("Changed sealed input: " + str(path)) + return read_json(path) + + +def bind_source(report_path, checksum): + history = sealed_json(report_path, checksum) + if history.get("sourceKey") != "original110" or history.get("status") != "PASS": + raise AssertionError("Only completed original released Cyano 1.10 provenance is eligible") + source = Path(history["source"]).resolve() + manifest = sealed_json(history["sourceManifest"], history["sourceManifestSha256"]) + pins = {Path(j["path"]).name: j["sha256"].upper() for j in manifest["original110"]["jars"]} + actual = {p.name: digest(p) for p in (source / "mods").glob("*.jar")} + if pins != ORIGINAL_JARS or actual != pins: raise AssertionError("Not the exact original release mod inventory") + for jar in manifest["original110"]["jars"]: + if digest((Path(history["sourceManifest"]).parent / jar["path"]).resolve()) != jar["sha256"].upper(): + raise AssertionError("Archived original input artifact changed") + hashes = sealed_json(history["sourceHashes"], history["sourceHashesSha256"]) + if fingerprint(source / WORLD) != hashes: raise AssertionError("Protected original world changed") + if (not history.get("sourceRuntimeBefore") or history["sourceRuntimeBefore"] != history.get("sourceRuntimeAfter") + or fingerprint(source) != history["sourceRuntimeBefore"]): + raise AssertionError("Original fixture definition, configuration or runtime custody changed") + checkpoint = source / ("connected-" + history["sourceCheckpoint"] + ".json") + sealed_json(checkpoint, history["sourceCheckpointSha256"]) + return source, history + + +def bind_target(manifest_path): + target = pinned_profile(manifest_path, "target110") + pins = read_json(manifest_path)["target110"] + jars = pins["jars"] + if len(jars) != len(TARGET_IDS) or {j["id"] for j in jars} != TARGET_IDS: + raise AssertionError("Target must contain exactly basePower/baseSteam/baseElectric plus the three pinned support mods") + base = next(j for j in jars if j["id"] == "basemetals") + if base["sha256"].upper() != ORIGINAL_JARS["BaseMetals_1.10.2-2.4.0.11.jar"]: + raise AssertionError("This route upgrades Advantage, not the source Base Metals registry") + verify_code(target[0], pins["serverCode"]) + return target, pins + + +def run(args): + output = output_path(args.output) + source, history = bind_source(args.source_report, args.source_report_sha256) + target, pins = bind_target(args.target_manifest) + probe = next(j for j in read_json(Path(history["sourceManifest"]))["original110"]["jars"] + if Path(j["path"]).name == "AdvantageMigrationProbe-110-1.0.0.jar") + probe_path = (Path(history["sourceManifest"]).parent / probe["path"]).resolve() + profile = target[:2] + (target[2] + [probe_path],) + for protected in (source, args.source_report, args.target_manifest, target[0], probe_path, *target[2]): + require_disjoint(output, protected) + with socket.socket() as listener: listener.bind(("127.0.0.1", args.port)) + source_before = fingerprint(source) + helpers = [Path(__file__), Path(oracle.__file__), Path(semantic_machine_audit.__file__), + *[Path(__file__).with_name(name) for name in ("native110.py", "native110_code.py", "native110_connected.py", + "native110_lifecycle.py", "native110_diagnostics.py", "rig_transport.py")]] + report = dict(status="RUNNING", sourceKey="original110", sourceReport=str(args.source_report.resolve()), + sourceReportSha256=digest(args.source_report), targetManifest=str(args.target_manifest.resolve()), + targetManifestSha256=digest(args.target_manifest), sourceBefore=source_before, phases={}, + startedAtUtc=datetime.now(timezone.utc).isoformat(), protocolSha256={str(p): digest(p) for p in helpers}, + scope="Original Cyano 1.10 to renamed 1.10 only; two 2048-tick intervals and full process restart; strict diagnostics, no legacy bucket permit") + receipt = output / "native110-rebrand-connected-results.json" + server = None + try: + launcher = oracle.prepare(output, profile, None, args.port, source) + for path in helpers: + destination = output / "protocol-sources" / path.name + destination.parent.mkdir(exist_ok=True) + shutil.copy2(path, destination) + verify_code(output, pins["serverCode"]) + write_json(output / INVENTORY, pins["serverCode"]) + write_json(receipt, report) + if (output / "connected-build.allow").exists(): raise AssertionError("Destination construction authority leaked") + previous = oracle.read(source, history["sourceCheckpoint"]) + definition = read_json(output / "connected-fixture.json") + if oracle.state(previous)["status"] != "PASS": raise AssertionError("Invalid original finite stocks") + for phase in ("converted", "restarted"): + bind_source(args.source_report, args.source_report_sha256) + if digest(args.target_manifest) != report["targetManifestSha256"]: raise AssertionError("Target manifest changed") + verify_staged(output, profile) + verify_code(output, pins["serverCode"]) + server = NativeServer(output, args.java8, launcher, phase) + server.observe("snapshot", phase + "-loaded") + loaded = oracle.read(output, phase + "-loaded") + require_passive(loaded) + preserved = preservation(previous, loaded) + report["phases"][phase + "-preservation"] = preserved + write_json(receipt, report) + if preserved["status"] != "PASS": raise AssertionError("Unticked imported state changed: " + str(preserved)) + server.observe("step", phase + "-worked", 2048) + worked = oracle.read(output, phase + "-worked") + before_view, after_view = operation_view(loaded), operation_view(worked) + operation = oracle.operation(before_view, after_view, 2048) + completed = semantic_machine_audit.connected_interval(before_view, after_view, definition, 2048) + report["phases"][phase + "-operation"] = operation + report["phases"][phase + "-completed-work"] = completed + if operation["status"] != "PASS" or completed["status"] != "PASS": raise AssertionError("Imported machines failed finite paid work") + server.send("save-all flush") + server.wait("Saved the world", 120) + server.close(); server = None + verify_staged(output, profile) + if phase == "converted": shutil.copytree(output / WORLD, output / "pre-restart-save") + previous = worked + write_json(receipt, report) + report["status"] = "PASS" + except BaseException as error: + report.update(status="FAIL", failure=str(error), traceback=traceback.format_exc()) + finally: + if server: + try: server.close() + except BaseException as error: report.update(status="FAIL", shutdownError=str(error)) + report["sourceUnchanged"] = fingerprint(source) == source_before + report["protocolUnchanged"] = report["protocolSha256"] == {str(p): digest(p) for p in helpers} + report["manifestUnchanged"] = digest(args.target_manifest) == report["targetManifestSha256"] + try: + bind_source(args.source_report, args.source_report_sha256) + report["sourceBindingUnchanged"] = True + except BaseException as error: + report.update(status="FAIL", sourceBindingUnchanged=False, sourceBindingError=str(error)) + if not all(report[k] for k in ("sourceUnchanged", "protocolUnchanged", "manifestUnchanged")): report["status"] = "FAIL" + report["completedAtUtc"] = datetime.now(timezone.utc).isoformat() + output.mkdir(parents=True, exist_ok=True) + report["rawSha256"] = {str(p.relative_to(output)): digest(p) for p in output.rglob("*") if p.is_file() and p != receipt} + write_json(receipt, report) + return int(report["status"] != "PASS") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--source-report", type=Path, required=True) + parser.add_argument("--source-report-sha256", required=True) + parser.add_argument("--target-manifest", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--java8", type=Path, required=True) + parser.add_argument("--port", type=int, required=True) + return run(parser.parse_args()) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/test-rig/migration/native110_rebrand_passive.py b/test-rig/migration/native110_rebrand_passive.py new file mode 100644 index 0000000..04cbe70 --- /dev/null +++ b/test-rig/migration/native110_rebrand_passive.py @@ -0,0 +1,299 @@ +"""Independent authentic Cyano 355-witness passive upgrade, or separate synthetic serializers. + +Neither mode edits original files. The passive observer has no NBT load/repair path. +Synthetic detached-player/item cases are never original-player migration evidence. +""" +import argparse +import base64 +from datetime import datetime, timezone +import gzip +import io +from pathlib import Path +import shutil +import socket +import traceback + +import nbtlib + +import legacy_connected_oracle as legacy +from native110 import output_path, require_disjoint +from native110_code import INVENTORY, Server, verify_code +from native110_lifecycle import read_json, require_native_boot, verify_staged +from native110_rebrand_connected import ORIGINAL_JARS, NAMESPACES, binary_nbt, bind_target, identity_nbt, target_id +from rig_transport import WORLD, copy_fixture, digest, fingerprint, stage, write_json + +AUTHENTIC_SCOPE = "AUTHENTIC_ORIGINAL_RELEASE_110_PASSIVE_355" +SYNTHETIC_SCOPE = "SYNTHETIC_NATIVE_SERIALIZERS_NOT_ORIGINAL_PLAYER_OR_ENTITY_PROOF" +PROFILE_SHA = "6A6A7C57D674CCD30656098B1D1F3EC3C0AD95B49927511B039BF0F93CF3FE09" +SOURCE_FILES = { + "fixture-hashes.json": "2C9E521E6E813D8822A8B882B0D81D210B8646D11BC978D845621AC124273E41", + "migration-fixture.json": "FF1B1E6D0977E12577B1FCABDB5A2410EEBE016DCEB52E1B5004DE99BAB3AD01", + "migration-source.json": "C490A49CDFBCA43E01F1179CA035773BB36628727831E84149205EF5260664BA", + "input-jars.json": "62E42341F646C0C52C512B74E1F99DAFA7FA0A8AE9BE63DD4D76B989B70202B8", +} +SOURCE_JARS = {**ORIGINAL_JARS, "AdvantageMigrationProbe-110-1.0.0.jar": + "79157E31FFAF5D66CCDC8030EB7B8C37D0E0D33FD6A601D119F59904A461AAD4"} +SYNTHETIC_CASES = {"synthetic/player-inventory-ender-armor-offhand", "synthetic/dropped-enchanted-item", + "synthetic/nested-container-stack"} +RETAINED_ENCHANTMENTS = {"steamadvantage:" + name for name in + ("rapid_reload", "powderless", "high_explosive", "recoil")} + + +def saved_enchantments(world): + level = nbtlib.load(world / "level.dat") + entries = level["FML"]["Registries"]["minecraft:enchantments"]["ids"] + return registry([(int(row["V"]), str(row["K"])) for row in entries]) + + +def registry(rows): + result = {} + names = set() + for numeric_id, name in rows: + if type(numeric_id) is not int or numeric_id < 0 or numeric_id in result or name in names: + raise AssertionError("Missing/duplicate/malformed enchantment registry identity") + result[numeric_id] = name + names.add(name) + if not result: raise AssertionError("No genuine native enchantment registry") + return result + + +def canonical_nbt(row, enchantments, expected): + tag = identity_nbt(binary_nbt(row), NAMESPACES if expected else {}) + if expected and row["actualName"] == "steamadvantage:steam_drill" and "Facing" not in tag: + meta = row["metadata"] + facings = ("down", "up", "north", "south", "west", "east") + if type(meta) is not int or not 0 <= meta < len(facings) or row["properties"].get("facing") != facings[meta]: + raise AssertionError("Original Steam drill metadata and facing disagree") + tag["Facing"] = nbtlib.Byte(meta) + result = legacy.saved_tile_nbt(tag) + for field in ("ForgeData", "ForgeCaps"): + if result.get(field) == {}: result.pop(field) + + def visit(value): + if isinstance(value, dict): + for key, child in value.items(): + if key in ("ench", "StoredEnchantments", "Enchantments"): + if not isinstance(child, list) or len(child) != 3 or child[:2] != ["List", 10]: + raise AssertionError("Malformed typed enchantment list") + for entry in child[2]: + kind, numeric_id = entry["id"] + if kind not in ("Short", "Int") or type(numeric_id) is not int or numeric_id not in enchantments: + raise AssertionError("Unresolved native enchantment ID") + name = enchantments[numeric_id] + entry["id"] = [kind, target_id(name) if expected and name not in RETAINED_ENCHANTMENTS else name] + visit(child) + elif isinstance(value, list): + for child in value: visit(child) + visit(result) + return result + + +def compare_rows(before, after, before_enchantments, after_enchantments): + def indexed(rows, enchantments, expected): + if len(rows) != 355: raise AssertionError("All 355 authentic witnesses are mandatory") + result = {} + for row in rows: + pos = tuple(row[k] for k in ("x", "y", "z")) + if any(type(n) is not int for n in pos) or pos in result: raise AssertionError("Duplicate/invalid witness position") + value = {key: row[key] for key in ("name", "metadata", "actualName", "properties")} + if type(value["metadata"]) is not int: raise AssertionError("Invalid metadata type") + if expected: value["actualName"] = target_id(value["actualName"]) + if "nbt" in row and "nbtBase64" not in row: raise AssertionError("Missing authoritative binary NBT") + if "nbtBase64" in row: value["nbt"] = canonical_nbt(row, enchantments, expected) + result[pos] = value + return result + left = indexed(before, before_enchantments, True) + right = indexed(after, after_enchantments, False) + differences = [dict(position=pos, expected=left.get(pos), actual=right.get(pos)) + for pos in sorted(left.keys() | right.keys()) if left.get(pos) != right.get(pos)] + if differences: raise AssertionError("Passive registry/meta/typed-NBT differences: " + str(differences[:5])) + return dict(status="PASS", witnesses=355, tiles=sum("nbtBase64" in row for row in before), + comparison="Exact metadata, properties and typed NBT; expected namespace fields only; numeric enchantments resolved against each genuine registry") + + +def coverage(source, rows): + stacks, enchantments = [], [] + def visit(tag): + if isinstance(tag, nbtlib.Compound): + if "Count" in tag and isinstance(tag.get("id"), nbtlib.String): stacks.append(tag) + for key, child in tag.items(): + if key in ("ench", "StoredEnchantments", "Enchantments"): enchantments.extend(child) + visit(child) + elif isinstance(tag, nbtlib.List): + for child in tag: visit(child) + for row in rows: + if "nbtBase64" in row: visit(binary_nbt(row)) + world = source / WORLD + return dict(blockStateWitnesses=len(rows), tileWitnesses=sum("nbtBase64" in r for r in rows), + distinctBlockNames=len({r["name"] for r in rows}), inventoryStacks=len(stacks), + inventoryItems=sum(int(s["Count"]) for s in stacks), distinctItemNames=len({str(s["id"]) for s in stacks}), + enchantmentEntries=len(enchantments), playerFiles=len(list((world / "playerdata").glob("*.dat"))), + levelPlayer="Player" in nbtlib.load(world / "level.dat").get("Data", {}), declaredEntityWitnesses=0, + gaps=["No authentic saved player, ender inventory or armor/offhand fixture", + "No declared actor fixture; independent read-only scan found no saved entities", + "Synthetic detached serializers are not player-login, entity-spawn or cross-restart player acceptance"]) + + +def bind_fixture(source, source_profile): + source, source_profile = source.resolve(), source_profile.resolve() + if digest(source_profile) != PROFILE_SHA: raise AssertionError("Not the sealed original-Cyano profile manifest") + for name, checksum in SOURCE_FILES.items(): + if digest(source / name) != checksum: raise AssertionError("Changed authentic source receipt: " + name) + profile = read_json(source_profile)["original110"] + if {Path(j["path"]).name: j["sha256"].upper() for j in profile["jars"]} != SOURCE_JARS: + raise AssertionError("Source profile does not describe the original released jars and original passive probe") + if {p.name: digest(p) for p in (source / "mods").glob("*.jar")} != SOURCE_JARS: + raise AssertionError("Archived source mod bytes differ") + if fingerprint(source / WORLD) != read_json(source / "fixture-hashes.json"): + raise AssertionError("Protected authentic source world changed") + rows = read_json(source / "migration-source.json") + if len(rows) != 355 or len(read_json(source / "migration-fixture.json")) != 355: + raise AssertionError("Not the complete original 355-witness fixture") + return rows, saved_enchantments(source / WORLD) + + +def source_observer(source): + path = source / "mods" / "AdvantageMigrationProbe-110-1.0.0.jar" + if digest(path) != SOURCE_JARS[path.name]: + raise AssertionError("The exact authentic passive source observer is required") + return path + + +def validate_passive(document): + if (document.get("scope") != AUTHENTIC_SCOPE or document.get("held") is not True + or any(type(document.get(k)) is not int or document[k] != 0 + for k in ("constructionCallsThisProcess", "requestedTicks", "advancedTicks")) + or type(document.get("frozenTileObjects")) is not int or document["frozenTileObjects"] < 1): + raise AssertionError("Missing frozen, nonconstructing passive native observation") + return registry([(r["numericId"], r["name"]) for r in document["enchantments"]]) + + +def decoded(value): + return nbtlib.File.parse(io.BytesIO(gzip.decompress(base64.b64decode(value, validate=True)))) + + +def validate_nested(document): + if (document.get("scope") != SYNTHETIC_SCOPE or document.get("status") != "PASS" + or type(document.get("worldInsertions")) is not int or document["worldInsertions"] != 0 + or type(document.get("playerFileWrites")) is not int or document["playerFileWrites"] != 0): + raise AssertionError("Not a complete isolated synthetic native serializer regression") + cases = document.get("cases", []) + if len(cases) != 3 or {r["id"] for r in cases} != SYNTHETIC_CASES: + raise AssertionError("All three separate synthetic cases are required") + for row in cases: + if row.get("status") != "PASS" or row.get("nativeSemantics") is not True: + raise AssertionError("Native serializer semantics failed") + expected, actual = decoded(row["expectedNbtBase64"]), decoded(row["actualNbtBase64"]) + if legacy.typed_nbt(expected) != legacy.typed_nbt(actual): + raise AssertionError("Synthetic typed native readback changed: " + row["id"]) + if not decoded(row["inputNbtBase64"]): raise AssertionError("Missing declared synthetic legacy input") + return dict(status="PASS", cases=3, scope=SYNTHETIC_SCOPE) + + +class PassiveServer(Server): + def send(self, command): + if command not in ("stop", "save-all flush") and not command.startswith(("advpassive snapshot ", "advnested run ")): + raise AssertionError("Forbidden passive runtime command: " + command) + super().send(command) + + def close(self): + try: return super().close() + finally: require_native_boot(Path(self.log.name)) + + +def run(args): + output = output_path(args.output) + source, source_profile = args.source_fixture.resolve(), args.source_profile.resolve() + original, original_enchantments = bind_fixture(source, source_profile) + target, pins = bind_target(args.target_manifest) + observer = source_observer(source) + runtime_profile = target[:2] + (target[2] + [observer],) + for protected in (source, source_profile, args.target_manifest, target[0], *target[2]): require_disjoint(output, protected) + with socket.socket() as listener: listener.bind(("127.0.0.1", args.port)) + source_before = fingerprint(source) + helpers = [Path(__file__), *[Path(__file__).with_name(name) for name in + ("native110_rebrand_connected.py", "native110_connected.py", "legacy_connected_oracle.py", "semantic_machine_audit.py", + "native110.py", "native110_code.py", "native110_lifecycle.py", "native110_diagnostics.py", "rig_transport.py")]] + report = dict(status="RUNNING", mode=args.mode, scope=AUTHENTIC_SCOPE if args.mode == "passive-source355" else SYNTHETIC_SCOPE, + source=str(source), sourceProfile=str(source_profile), sourceProfileSha256=digest(source_profile), + targetManifest=str(args.target_manifest.resolve()), targetManifestSha256=digest(args.target_manifest), + sourceBefore=source_before, sourceFilesSha256=SOURCE_FILES, coverage=coverage(source, original), phases={}, + sourceObserver=dict(path=str(observer), sha256=digest(observer), modid="advantagemigrationprobe", version="1.0.0", + scope="Exact original fixture dependency; initialization freezes tiles only; legacy build/snapshot commands forbidden"), + protocolSha256={str(p): digest(p) for p in helpers}, startedAtUtc=datetime.now(timezone.utc).isoformat()) + receipt = output / ("native110-rebrand-passive-results.json" if args.mode == "passive-source355" else "native110-rebrand-synthetic-nested-results.json") + server = None + try: + launcher = stage(output, runtime_profile) + copy_fixture(source, output) + (output / "advantage-passive-migration.allow").touch() + if args.mode == "synthetic-nested": + (output / "advantage-nested-identity.allow").touch() + write_json(output / "source-enchantments.json", {name: numeric_id for numeric_id, name in original_enchantments.items()}) + props = output / "server.properties" + props.write_text(props.read_text().replace("server-port=25584", "server-port=" + str(args.port))) + for path in helpers: + destination = output / "protocol-sources" / path.name + destination.parent.mkdir(exist_ok=True) + shutil.copy2(path, destination) + write_json(output / INVENTORY, pins["serverCode"]) + write_json(receipt, report) + before, before_enchantments = original, original_enchantments + for phase in ("converted", "restarted"): + bind_fixture(source, source_profile) + if digest(args.target_manifest) != report["targetManifestSha256"]: raise AssertionError("Target manifest changed") + if (output / "migration-operate.allow").exists() or (output / "advantage-machine-operation.allow").exists(): + raise AssertionError("Passive world acquired operating authority") + verify_staged(output, runtime_profile) + verify_code(output, pins["serverCode"]) + server = PassiveServer(output, args.java8, launcher, phase) + if args.mode == "passive-source355": + server.send("advpassive snapshot " + phase) + server.wait("ADVPASSIVE COMPLETE " + phase, 180) + observed = read_json(output / ("passive-" + phase + ".json")) + after_enchantments = validate_passive(observed) + report["phases"][phase] = compare_rows(before, observed["snapshot"], before_enchantments, after_enchantments) + before, before_enchantments = observed["snapshot"], after_enchantments + else: + server.send("advnested run " + phase) + server.wait("ADVNESTED COMPLETE " + phase, 180) + report["phases"][phase] = validate_nested(read_json(output / ("nested-identity-" + phase + ".json"))) + server.send("save-all flush") + server.wait("Saved the world", 120) + server.close(); server = None + verify_staged(output, runtime_profile) + if phase == "converted": shutil.copytree(output / WORLD, output / "pre-restart-save") + write_json(receipt, report) + report["status"] = "PASS" + except BaseException as error: + report.update(status="FAIL", failure=str(error), traceback=traceback.format_exc()) + finally: + if server: + try: server.close() + except BaseException as error: report.update(status="FAIL", shutdownError=str(error)) + report["sourceUnchanged"] = fingerprint(source) == source_before + report["protocolUnchanged"] = report["protocolSha256"] == {str(p): digest(p) for p in helpers} + report["manifestUnchanged"] = digest(args.target_manifest) == report["targetManifestSha256"] + try: bind_fixture(source, source_profile) + except BaseException as error: report.update(status="FAIL", sourceBindingError=str(error)) + if not all(report[k] for k in ("sourceUnchanged", "protocolUnchanged", "manifestUnchanged")): report["status"] = "FAIL" + output.mkdir(parents=True, exist_ok=True) + report["completedAtUtc"] = datetime.now(timezone.utc).isoformat() + report["rawSha256"] = {str(p.relative_to(output)): digest(p) for p in output.rglob("*") if p.is_file() and p != receipt} + write_json(receipt, report) + return int(report["status"] != "PASS") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--mode", choices=("passive-source355", "synthetic-nested"), default="passive-source355") + parser.add_argument("--source-fixture", type=Path, required=True) + parser.add_argument("--source-profile", type=Path, required=True) + parser.add_argument("--target-manifest", type=Path, required=True) + parser.add_argument("--java8", type=Path, required=True) + parser.add_argument("--port", type=int, required=True) + parser.add_argument("--output", type=Path, required=True) + return run(parser.parse_args()) + + +if __name__ == "__main__": raise SystemExit(main()) diff --git a/test-rig/migration/native110_recipe_progression.py b/test-rig/migration/native110_recipe_progression.py index 7773ffe..f44eea5 100644 --- a/test-rig/migration/native110_recipe_progression.py +++ b/test-rig/migration/native110_recipe_progression.py @@ -20,21 +20,21 @@ "leather","string","feather","blaze_rod","ender_pearl","quartz","bone","cactus","dirt") ORE_ROOTS=("oreCopper","oreTin","oreZinc","oreLead","oreNickel","oreSilver","oreLithium","oreSulfur") EXCLUSIONS={ - "poweradvantage:infinite_steam@0":"Creative-only source", - "poweradvantage:infinite_electricity@0":"Creative-only source", - "poweradvantage:infinite_quantum@0":"Creative-only source", - "poweradvantage:crude_oil@0":"World fluid identity; natural collection is outside this audit", - "poweradvantage:refined_oil@0":"World fluid identity; live distillation is outside this audit", - "poweradvantage:fluid_pipe_terminal@0":"Hidden ordinary-pipe state", - "steamadvantage:drillbit@0":"Drill-created helper", - "steamadvantage:platform@0":"Elevator-created helper", - "steamadvantage:pump_pipe_steam@0":"Pump-created helper", - "electricadvantage:pump_pipe_electric@0":"Pump-created helper", - "electricadvantage:laser_turret_evil@0":"Hidden converted turret state", + "basepower:infinite_steam@0":"Creative-only source", + "basepower:infinite_electricity@0":"Creative-only source", + "basepower:infinite_quantum@0":"Creative-only source", + "basepower:crude_oil@0":"World fluid identity; natural collection is outside this audit", + "basepower:refined_oil@0":"World fluid identity; live distillation is outside this audit", + "basepower:fluid_pipe_terminal@0":"Hidden ordinary-pipe state", + "basesteam:drillbit@0":"Drill-created helper", + "basesteam:platform@0":"Elevator-created helper", + "basesteam:pump_pipe_steam@0":"Pump-created helper", + "baseelectric:pump_pipe_electric@0":"Pump-created helper", + "baseelectric:laser_turret_evil@0":"Hidden converted turret state", } -CORE={"poweradvantage:sprocket@0","poweradvantage:fluid_pipe@0","steamadvantage:steam_governor@0", - "steamadvantage:steam_pipe@0","electricadvantage:integrated_circuit@0","electricadvantage:psu@0", - "electricadvantage:electric_conduit@0","electricadvantage:photovoltaic_generator@0"} +CORE={"basepower:sprocket@0","basepower:fluid_pipe@0","basesteam:steam_governor@0", + "basesteam:steam_pipe@0","baseelectric:integrated_circuit@0","baseelectric:psu@0", + "baseelectric:electric_conduit@0","baseelectric:photovoltaic_generator@0"} def mode_checks(doc,mode,rubber): @@ -48,7 +48,7 @@ def mode_checks(doc,mode,rubber): ids=[r["id"] for r in crafting] if len(ids)!=len(set(ids)): raise AssertionError("Duplicate native recipe evidence") for row in crafting: - owned=isinstance(row.get("output"),str) and row["output"].startswith(("poweradvantage:","steamadvantage:","electricadvantage:")) + owned=isinstance(row.get("output"),str) and row["output"].startswith(("basepower:","basesteam:","baseelectric:")) if row.get("owned") is not owned: raise AssertionError("Native recipe ownership evidence is missing or inconsistent") if row.get("status")=="PASS" and (row.get("negativeControlsRejected")!=2 or type(row.get("count")) is not int or row["count"]<=0 or not row.get("output") @@ -61,17 +61,17 @@ def mode_checks(doc,mode,rubber): if row.get("status")=="PASS" and row.get("owned") is True and row.get("recipeBookCraftUnlock")!="N/A_NO_1_10_RECIPE_BOOK": raise AssertionError("Missing native recipe-book result or explicit legacy N/A") def rows(output): return [r for r in crafting if r.get("output")==output] - for target in ("poweradvantage:sprocket@0","electricadvantage:integrated_circuit@0","electricadvantage:photovoltaic_generator@0"): + for target in ("basepower:sprocket@0","baseelectric:integrated_circuit@0","baseelectric:photovoltaic_generator@0"): if bool(rows(target)) != (mode!="APOCALYPTIC"): raise AssertionError("Recipe mode restriction changed: "+target) - for target in ("steamadvantage:steam_governor@0","electricadvantage:psu@0"): + for target in ("basesteam:steam_governor@0","baseelectric:psu@0"): if not rows(target): raise AssertionError("Mode lost a foundational recipe: "+target) iron=set(doc.get("ores",{}).get("ingotIron",[])) - pipes=[r for r in rows("poweradvantage:fluid_pipe@0") + pipes=[r for r in rows("basepower:fluid_pipe@0") if len([x for x in r.get("inputs",[]) if x])==6 and all(x in iron for x in r["inputs"] if x)] if not pipes or any(r["count"]!=(3 if mode=="APOCALYPTIC" else 6) for r in pipes): raise AssertionError("Native iron-pipe yield changed") - chips=rows("electricadvantage:integrated_circuit@0") + chips=rows("baseelectric:integrated_circuit@0") # Forge may expand a wildcard ore entry into concrete matching-stack variants. def matches_provider(value,choices): return (isinstance(value,str) and "@" in value and isinstance(choices,list) @@ -125,7 +125,7 @@ def reachability(doc): blocked=[]; excluded={} for target in doc["targets"]: if target in EXCLUSIONS: excluded[target]=EXCLUSIONS[target] - elif doc["mode"]=="APOCALYPTIC" and target=="electricadvantage:photovoltaic_generator@0": + elif doc["mode"]=="APOCALYPTIC" and target=="baseelectric:photovoltaic_generator@0": excluded[target]="Explicit legacy Apocalyptic restriction" elif target not in known: blocked.append(target) return {"reachable":known,"blocked":sorted(blocked),"excluded":excluded,"rounds":rounds, @@ -174,7 +174,7 @@ def run(args): launcher=prepare(runtime,target,[],args.port) verify_code(runtime,code); write_json(runtime/INVENTORY,code) (runtime/"advantage-legacy-recipes.allow").touch() - config=runtime/"config/poweradvantage.cfg"; config.parent.mkdir(exist_ok=True) + config=runtime/"config/basepower.cfg"; config.parent.mkdir(exist_ok=True) config.write_text('options {\n S:recipe_mode='+mode+'\n B:plastic_equals_rubber='+str(not args.no_rubber).lower()+'\n}\n',encoding="utf-8") proofs={} for phase in ("initial","restart"): diff --git a/test-rig/migration/native110_survival_progression.py b/test-rig/migration/native110_survival_progression.py new file mode 100644 index 0000000..fc1217f --- /dev/null +++ b/test-rig/migration/native110_survival_progression.py @@ -0,0 +1,194 @@ +"""Native finite-material crafting/trading and naturally ticking starter-plant checks.""" +import argparse +from collections import Counter +from datetime import datetime, timezone +import json +from pathlib import Path +import shutil +import socket +import traceback + +from rig_transport import digest, write_json +from native110 import output_path, pinned_profile, require_disjoint +from native110_code import INVENTORY, Server, verify_code +from native110_lifecycle import prepare, read_json, require_native_boot, verify_staged +from native110_recipe_progression import MODES, mode_checks, canonical +from survival110_plan import plan + + +def validate_replay(proposed, first, continued): + rows = first["actions"] + continued["actions"] + if len(rows) != len(proposed["actions"]): raise AssertionError("Missing/repeated finite replay step") + stock = Counter(proposed["initial"]) + for index, (action, receipt) in enumerate(zip(proposed["actions"], rows)): + if (receipt.get("index") != index or receipt.get("status") != "PASS" or receipt.get("kind") != action["kind"] + or receipt.get("output") != action["output"] or receipt.get("before") != +stock): + raise AssertionError("Wrong replay step or pre-debit stock at " + str(index)) + debits = Counter() + kind = action["kind"] + if kind == "craft": + if receipt.get("nativeConsumption") != "SlotCrafting" or receipt.get("negativeControlsRejected") != 2: + raise AssertionError("Missing real craft consumption or negative controls") + if receipt.get("selectedInputs") != action["inputs"]: raise AssertionError("Substituted ingredient route") + debits.update(x for x in action["inputs"] if x) + returned = action.get("emptyBucketsReturned", 0) + if receipt.get("returnedEmptyBuckets") != returned: raise AssertionError("Missing/duplicated empty bucket") + elif kind == "smelt": + if not 200 <= receipt.get("nativeUpdates", 0) <= 220 or receipt.get("coalDebited") != 1: + raise AssertionError("Registered smelting function is not fuelled processing evidence") + debits.update([action["input"], action["fuel"]]) + elif kind == "crush": + if receipt.get("durabilityDebited") != 1 or receipt.get("nativeInteraction") != "Item.onItemUse + EntityItem outputs": + raise AssertionError("Crushing lookup is not a real hammer interaction") + debits.update([action["input"]]) + if receipt.get("toolBroke") is not action["toolBreaks"]: raise AssertionError("Wrong tool lifetime") + if action["toolBreaks"]: debits[action["tool"]] += 1 + elif kind == "trade": + if receipt.get("nativeConsumption") != "SlotMerchantResult" or receipt.get("offer") != action["trade"]["id"]: + raise AssertionError("Registered offer is not a paid native transaction") + debits[action["trade"]["input"]] += action["trade"]["price"] + if action["trade"].get("secondInput"): debits[action["trade"]["secondInput"]] += action["trade"]["secondPrice"] + elif kind == "water": debits["minecraft:bucket@0"] += 1 + else: raise AssertionError("Unknown action") + if any(stock[item] < count for item, count in debits.items()): raise AssertionError("Free intermediate item or overdraft") + stock.subtract(debits) + stock[action["output"]] += action["count"] + if kind == "craft": stock["minecraft:bucket@0"] += action.get("emptyBucketsReturned", 0) + if receipt.get("after") != +stock: raise AssertionError("Wrong native material balance at " + str(index)) + if +stock != proposed["expectedStock"] or continued.get("craftedStock") != +stock: + raise AssertionError("Final finite stock disagrees with independent accounting") + if first.get("stock") != continued.get("resumedStock"): + raise AssertionError("Crafting stock reset across full process restart") + if not first.get("stockTyped") or first["stockTyped"]!=continued.get("resumedStockTyped"): + raise AssertionError("Typed item/tool state changed across full process restart") + + +def validate_phases(proposed, phases): + for name, expected in (("first", "CRAFT_CHECKPOINT"), ("continue", "MACHINE_CHECKPOINT"), ("resume", "PASS"), ("inspect", "PASS")): + row = phases[name] + if (row.get("status") != expected or row.get("mode") != proposed["mode"] + or row.get("rubber") is not proposed["rubber"] or row.get("minecraft") != "1.10.2"): + raise AssertionError("Incomplete/wrong native phase " + name) + validate_replay(proposed, phases["first"], phases["continue"]) + for phase in ("resume", "inspect"): + if phases[phase].get("coldMachineState") != "EXACT_TYPED_NBT_AND_BLOCK_EQUAL": + raise AssertionError("Machine state not checked cold before restart ticks") + live = phases["resume"] + if (live.get("crudeOilDebited"), live.get("refinedOilProducedAndConsumed"), live.get("plasticProduced"), live.get("steamSmeltProduced")) != (1000,500,5,1): + raise AssertionError("Live fluid/product conservation or paid steam work failed") + if not 620 <= live.get("naturalMachineTicks", 0) < 2200: raise AssertionError("No bounded natural machine operation") + if live.get("steamReceived") is not True or live.get("maximumSteamFurnaceTemperature",0)<=800: + raise AssertionError("Coal-only smelting is not proof of network steam heating") + if phases["inspect"].get("stock") != live.get("stock"): raise AssertionError("Products lost or duplicated after final restart") + if not live.get("stockTyped") or phases["inspect"].get("stockTyped")!=live["stockTyped"]: + raise AssertionError("Final typed item state changed across full process restart") + operation_stock=Counter(proposed["expectedStock"]) + for item in ("basepower:still@0","baseelectric:hydroelectric_generator@0","baseelectric:plastic_refinery@0", + "basesteam:steam_boiler_coal@0","basesteam:steam_furnace@0","basesteam:steam_pipe@0"): + operation_stock[item]-=1 + operation_stock["minecraft:coal@0"]-=3 + operation_stock["minecraft:iron_ore@0"]-=1 + if any(v<0 for v in operation_stock.values()) or phases["continue"]["stock"] != +operation_stock: + raise AssertionError("Starter plant did not debit exact crafted machinery, inputs and fuel") + operation_stock["baseelectric:petrolplastic_ingot@0"]+=5 + if live["stock"] != +operation_stock: raise AssertionError("Live production invented or lost stock") + water=1000*sum(action["kind"]=="water" for action in proposed["actions"])+2000 + if live.get("waterSourcesCollectedMb")!=water: raise AssertionError("Missing bucket/source-fluid conservation") + + +def run(args): + root = output_path(args.output) + manifest = args.target_manifest.resolve() + target = pinned_profile(manifest, "target110") + for path in (manifest, target[0], *target[2]): require_disjoint(root,path) + code = read_json(manifest)["target110"]["serverCode"] + verify_code(target[0],code) + with socket.socket() as sock: sock.bind(("127.0.0.1",args.port)) + root.mkdir(parents=True) + sources = [Path(__file__), *[Path(__file__).with_name(name) for name in + ("survival110_plan.py", "native110_recipe_progression.py", "rig_transport.py", "native110.py", "native110_code.py", "native110_lifecycle.py", "native110_diagnostics.py")], + *[Path(__file__).parents[1]/"src/main/java/zone/moddev/mc/advantageworks"/name for name in + ("NativeSurvivalProgressionProbe.java", "NativeRecipeProgressionProbe.java", "NativeEntityHold.java", "NativeFluidPort.java")]] + seals = {str(path):digest(path) for path in sources} + for path in sources: + dest=root/"protocol-sources"/path.name; dest.parent.mkdir(exist_ok=True); shutil.copy2(path,dest) + report = dict(status="RUNNING", startedAtUtc=datetime.now(timezone.utc).isoformat(), manifest=str(manifest), manifestSha256=digest(manifest), + protocolSha256=seals, cases={}, + scope="FINITE_HARVESTED_INPUTS_NATIVE_CRAFTS_HAMMER_TRADES_BUCKETS_AND_NATURAL_STARTER_PLANT", + limitations=["Resource harvesting, villager encounter and career leveling are not simulated", + "Vanilla furnaces use bounded native updates with real coal, not wall-clock ticks", + "Additional Loot Tables is not in the pinned pack; absent loot remains a reported integration gap", + "No 1.10 recipe book or ingredient advancements exist"]) + server=None + try: + for mode in ([args.mode] if args.mode else MODES): + for rubber in ([args.rubber == "on"] if args.rubber else (True,False)): + name=mode.lower()+("-rubber" if rubber else "-no-rubber") + runtime=root/name + launcher=prepare(runtime,target,[],args.port) + verify_code(runtime,code);write_json(runtime/INVENTORY,code) + for marker in ("advantage-legacy-recipes.allow","advantage-survival.allow"): (runtime/marker).touch() + config=runtime/"config/basepower.cfg";config.parent.mkdir(exist_ok=True) + config.write_text('options {\n S:recipe_mode='+mode+'\n B:plastic_equals_rubber='+str(rubber).lower()+'\n}\n',encoding="utf-8") + phases={}; exports={} + for phase in ("first","continue","resume","inspect"): + verify_staged(runtime,target) + server=Server(runtime,args.java8,launcher,phase) + if phase in ("first","inspect"): + server.send("advlegacyrecipes "+phase);server.wait("ADVLEGACYRECIPES COMPLETE "+phase,180) + doc=read_json(runtime/"advantage-works-results"/("legacy-recipes-"+phase+".json")) + mode_checks(doc,mode,rubber);exports[phase]=doc + if phase=="first": + proposed=plan(doc) + gaps={item for item,row in proposed["coverage"].items() if row["status"]=="NO_FINITE_ROUTE"} + if gaps-{"baseelectric:li_nugget@0"}: raise AssertionError("New unclassified progression blockers: "+str(sorted(gaps))) + write_json(runtime/"survival-plan.json",proposed) + plan_seal=digest(runtime/"survival-plan.json") + print(name+" PLAN actions="+str(len(proposed["actions"])),flush=True) + if digest(runtime/"survival-plan.json")!=plan_seal: raise AssertionError("Finite plan changed during progression") + server.send("advsurvival "+phase+" "+phase) + server.wait("ADVSURVIVAL COMPLETE "+phase,240) + phases[phase]=read_json(runtime/"advantage-works-results"/("survival-"+phase+".json")) + server.send("save-all flush");server.close();server=None + require_native_boot(runtime/("console-"+phase+".log"));verify_staged(runtime,target) + if phases[phase].get("status")=="FAIL": raise AssertionError(phases[phase].get("failure","Failed native phase")) + if canonical(exports["first"])!=canonical(exports["inspect"]): raise AssertionError("Native recipes changed across restart") + if exports["first"]["economy"]!=exports["inspect"]["economy"]: raise AssertionError("Native offers/loot/durability changed across restart") + if digest(runtime/"survival-plan.json")!=plan_seal: raise AssertionError("Finite plan changed during progression") + validate_phases(proposed,phases) + coverage=proposed["coverage"] + for target_item,row in coverage.items(): + if row["status"]=="NATIVE_REPLAY_REQUIRED": row["status"]="NATIVE_OBTAINED_FINITE_STOCK" + elif row["status"]=="LIVE_MACHINE_REQUIRED": row["status"]="LIVE_PRODUCED" + report["cases"][name]=dict(status="PASS",planSha256=digest(runtime/"survival-plan.json"),phaseReports=phases, + actions=len(proposed["actions"]),coverage=coverage, + uncreditedTrades=proposed["uncreditedTrades"], + sampledNativeLoot=exports["first"]["sampledNativeLoot"],economy=exports["first"]["economy"]) + write_json(root/"survival-results-progress.json",report) + print("SURVIVAL110 PASS "+name,flush=True) + report["status"]="PASS" + report["completeProgression"]="PARTIAL" if any(row["status"]=="NO_FINITE_ROUTE" for case in report["cases"].values() for row in case["coverage"].values()) else "QUALIFIED_WITHIN_DECLARED_SCOPE" + except Exception as error: + report.update(status="FAIL",failure=str(error),traceback=traceback.format_exc()) + finally: + if server: + try:server.close() + except Exception as error:report.update(status="FAIL",shutdownError=str(error)) + report["manifestUnchanged"]=report["manifestSha256"]==digest(manifest) + report["protocolUnchanged"]=seals=={str(path):digest(path) for path in sources} + if not report["manifestUnchanged"] or not report["protocolUnchanged"]:report["status"]="FAIL" + report["completedAtUtc"]=datetime.now(timezone.utc).isoformat() + write_json(root/"native110-survival-results.json",report) + print("SURVIVAL110 "+report["status"]+" "+report.get("failure",""),flush=True) + return 1 if report["status"]=="FAIL" else 0 + + +if __name__=="__main__": + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument("--target-manifest",type=Path,required=True) + parser.add_argument("--java8",type=Path,required=True) + parser.add_argument("--output",type=Path,required=True) + parser.add_argument("--port",type=int,default=25597) + parser.add_argument("--mode",choices=MODES) + parser.add_argument("--rubber",choices=("on","off")) + raise SystemExit(run(parser.parse_args())) diff --git a/test-rig/migration/requirements.txt b/test-rig/migration/requirements.txt new file mode 100644 index 0000000..15f86d4 --- /dev/null +++ b/test-rig/migration/requirements.txt @@ -0,0 +1,2 @@ +nbtlib==2.0.4 +numpy==2.5.3 diff --git a/test-rig/migration/steam_control_audit.py b/test-rig/migration/steam_control_audit.py index 2c51321..04ab1fc 100644 --- a/test-rig/migration/steam_control_audit.py +++ b/test-rig/migration/steam_control_audit.py @@ -36,6 +36,10 @@ } +def steam_block(path, line): + return ("basesteam:" if line == "110" else "steamadvantage:") + path + + def require(value, message): if not value: raise AssertionError(message) @@ -185,8 +189,8 @@ def at(x, y=4, z=8): "Tile hold must remove ticking, retain the same tile and leave NBT unchanged") observed = measured.get(at(*point)) require(observed is not None and "nbt" in observed - and observed["block"] == ("steamadvantage:steam_furnace" if row["id"] in FURNACES - else "steamadvantage:steam_crusher"), + and observed["block"] == steam_block("steam_furnace" if row["id"] in FURNACES + else "steam_crusher", line), "Held tile is not the measured native machine") actual.add(point) require(actual == expected, "Incomplete measured tile hold coverage") @@ -228,7 +232,7 @@ def audit_documents(catalog, operation, fixture, cold, line): for stage in ("before", "after"): require(set(positions(row[stage], base, line)) == expected_positions, "Wrong comparator layout") for i, count in enumerate(counts): - data = tile(row[stage], at(3 + 6 * i), "steamadvantage:steam_crusher", line) + data = tile(row[stage], at(3 + 6 * i), steam_block("steam_crusher", line), line) inventory(data, 0, "minecraft:stone", count) require(energy(data) == 0 and progress(data) == 0, "Comparator witness must remain unpowered") for i, count in enumerate(counts): @@ -245,7 +249,7 @@ def audit_documents(catalog, operation, fixture, cold, line): require(set(snapshot) == expected_positions, "Wrong controlled-machine layout") if signal: require(snapshot[at(7)]["block"] == "minecraft:redstone_block", "Missing actual redstone source") - block = "steamadvantage:steam_crusher" if is_crusher else "steamadvantage:steam_furnace" + block = steam_block("steam_crusher" if is_crusher else "steam_furnace", line) before = tile(row["before"], at(8), block, line) after = tile(row["after"], at(8), block, line) item = "minecraft:stone" if is_crusher else "minecraft:sand" diff --git a/test-rig/migration/survival110_plan.py b/test-rig/migration/survival110_plan.py new file mode 100644 index 0000000..a0a580b --- /dev/null +++ b/test-rig/migration/survival110_plan.py @@ -0,0 +1,228 @@ +"""Finite material planner. Proposed routes are NOT proof until native replay passes.""" +from collections import Counter, defaultdict +from native110_recipe_progression import EXCLUSIONS + + +class Unobtainable(ValueError): + pass + + +def concrete(token): + return token.replace("@32767", "@0") if token else token + + +class Planner: + def __init__(self, doc, stock, allow_trades=False): + self.doc = doc + self.stock = Counter(stock) + self.initial = dict(stock) + self.actions = [] + self.routes = defaultdict(list) + self.tools = Counter() + self.trade_uses = Counter() + self.uncredited_trades = [] + self.reserved = {"minecraft:crafting_table@0": 1, "minecraft:furnace@0": 1} + self.attempts = 0 + for row in doc["crafting"]: + if row.get("status") == "PASS": + self.routes[row["output"]].append(dict(kind="craft", recipe=row)) + for row in doc["smelting"]: + self.routes[row["output"]].append(dict(kind="smelt", recipe=row)) + for row in doc["crushing"]: + self.routes[row["output"]].append(dict(kind="crush", recipe=row)) + if allow_trades: + for row in doc["economy"]["trades"]: + if (not isinstance(row.get("input"),str) or type(row.get("price")) is not int or row["price"]<=0 + or type(row.get("maxUses")) is not int or row["maxUses"]<=0): + self.uncredited_trades.append(dict(id=row["id"],output=row["output"],reason="Missing currency, non-positive price or invalid offer stock")) + else: + self.routes[row["output"]].append(dict(kind="trade", recipe=row)) + self.routes["minecraft:water_bucket@0"].append(dict(kind="water", recipe=dict(count=1))) + self.ranks = {item: 0 for item, count in stock.items() if count > 0} + for _ in range(100): + changed = False + for item, routes in self.routes.items(): + rank = min((self.route_rank(route) for route in routes), default=1000000) + if rank < self.ranks.get(item, 1000000): + self.ranks[item] = rank + changed = True + if not changed: break + + def route_rank(self, route): + row, kind = route["recipe"], route["kind"] + rank = lambda item: self.ranks.get(concrete(item), 1000000) + if kind == "craft": + cells = row.get("providers", [[x] if x else [] for x in row["inputs"]]) + return 1 + max((min(map(rank, choices)) for choices in cells if choices), default=1000000) + if kind == "smelt": return 1 + max(rank(row["input"]), rank("minecraft:furnace@0"), rank("minecraft:coal@0")) + if kind == "crush": return 1 + max(rank(row["input"]), min(map(rank, row["tools"]), default=1000000)) + if kind == "trade": return 1 + max(rank(row["input"]), rank(row["secondInput"]) if row.get("secondInput") else 0) + if kind == "water": return 1 + rank("minecraft:bucket@0") + raise ValueError(kind) + + def snapshot(self): + return self.stock.copy(), len(self.actions), self.tools.copy(), self.trade_uses.copy() + + def restore(self, snapshot): + self.stock, action_count, self.tools, self.trade_uses = snapshot + del self.actions[action_count:] + + def take(self, item, count=1, path=()): + if count <= 0: + raise ValueError("Non-positive debit") + self.ensure(item, count + self.reserved.get(item, 0), path) + self.stock[item] -= count + + def ensure(self, item, count=1, path=()): + self.attempts += 1 + if self.attempts > 100000: + raise RuntimeError("Planner search budget exhausted; do not claim unreachable") + if self.stock[item] >= count: + return + if item not in self.ranks: + raise Unobtainable("No resource-rooted route for " + item) + if item in path or len(path) > 40: + raise Unobtainable("Cyclic or excessively deep prerequisite: " + item) + path = (*path, item) + while self.stock[item] < count: + success = False + # Prefer an already available input, then short non-recycling paths. + routes = sorted(self.routes[item], key=lambda r: self.cost(r)) + for route in routes: + before = self.snapshot() + try: + self.produce(item, route, path) + success = True + break + except Unobtainable: + self.restore(before) + if not success: + raise Unobtainable("No finite route for " + item) + + def cost(self, route): + row, kind = route["recipe"], route["kind"] + if kind == "trade": return (self.route_rank(route), 0, 0) + if kind == "water": return (self.route_rank(route), 0, 1) + if kind in ("smelt", "crush"): + return (self.route_rank(route), 0 if self.stock[row["input"]] else 2, 1 if kind == "smelt" else 2) + cells = row.get("providers", [[x] if x else [] for x in row["inputs"]]) + return (self.route_rank(route), sum(not any(self.stock[concrete(x)] for x in choices) for choices in cells if choices), len(cells)) + + def produce(self, item, route, path): + row, kind = route["recipe"], route["kind"] + action = dict(kind=kind, output=item, count=row["count"]) + if kind == "craft": + selected = [] + for choices in row.get("providers", [[x] if x else [] for x in row["inputs"]]): + if not choices: + selected.append(None) + continue + candidate = None + for choice in sorted(dict.fromkeys(map(concrete, choices)), key=lambda x: (not bool(self.stock[x]), self.ranks.get(x,1000000))): + before = self.snapshot() + try: + self.take(choice, path=path) + candidate = choice + break + except Unobtainable: + self.restore(before) + if candidate is None: + raise Unobtainable("Missing ingredient for " + item) + selected.append(candidate) + action.update(recipe=row["id"], inputs=selected, width=row["width"]) + # Independent policy: a water-bucket ingredient returns exactly one EMPTY bucket. + buckets = selected.count("minecraft:water_bucket@0") + if buckets: + self.stock["minecraft:bucket@0"] += buckets + action["emptyBucketsReturned"] = buckets + elif kind == "smelt": + self.ensure("minecraft:furnace@0", path=path) + self.take(row["input"], path=path) + self.take("minecraft:coal@0", path=path) + action.update(input=row["input"], fuel="minecraft:coal@0") + elif kind == "crush": + self.take(row["input"], path=path) + tool = None + for candidate in sorted(row["tools"], key=lambda x: (not bool(self.stock[x]), "iron_crackhammer" not in x)): + before = self.snapshot() + try: + if not self.tools[candidate]: + self.ensure(candidate, 1, path) + self.tools[candidate] += self.doc["economy"]["toolDurability"][candidate] + 1 + tool = candidate + break + except Unobtainable: + self.restore(before) + if tool is None: raise Unobtainable("No obtainable crushing tool for " + item) + self.tools[tool] -= 1 + if not self.tools[tool]: self.stock[tool] -= 1 + action.update(input=row["input"], tool=tool) + action["toolBreaks"] = not bool(self.tools[tool]) + elif kind == "trade": + if self.trade_uses[row["id"]] >= row["maxUses"]: + raise Unobtainable("Offer exhausted; restocking is not assumed") + self.take(row["input"], row["price"], path) + if row.get("secondInput"): self.take(row["secondInput"], row["secondPrice"], path) + self.trade_uses[row["id"]] += 1 + action.update(trade=row) + elif kind == "water": + self.take("minecraft:bucket@0", path=path) + action["input"] = "minecraft:bucket@0" + else: raise ValueError(kind) + self.stock[item] += row["count"] + self.actions.append(action) + + +def raw_budget(doc): + # Harvested resources, not ingots, machine parts, tools, or free energy. + names = ("log", "sapling", "cobblestone", "coal", "iron_ore", "gold_ore", "sand", "clay_ball", + "gravel", "redstone", "diamond", "emerald", "obsidian", "potato", "wheat", "reeds", + "gunpowder", "flint", "leather", "string", "feather", "quartz", "bone", "cactus", "dirt") + stock = {"minecraft:"+name+"@0": 2048 for name in names} + for ore in ("oreCopper", "oreTin", "oreZinc", "oreLead", "oreNickel", "oreSilver", "oreLithium", "oreSulfur"): + for token in doc["ores"].get(ore, []): + token = concrete(token) + if token in doc["blockItems"]: stock[token] = 2048 + return stock + + +STARTER = ("minecraft:bucket@0", "basemetals:iron_crackhammer@0", "basepower:sprocket@0", + "basepower:fluid_pipe@0", "basepower:still@0", "basesteam:steam_governor@0", + "basesteam:steam_pipe@0", "basesteam:steam_boiler_coal@0", "basesteam:steam_furnace@0", + "baseelectric:electric_conduit@0", "baseelectric:psu@0", "baseelectric:hydroelectric_generator@0", + "baseelectric:plastic_refinery@0", "baseelectric:lead_acid_battery@0", + "baseelectric:nickel_hydride_battery@0") + + +def plan(doc): + planner = Planner(doc, raw_budget(doc), allow_trades=doc["mode"] == "APOCALYPTIC") + planner.ensure("minecraft:crafting_table@0") + for item in STARTER: + planner.ensure(item) + if doc["mode"] != "APOCALYPTIC": planner.ensure("baseelectric:photovoltaic_generator@0") + coverage = {} + for target in doc["targets"]: + if target in EXCLUSIONS: + coverage[target] = dict(status="EXCLUDED", reason=EXCLUSIONS[target]) + elif target == "baseelectric:petrolplastic_ingot@0": + coverage[target] = dict(status="LIVE_MACHINE_REQUIRED") + elif target == "baseelectric:photovoltaic_generator@0" and doc["mode"] == "APOCALYPTIC": + coverage[target] = dict(status="EXCLUDED", reason="Intentional Apocalyptic restriction") + else: + before = planner.snapshot() + try: + planner.ensure(target) + coverage[target] = dict(status="NATIVE_REPLAY_REQUIRED") + except Unobtainable as error: + planner.restore(before) + coverage[target] = dict(status="NO_FINITE_ROUTE", reason=str(error)) + # Two water packets for the boiler/stream, plus an empty bucket for crude oil. + planner.reserved.update({item: 1 for item in STARTER}) + for item in STARTER: + planner.ensure(item) + planner.ensure("minecraft:bucket@0", 1) + return dict(schema=1, mode=doc["mode"], rubber=doc["rubber"], initial=planner.initial, + actions=planner.actions, expectedStock={k:v for k,v in planner.stock.items() if v}, + checkpoints=list(STARTER), coverage=coverage, + uncreditedTrades=planner.uncredited_trades, + scope="FINITE_HARVESTED_RESOURCE_BUDGET; NATIVE_REPLAY_REQUIRED; NOT_MINING_OR_VILLAGER_LEVELING") diff --git a/test-rig/migration/test_audit_survival110.py b/test-rig/migration/test_audit_survival110.py new file mode 100644 index 0000000..ab851bc --- /dev/null +++ b/test-rig/migration/test_audit_survival110.py @@ -0,0 +1,62 @@ +"""Synthetic negative controls for the independent evidence audit only.""" +import base64 +from copy import deepcopy +import io +import unittest +import nbtlib +from audit_survival110 import audit_case, audit + +TOOL="basemetals:iron_crackhammer@0" + + +def tool(damage): + tag=nbtlib.File({"id":nbtlib.String(TOOL.split('@')[0]),"Count":nbtlib.Byte(1),"Damage":nbtlib.Short(damage)}) + buffer=io.BytesIO();tag.write(buffer) + return [base64.b64encode(buffer.getvalue()).decode("ascii")] + + +def fixture(): + def row(kind,output,**extra):return dict(status="PASS",kind=kind,output=output,**extra) + first=[row("craft",TOOL,before={},after={TOOL:1}),row("crush","powder",before={TOOL:1}), + row("trade","gear",offer="test-offer",usesAfter=1)] + second=[row("crush","powder",before={TOOL:1}),row("trade","gear",offer="test-offer",usesAfter=2)] + return dict(status="PASS",actions=5,economy=dict(toolDurability={TOOL:100},trades=[dict(id="test-offer",maxUses=7)]), + coverage={TOOL:dict(status="NATIVE_OBTAINED_FINITE_STOCK")},phaseReports={ + "first":dict(actions=first,initialStock={},stockTyped=tool(1)), + "continue":dict(actions=second,resumedStockTyped=tool(1),stockTyped=tool(2)), + "resume":dict(status="PASS",stockTyped=tool(2),maximumSteamFurnaceTemperature=1200), + "inspect":dict(status="PASS",stockTyped=tool(2))}) + + +class IndependentAuditTests(unittest.TestCase): + def test_valid_typed_wear_and_cross_restart_offer_uses(self): + result=audit_case(fixture());self.assertEqual(2,result["trades"]);self.assertEqual(2,result["hammerCrushes"]) + + def test_tool_damage_reset_fails_even_when_cold_counts_agree(self): + data=fixture();data["phaseReports"]["first"]["stockTyped"]=tool(0) + data["phaseReports"]["continue"]["resumedStockTyped"]=tool(0) + with self.assertRaisesRegex(AssertionError,"damage"):audit_case(data) + + def test_free_merchant_restock_after_restart_is_rejected(self): + data=fixture();data["phaseReports"]["continue"]["actions"][-1]["usesAfter"]=1 + with self.assertRaisesRegex(AssertionError,"Merchant"):audit_case(data) + + def test_unwitnessed_component_cannot_be_marked_available(self): + data=fixture();data["coverage"]["free-machine"]=dict(status="NATIVE_OBTAINED_FINITE_STOCK") + with self.assertRaisesRegex(AssertionError,"credited"):audit_case(data) + + def test_missing_action_or_changed_final_state_is_rejected(self): + data=fixture();data["phaseReports"]["first"]["actions"].pop() + with self.assertRaisesRegex(AssertionError,"coverage"):audit_case(data) + data=fixture();data["phaseReports"]["inspect"]["stockTyped"]=tool(0) + with self.assertRaisesRegex(AssertionError,"Final cold"):audit_case(data) + + def test_new_unreachable_item_cannot_hide_in_historical_gap(self): + data=fixture();data["coverage"]["needed-machine"]=dict(status="NO_FINITE_ROUTE") + with self.assertRaisesRegex(AssertionError,"gap"):audit_case(data) + + def test_incomplete_matrix_cannot_qualify(self): + with self.assertRaisesRegex(AssertionError,"six"):audit(dict(status="PASS",protocolUnchanged=True,manifestUnchanged=True,cases={})) + + +if __name__=="__main__":unittest.main() diff --git a/test-rig/migration/test_native110_harvest.py b/test-rig/migration/test_native110_harvest.py index 24453ed..27d01ad 100644 --- a/test-rig/migration/test_native110_harvest.py +++ b/test-rig/migration/test_native110_harvest.py @@ -161,7 +161,7 @@ def test_cleanup_negative_counts_bad_sequence_and_bool_timestamps_fail(self): def test_wrong_tool_cannot_hide_unexpected_live_drop(self): document=sample() row(document,"lithium/wood-fails")["dropEvidence"][0]["actualDrops"] = [ - dict(entityId=99999,uuid=str(UUID(int=99999)),item="electricadvantage:li_ore", + dict(entityId=99999,uuid=str(UUID(int=99999)),item="baseelectric:li_ore", count=1,damage=0,tagged=False,removed=False,x=1200.5,y=8.5,z=1024.5)] with self.assertRaises(AssertionError): native.require_isolation(document) @@ -185,8 +185,8 @@ def test_java_observes_native_survival_and_real_unfiltered_item_identities(self) self.assertIn(literal,source) self.assertNotIn(".getDrops(",source) self.assertNotIn("import com.mcmoddev",source) - self.assertNotIn("import zone.moddev.mc.electricadvantage",source) - self.assertNotIn("import zone.moddev.mc.steamadvantage",source) + self.assertNotIn("import zone.moddev.mc.baseelectric",source) + self.assertNotIn("import zone.moddev.mc.basesteam",source) def test_runner_enforces_code_custody_before_boot_without_editing_shared_helpers(self): source=Path(native.__file__).read_text() diff --git a/test-rig/migration/test_native110_rebrand_bucket_proof.py b/test-rig/migration/test_native110_rebrand_bucket_proof.py new file mode 100644 index 0000000..cb7d7db --- /dev/null +++ b/test-rig/migration/test_native110_rebrand_bucket_proof.py @@ -0,0 +1,98 @@ +"""Synthetic four-boot permit rejection controls; no server or artifact mutation.""" +import copy +import unittest +from pathlib import Path +from unittest.mock import patch + +import native110_rebrand_bucket_proof as proof + + +NOTICE = "[12:34:56] [Server thread/ERROR] [FML]: Trying to activate the universal filled bucket too late. Call it statically in your Mods class. Mod: Base Metals" + + +def boots(): + return [dict(label=label, status="PASS_BOOT", exitCode=0, + diagnostic=dict(originalSeverity="ERROR", message=NOTICE)) for label in proof.BOOT_LABELS] + + +def role(): + return dict(status="PASS", operationCases=3, exactColdCases=3, + startupFlags={"operate": {}, "restart": {}}) + + +class FreshRebrandBucketProofTest(unittest.TestCase): + def test_four_complete_boots_and_three_real_bucket_cold_cases_are_required(self): + proof.require_four_boots(boots(), role()) + for mutation in ("missing", "duplicate", "unknown", "exit", "bool-exit", "changed-line", "wrong-mod", "missing-oil", "missing-cold"): + observed, validated = boots(), role() + if mutation == "missing": observed.pop() + elif mutation == "duplicate": observed[-1] = copy.deepcopy(observed[0]) + elif mutation == "unknown": observed[0]["label"] = "old-proof" + elif mutation == "exit": observed[0]["exitCode"] = 1 + elif mutation == "bool-exit": observed[0]["exitCode"] = False + elif mutation == "changed-line": observed[0]["diagnostic"]["message"] += " " + elif mutation == "wrong-mod": observed[0]["diagnostic"]["message"] = NOTICE.replace("Base Metals", "basePower") + elif mutation == "missing-oil": validated["operationCases"] = 2 + else: validated["exactColdCases"] = 2 + with self.subTest(mutation=mutation), self.assertRaises(AssertionError): + proof.require_four_boots(observed, validated) + + def test_an_old_pass_or_a_changed_full_candidate_never_binds(self): + candidate = dict(manifestSha256="a" * 64, mods=[dict(id=id, sha256=id, version="v", runtimeVersion="v") + for id in sorted(proof.TARGET_IDS)], codeInventory={"files": {"engine": "sealed"}}) + doc = dict(kind=proof.KIND, status="PASS", candidate=candidate) + proof.bind_candidate(doc, candidate) + for mutation in ("old-proof", "manifest", "power", "steam", "electric", "harness", "base", "ore", "engine"): + changed = copy.deepcopy(candidate) + document = copy.deepcopy(doc) + if mutation == "old-proof": document["kind"] = "historical-legacy-bucket-proof" + elif mutation == "manifest": changed["manifestSha256"] = "b" * 64 + elif mutation == "engine": changed["codeInventory"]["files"]["engine"] = "changed" + else: + id = {"power": "basepower", "steam": "basesteam", "electric": "baseelectric", "harness": "advantageworkstest", "base": "basemetals", "ore": "orespawn"}[mutation] + next(m for m in changed["mods"] if m["id"] == id)["sha256"] = "changed" + with self.subTest(mutation=mutation), self.assertRaises(AssertionError): proof.bind_candidate(document, changed) + + def test_exact_line_is_pending_until_the_whole_fresh_campaign_passes(self): + lines = ["Starting minecraft server version 1.10.2", "Forge Mod Loader version 12.18.3.2511 for Minecraft 1.10.2 loading", NOTICE] + self.assertEqual("PENDING_DIAGNOSTIC_PROOF", proof.legacy.held_diagnostics(lines, proof.legacy.BASE_SHA, proof.legacy.PUBLIC_FORGE_SHA)["status"]) + for bad in (lines + [NOTICE], lines + ["[12:34:57] [Server thread/ERROR] [FML]: Other failure"], lines[:-1]): + with self.assertRaises(AssertionError): proof.legacy.held_diagnostics(bad, proof.legacy.BASE_SHA, proof.legacy.PUBLIC_FORGE_SHA) + + def test_baseline_mod_inventory_cannot_contain_a_harness_or_power(self): + proof.require_baseline_mods({"basemetals": "2.4.0", "orespawn": "4.0.8.110021", "Forge": "12.18.3.2511"}, + {"basemetals": "2.4.0", "orespawn": "4.0.8.110021"}) + for extra in ("basepower", "advantageworkstest", "unknown"): + with self.subTest(extra=extra), self.assertRaises(AssertionError): + proof.require_baseline_mods({"basemetals": "2.4.0", "orespawn": "4.0.8.110021", extra: "v"}, + {"basemetals": "2.4.0", "orespawn": "4.0.8.110021"}) + + def test_first_strict_failure_is_required_and_cannot_be_a_preservation_failure(self): + candidate = dict(manifestSha256="a" * 64) + failed = dict(status="FAIL", targetManifestSha256="a" * 64, + failure="Native runtime diagnostic at line 123: " + NOTICE) + with patch.object(proof, "digest", return_value="B" * 64), patch.object(proof.legacy, "read", return_value=failed): + proof.require_strict_failure(Path("strict.json"), "b" * 64, candidate) + for field, value in (("status", "PASS"), ("targetManifestSha256", "c" * 64), + ("failure", "Unticked imported state changed"), + ("failure", "Native runtime diagnostic at line 123: " + NOTICE.replace("Base Metals", "Other Mod"))): + bad = copy.deepcopy(failed) + bad[field] = value + with self.subTest(field=field, value=value), patch.object(proof.legacy, "read", return_value=bad), self.assertRaises(AssertionError): + proof.require_strict_failure(Path("strict.json"), "b" * 64, candidate) + with self.assertRaises(AssertionError): proof.require_strict_failure(Path("strict.json"), "changed", candidate) + + def test_each_mode_requires_its_exact_original_observer_with_no_other_extra(self): + candidate = dict(mods=[dict(path="core.jar", sha256="core")]) + for mode in ("connected", "passive-source355", "synthetic-nested"): + correct = {"core.jar": "core", "observer.jar": proof.observer_sha(mode)} + proof.require_destination_inventory(correct, candidate, mode) + for bad in ({"core.jar": "core"}, {**correct, "extra.jar": "unexpected"}, + {"core.jar": "core", "observer.jar": "changed"}, + {**correct, "core.jar": "changed"}): + with self.subTest(mode=mode, bad=bad), self.assertRaises(AssertionError): + proof.require_destination_inventory(bad, candidate, mode) + with self.assertRaises(AssertionError): proof.observer_sha("unknown") + + +if __name__ == "__main__": unittest.main() diff --git a/test-rig/migration/test_native110_rebrand_connected.py b/test-rig/migration/test_native110_rebrand_connected.py new file mode 100644 index 0000000..12b5b07 --- /dev/null +++ b/test-rig/migration/test_native110_rebrand_connected.py @@ -0,0 +1,104 @@ +"""Pure rejection controls, not Minecraft migration evidence.""" +import base64 +import copy +import gzip +import io +import unittest + +import nbtlib + +import native110_rebrand_connected as rebrand + + +def snapshot(namespace): + tag = nbtlib.parse_nbt('{id:"' + namespace + '.steam_furnace",Energy:[I;1065353216],' + 'Items:[{Slot:0b,id:"' + ("electricadvantage" if namespace == "steamadvantage" else "baseelectric") + + ':lithium_battery",Count:1b,tag:{energy:123.5f,CustomName:"electricadvantage:keep"}}]}') + data = io.BytesIO() + nbtlib.File(tag).write(data) + return dict(held=True, buildCallsThisProcess=0, advancedTicks=0, requestedTicks=0, + snapshot=[dict(id="furnace", station="C-STEAM", kind="furnace", name="steamadvantage:steam_furnace", + actualName=namespace + ":steam_furnace", x=80, y=80, z=80, properties={"facing": "north"}, + nbtBase64=base64.b64encode(gzip.compress(data.getvalue())).decode("ascii"))]) + + +def change_nbt(document, change): + row = document["snapshot"][0] + tag = rebrand.binary_nbt(row) + change(tag) + row["nbtBase64"] = rebrand.encode_nbt(tag) + + +class RebrandPreservationTest(unittest.TestCase): + def test_exact_namespace_only_change_passes_without_mutating_documents(self): + old, new = snapshot("steamadvantage"), snapshot("basesteam") + untouched = copy.deepcopy((old, new)) + self.assertEqual("PASS", rebrand.preservation(old, new)["status"]) + self.assertEqual(untouched, (old, new)) + self.assertEqual("PASS", rebrand.preservation(new, new)["status"]) + + def test_removed_item_wrong_facing_and_lost_energy_fail(self): + for mutation in ("item", "facing", "energy", "type", "extra", "custom", "old-id", "missing-tile"): + old, new = snapshot("steamadvantage"), snapshot("basesteam") + if mutation == "item": change_nbt(new, lambda tag: tag["Items"].clear()) + elif mutation == "facing": new["snapshot"][0]["properties"]["facing"] = "south" + elif mutation == "energy": change_nbt(new, lambda tag: tag.__setitem__("Energy", nbtlib.IntArray([0]))) + elif mutation == "type": change_nbt(new, lambda tag: tag["Items"][0].__setitem__("Count", nbtlib.Int(1))) + elif mutation == "extra": change_nbt(new, lambda tag: tag.__setitem__("HiddenEnergy", nbtlib.Int(1))) + elif mutation == "custom": change_nbt(new, lambda tag: tag["Items"][0]["tag"].__setitem__("CustomName", nbtlib.String("baseelectric:keep"))) + elif mutation == "old-id": new["snapshot"][0]["actualName"] = "steamadvantage:steam_furnace" + else: new["snapshot"][0].pop("nbtBase64") + with self.subTest(mutation=mutation): + self.assertEqual("FAIL", rebrand.preservation(old, new)["status"]) + + def test_unticked_means_frozen_zero_builds_and_zero_ticks(self): + for field, value in (("held", False), ("advancedTicks", 1), ("requestedTicks", 1), ("buildCallsThisProcess", 1)): + new = snapshot("basesteam") + new[field] = value + with self.subTest(field=field), self.assertRaises(AssertionError): + rebrand.require_passive(new) + + def test_missing_extra_duplicate_and_moved_witnesses_fail(self): + for mutation in ("missing", "extra", "duplicate", "moved"): + old, new = snapshot("steamadvantage"), snapshot("basesteam") + if mutation == "missing": new["snapshot"].clear() + elif mutation == "moved": new["snapshot"][0]["x"] += 1 + else: + row = copy.deepcopy(new["snapshot"][0]) + if mutation == "extra": row["id"] = "extra" + new["snapshot"].append(row) + with self.subTest(mutation=mutation): + if mutation == "duplicate": + with self.assertRaises(AssertionError): rebrand.preservation(old, new) + else: self.assertEqual("FAIL", rebrand.preservation(old, new)["status"]) + + def test_only_exact_namespace_boundaries_are_translated(self): + self.assertEqual("basepower:still", rebrand.target_id("poweradvantage:still")) + for value in ("other:poweradvantage", "poweradvantage_extra:still", "custom poweradvantage:still"): + self.assertEqual(value, rebrand.target_id(value)) + + def test_electric_drill_does_not_invent_a_saved_facing_field(self): + old, new = snapshot("steamadvantage"), snapshot("basesteam") + for document, namespace in ((old, "electricadvantage"), (new, "baseelectric")): + document["snapshot"][0].update(name="electricadvantage:electric_drill", + actualName=namespace + ":electric_drill", kind="drill") + change_nbt(document, lambda tag: tag.__setitem__("id", nbtlib.String(namespace + ".electric_drill"))) + change_nbt(document, lambda tag: tag.__setitem__("progress", nbtlib.Short(209))) + self.assertEqual("PASS", rebrand.preservation(old, new)["status"]) + change_nbt(new, lambda tag: tag.__setitem__("Facing", nbtlib.Byte(2))) + self.assertEqual("FAIL", rebrand.preservation(old, new)["status"]) + + def test_only_steam_legacy_facing_is_derived_from_the_actual_block_state(self): + old, new = snapshot("steamadvantage"), snapshot("basesteam") + for document, namespace in ((old, "steamadvantage"), (new, "basesteam")): + document["snapshot"][0].update(name="steamadvantage:steam_drill", + actualName=namespace + ":steam_drill", kind="drill") + change_nbt(document, lambda tag: tag.__setitem__("id", nbtlib.String(namespace + ".steam_drill"))) + change_nbt(new, lambda tag: tag.__setitem__("Facing", nbtlib.Byte(2))) + self.assertEqual("PASS", rebrand.preservation(old, new)["status"]) + change_nbt(new, lambda tag: tag.__setitem__("Facing", nbtlib.Byte(3))) + self.assertEqual("FAIL", rebrand.preservation(old, new)["status"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/test-rig/migration/test_native110_rebrand_passive.py b/test-rig/migration/test_native110_rebrand_passive.py new file mode 100644 index 0000000..ee5ad82 --- /dev/null +++ b/test-rig/migration/test_native110_rebrand_passive.py @@ -0,0 +1,137 @@ +"""Synthetic oracle rejection tests, never labelled authentic fixture evidence.""" +import copy +import unittest +from pathlib import Path +from unittest.mock import patch + +import nbtlib + +from native110_rebrand_connected import encode_nbt +import native110_rebrand_passive as passive + + +def rows(namespace="steamadvantage", enchantment_id=11): + result = [] + for index in range(355): + tag = nbtlib.parse_nbt('{id:"' + namespace + '.steam_furnace",Energy:[I;1065353216],Items:[{Slot:0b,id:"' + + namespace + ':musket",Count:1b,Damage:5s,tag:{MigrationWitness:"steamadvantage:musket",' + + 'ench:[{id:' + str(enchantment_id) + 's,lvl:1s}],Nested:{Bytes:[B;1b,-2b],Ints:[I;3,-7]}}}]}') + result.append(dict(x=index, y=80, z=0, name="steamadvantage:steam_furnace", metadata=2, + actualName=namespace + ":steam_furnace", properties={"facing": "north"}, nbtBase64=encode_nbt(nbtlib.File(tag)))) + return result + + +class Passive355Test(unittest.TestCase): + def compare(self, old, new, target_registry=None): + return passive.compare_rows(old, new, {11: "steamadvantage:recoil"}, target_registry or {47: "steamadvantage:recoil"}) + + def test_exact_namespace_translation_and_enchantment_semantics_pass_without_mutation(self): + old, new = rows(), rows("basesteam", 47) + untouched = copy.deepcopy((old, new)) + self.assertEqual("PASS", self.compare(old, new)["status"]) + self.assertEqual(untouched, (old, new)) + + def test_missing_extra_duplicate_moved_meta_facing_and_wrong_namespace_fail(self): + for mutation in ("missing", "extra", "duplicate", "moved", "meta", "facing", "old-id"): + old, new = rows(), rows("basesteam", 47) + if mutation == "missing": new.pop() + elif mutation == "extra": new.append(copy.deepcopy(new[-1])) + elif mutation == "duplicate": new[-1] = copy.deepcopy(new[0]) + elif mutation == "moved": new[-1]["x"] += 1000 + elif mutation == "meta": new[-1]["metadata"] = 3 + elif mutation == "facing": new[-1]["properties"]["facing"] = "south" + else: new[-1]["actualName"] = "steamadvantage:steam_furnace" + with self.subTest(mutation=mutation), self.assertRaises(AssertionError): self.compare(old, new) + + def test_removed_item_lost_energy_changed_type_enchantment_and_extra_key_fail(self): + for mutation in ("item", "energy", "type", "level", "enchantment", "extra", "custom"): + old, new = rows(), rows("basesteam", 47) + tag = passive.binary_nbt(new[-1]) + if mutation == "item": tag["Items"].clear() + elif mutation == "energy": tag["Energy"] = nbtlib.IntArray([0]) + elif mutation == "type": tag["Items"][0]["Count"] = nbtlib.Int(1) + elif mutation == "level": tag["Items"][0]["tag"]["ench"][0]["lvl"] = nbtlib.Short(2) + elif mutation == "enchantment": tag["Items"][0]["tag"]["ench"][0]["id"] = nbtlib.Short(48) + elif mutation == "extra": tag["HiddenEnergy"] = nbtlib.Int(1) + else: tag["Items"][0]["tag"]["MigrationWitness"] = nbtlib.String("basesteam:musket") + new[-1]["nbtBase64"] = encode_nbt(tag) + with self.subTest(mutation=mutation), self.assertRaises(AssertionError): self.compare(old, new) + + def test_equal_numeric_ids_do_not_hide_an_incorrect_registry_semantic(self): + with self.assertRaises(AssertionError): + self.compare(rows(), rows("basesteam", 11), {11: "steamadvantage:powderless"}) + + def test_retained_canonical_enchantments_must_not_be_renamed_in_the_target(self): + with self.assertRaises(AssertionError): + self.compare(rows(), rows("basesteam", 47), {47: "basesteam:recoil"}) + + def test_only_steam_derives_exact_typed_facing_from_original_metadata(self): + old, new = rows(), rows("basesteam", 47) + for meta, facing in enumerate(("down", "up", "north", "south", "west", "east")): + for collection, namespace in ((old, "steamadvantage"), (new, "basesteam")): + row = collection[meta] + row.update(name="steamadvantage:steam_drill", actualName=namespace + ":steam_drill", metadata=meta, + properties={"facing": facing}) + tag = passive.binary_nbt(row) + tag["id"] = nbtlib.String(namespace + ".steam_drill") + if collection is new: tag["Facing"] = nbtlib.Byte(meta) + row["nbtBase64"] = encode_nbt(tag) + self.assertEqual("PASS", self.compare(old, new)["status"]) + for mutation in ("wrong-facing", "wrong-type", "foreign-key", "metadata-disagreement"): + damaged = copy.deepcopy(new) + source = copy.deepcopy(old) + tag = passive.binary_nbt(damaged[2]) + if mutation == "wrong-facing": tag["Facing"] = nbtlib.Byte(3) + elif mutation == "wrong-type": tag["Facing"] = nbtlib.Int(2) + elif mutation == "foreign-key": tag["ForeignState"] = nbtlib.Int(1) + else: source[2]["properties"]["facing"] = "south" + damaged[2]["nbtBase64"] = encode_nbt(tag) + with self.subTest(mutation=mutation), self.assertRaises(AssertionError): self.compare(source, damaged) + + def test_electric_missing_facing_stays_absent_and_extra_target_facing_fails(self): + old, new = rows(), rows("basesteam", 47) + for collection, namespace in ((old, "electricadvantage"), (new, "baseelectric")): + row = collection[0] + row.update(name="electricadvantage:electric_drill", actualName=namespace + ":electric_drill") + tag = passive.binary_nbt(row) + tag["id"] = nbtlib.String(namespace + ".electric_drill") + row["nbtBase64"] = encode_nbt(tag) + self.assertEqual("PASS", self.compare(old, new)["status"]) + tag = passive.binary_nbt(new[0]); tag["Facing"] = nbtlib.Byte(2) + new[0]["nbtBase64"] = encode_nbt(tag) + with self.assertRaises(AssertionError): self.compare(old, new) + + def test_observer_has_no_state_repair_or_construction_path(self): + java = (Path(passive.__file__).parents[1] / "src/main/java/zone/moddev/mc/advantageworks/NativePassiveMigrationProbe.java").read_text() + for forbidden in ("readFromNBT", "setBlockState", "setInventorySlotContents", "markDirty", "build(", "addEnchantment"): + self.assertNotIn(forbidden, java) + self.assertIn("tile.writeToNBT(new NBTTagCompound())", java) + + def test_synthetic_station_cannot_be_accepted_as_authentic_player_evidence(self): + with self.assertRaises(AssertionError): passive.validate_nested({"scope": passive.AUTHENTIC_SCOPE, "cases": []}) + + def test_synthetic_xp_seed_remains_exact_and_typed_not_ignored(self): + tag = nbtlib.File(nbtlib.parse_nbt('{XpSeed:305441741,Inventory:[],EnderItems:[]}')) + encoded = encode_nbt(tag) + document = dict(scope=passive.SYNTHETIC_SCOPE, status="PASS", worldInsertions=0, playerFileWrites=0, + cases=[dict(id=case, status="PASS", nativeSemantics=True, inputNbtBase64=encoded, + expectedNbtBase64=encoded, actualNbtBase64=encoded) for case in sorted(passive.SYNTHETIC_CASES)]) + self.assertEqual("PASS", passive.validate_nested(document)["status"]) + for value in (nbtlib.Int(305441742), nbtlib.Long(305441741)): + bad = copy.deepcopy(document) + actual = nbtlib.File(nbtlib.parse_nbt('{XpSeed:305441741,Inventory:[],EnderItems:[]}')) + actual["XpSeed"] = value + bad["cases"][0]["actualNbtBase64"] = encode_nbt(actual) + with self.subTest(value=type(value).__name__), self.assertRaises(AssertionError): passive.validate_nested(bad) + + def test_only_the_exact_original_observer_is_allowed_and_legacy_commands_are_forbidden(self): + expected = passive.SOURCE_JARS["AdvantageMigrationProbe-110-1.0.0.jar"] + with patch.object(passive, "digest", return_value=expected): + self.assertEqual(Path("fixture/mods/AdvantageMigrationProbe-110-1.0.0.jar"), passive.source_observer(Path("fixture"))) + with patch.object(passive, "digest", return_value="changed"), self.assertRaises(AssertionError): + passive.source_observer(Path("fixture")) + for command in ("advprobe build source", "advprobe snapshot source", "setblock 0 80 0 stone", "advconnected build source"): + with self.subTest(command=command), self.assertRaises(AssertionError): passive.PassiveServer.send(None, command) + + +if __name__ == "__main__": unittest.main() diff --git a/test-rig/migration/test_native110_recipe_progression.py b/test-rig/migration/test_native110_recipe_progression.py index 4eb1509..ce3c128 100644 --- a/test-rig/migration/test_native110_recipe_progression.py +++ b/test-rig/migration/test_native110_recipe_progression.py @@ -7,32 +7,32 @@ def fixture(mode="NORMAL"): rows=[] ores={"ingotIron":["minecraft:iron_ingot@0"], - "ingotSilicon":["electricadvantage:silicon_ingot@0"], + "ingotSilicon":["baseelectric:silicon_ingot@0"], "nuggetCopper":["basemetals:copper_nugget@0"], "nuggetTin":["basemetals:tin_nugget@0"], "nuggetGold":["minecraft:gold_nugget@0"], - "plastic":["poweradvantage:plastic@0"],"dustRedstone":["minecraft:redstone@0"]} + "plastic":["basepower:plastic@0"],"dustRedstone":["minecraft:redstone@0"]} def recipe(output,inputs,count=1): rows.append(dict(id="craft/"+str(len(rows)),output=output,inputs=inputs,count=count, providers=[[item] for item in inputs], actualCrafted=output,actualCraftedCount=count, status="PASS",owned=True,negativeControlsRejected=2,consumption="NATIVE_SLOT_CRAFTING", recipeBookCraftUnlock="N/A_NO_1_10_RECIPE_BOOK")) - recipe("poweradvantage:fluid_pipe@0",["minecraft:iron_ingot@0"]*6,3 if mode=="APOCALYPTIC" else 6) - recipe("steamadvantage:steam_governor@0",["minecraft:iron_nugget@0"]) - recipe("electricadvantage:psu@0",["electricadvantage:control_circuit@0"]) + recipe("basepower:fluid_pipe@0",["minecraft:iron_ingot@0"]*6,3 if mode=="APOCALYPTIC" else 6) + recipe("basesteam:steam_governor@0",["minecraft:iron_nugget@0"]) + recipe("baseelectric:psu@0",["baseelectric:control_circuit@0"]) if mode!="APOCALYPTIC": - recipe("poweradvantage:sprocket@0",["basemetals:steel_ingot@0"],4) + recipe("basepower:sprocket@0",["basemetals:steel_ingot@0"],4) for metal in ("Copper","Tin","Gold"): inputs=[ores["ingotSilicon"][0]]*3+[ores["nugget"+metal][0]]*3 if mode=="TECH_PROGRESSION": inputs=[ores["plastic"][0],ores["dustRedstone"][0],ores["plastic"][0]]+inputs - recipe("electricadvantage:integrated_circuit@0",inputs,3) - recipe("electricadvantage:photovoltaic_generator@0",["minecraft:glass@0"]) + recipe("baseelectric:integrated_circuit@0",inputs,3) + recipe("baseelectric:photovoltaic_generator@0",["minecraft:glass@0"]) return dict(minecraft=native.MC,mode=mode,rubber=True,status="EXPORTED_NOT_QUALIFIED",crafting=rows, targets=sorted(native.CORE),ores=ores, blockItems=[],smelting=[dict(input="minecraft:iron_ore@0",output="minecraft:iron_ingot@0",count=1)], - crusherRegistry="unit:fixture",crushing=[dict(input="minecraft:potato@0",output="poweradvantage:starch@0",tools=[])],sampledNativeLoot=[]) + crusherRegistry="unit:fixture",crushing=[dict(input="minecraft:potato@0",output="basepower:starch@0",tools=[])],sampledNativeLoot=[]) class RecipeAuditTests(unittest.TestCase): def test_missing_process_functions_and_lookup_errors_remain_required_failures(self): @@ -64,7 +64,7 @@ def test_missing_core_or_duplicate_recipe_cannot_qualify(self): with self.assertRaises(AssertionError): native.mode_checks(doc,"NORMAL",True) def test_apocalyptic_does_not_gain_free_chips_sprockets_or_solar(self): - for target in ("poweradvantage:sprocket@0","electricadvantage:integrated_circuit@0","electricadvantage:photovoltaic_generator@0"): + for target in ("basepower:sprocket@0","baseelectric:integrated_circuit@0","baseelectric:photovoltaic_generator@0"): doc=fixture("APOCALYPTIC") extra=deepcopy(doc["crafting"][0]);extra.update(id="forbidden",output=target);doc["crafting"].append(extra) with self.subTest(target=target),self.assertRaises(AssertionError): native.mode_checks(doc,"APOCALYPTIC",True) @@ -74,13 +74,13 @@ def test_pipe_yields_and_tech_chip_complexity_remain_strict(self): doc=fixture(mode);doc["crafting"][0]["count"]=99 with self.subTest(mode=mode),self.assertRaises(AssertionError):native.mode_checks(doc,mode,True) doc=fixture("TECH_PROGRESSION") - next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0")["inputs"]=["minecraft:dirt@0"]*6 + next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0")["inputs"]=["minecraft:dirt@0"]*6 with self.assertRaises(AssertionError): native.mode_checks(doc,"TECH_PROGRESSION",True) def test_wrong_chip_materials_are_not_blessed_by_a_root_flag(self): for mode in ("NORMAL","TECH_PROGRESSION"): doc=fixture(mode);doc["chipSemanticsVerified"]=True - chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0") + chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0") chip["inputs"]=["minecraft:dirt@0"]*len(chip["inputs"]) chip["providers"]=[[item] for item in chip["inputs"]] with self.subTest(mode=mode),self.assertRaisesRegex(AssertionError,"Microchip"): @@ -90,7 +90,7 @@ def test_chip_yield_is_three_even_when_native_count_fields_agree(self): for mode in ("NORMAL","TECH_PROGRESSION"): for count in (1,2,4,64): doc=fixture(mode) - chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0") + chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0") chip.update(count=count,actualCraftedCount=count) with self.subTest(mode=mode,count=count),self.assertRaisesRegex(AssertionError,"Microchip"): native.mode_checks(doc,mode,True) @@ -100,7 +100,7 @@ def test_chip_nuggets_cannot_be_mixed_or_replaced_by_ingots(self): for metals in (["basemetals:copper_nugget@0","basemetals:tin_nugget@0","minecraft:gold_nugget@0"], ["basemetals:copper_ingot@0"]*3): doc=fixture(mode);doc["ores"]["ingotCopper"]=["basemetals:copper_ingot@0"] - chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0") + chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0") chip["inputs"][-3:]=metals;chip["providers"][-3:]=[[item] for item in metals] with self.subTest(mode=mode,metals=metals),self.assertRaisesRegex(AssertionError,"Microchip"): native.mode_checks(doc,mode,True) @@ -115,7 +115,7 @@ def test_chip_requires_actual_native_ore_entries(self): def test_tech_chip_requires_plastic_and_redstone(self): for slot in (0,1,2): doc=fixture("TECH_PROGRESSION") - chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0") + chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0") chip["inputs"][slot]=doc["ores"]["ingotSilicon"][0] chip["providers"][slot]=[chip["inputs"][slot]] with self.subTest(slot=slot),self.assertRaisesRegex(AssertionError,"Microchip"): @@ -125,7 +125,7 @@ def test_chip_requires_complete_consistent_provider_evidence(self): for mode in ("NORMAL","TECH_PROGRESSION"): for mutation in ("missing","short","empty","wrong-selected","extra-wrong-choice"): doc=fixture(mode) - chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0") + chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0") if mutation=="missing": chip.pop("providers") elif mutation=="short": chip["providers"].pop() elif mutation=="empty": chip["providers"][0]=[] @@ -150,37 +150,37 @@ def test_chip_uses_actual_ore_entries_not_item_name_heuristics(self): def test_chip_wildcard_ores_accept_native_expanded_providers(self): doc=fixture();doc["ores"]["ingotSilicon"]=["othermod:silicon@32767"] - for chip in (r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0"): + for chip in (r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0"): chip["inputs"][:3]=["othermod:silicon@5"]*3 chip["providers"][:3]=[["othermod:silicon@5","othermod:silicon@7"] for _ in range(3)] native.mode_checks(doc,"NORMAL",True) def test_chip_provider_wildcards_cannot_broaden_specific_ore_entries(self): doc=fixture() - chip=next(r for r in doc["crafting"] if r["output"]=="electricadvantage:integrated_circuit@0") + chip=next(r for r in doc["crafting"] if r["output"]=="baseelectric:integrated_circuit@0") chip["providers"][0]=[chip["inputs"][0].rsplit("@",1)[0]+"@32767"] with self.assertRaisesRegex(AssertionError,"Microchip"): native.mode_checks(doc,"NORMAL",True) def test_unseeded_self_and_mutual_cycles_are_not_reachable(self): doc=fixture() - for output,inputs in (("poweradvantage:a@0",["poweradvantage:b@0"]),("poweradvantage:b@0",["poweradvantage:a@0"])): + for output,inputs in (("basepower:a@0",["basepower:b@0"]),("basepower:b@0",["basepower:a@0"])): doc["crafting"].append(dict(id=output,output=output,inputs=inputs,status="PASS")) doc["targets"].append(output) result=native.reachability(doc) - self.assertIn("poweradvantage:a@0",result["blocked"]);self.assertIn("poweradvantage:b@0",result["blocked"]) + self.assertIn("basepower:a@0",result["blocked"]);self.assertIn("basepower:b@0",result["blocked"]) def test_generated_loot_configuration_is_not_a_real_acquisition(self): - doc=fixture("APOCALYPTIC");doc["generatedLootConfig"]=["poweradvantage:sprocket@0"] - self.assertNotIn("poweradvantage:sprocket@0",native.reachability(doc)["reachable"]) - doc["sampledNativeLoot"]=[dict(item="poweradvantage:sprocket@0",table="simple_dungeon",seed=4)] - self.assertIn("poweradvantage:sprocket@0",native.reachability(doc)["reachable"]) + doc=fixture("APOCALYPTIC");doc["generatedLootConfig"]=["basepower:sprocket@0"] + self.assertNotIn("basepower:sprocket@0",native.reachability(doc)["reachable"]) + doc["sampledNativeLoot"]=[dict(item="basepower:sprocket@0",table="simple_dungeon",seed=4)] + self.assertIn("basepower:sprocket@0",native.reachability(doc)["reachable"]) doc["mode"]="NORMAL" - self.assertNotIn("poweradvantage:sprocket@0",native.reachability(doc)["reachable"]) + self.assertNotIn("basepower:sprocket@0",native.reachability(doc)["reachable"]) def test_ore_roots_never_seed_a_crafted_nonblock_part(self): - doc=fixture();doc["ores"]["oreCopper"]=["poweradvantage:sprocket@0"] - self.assertNotIn("poweradvantage:sprocket@0",native.reachability(doc)["reachable"]) + doc=fixture();doc["ores"]["oreCopper"]=["basepower:sprocket@0"] + self.assertNotIn("basepower:sprocket@0",native.reachability(doc)["reachable"]) def test_smelting_requires_a_reachable_furnace_and_fuel(self): doc=fixture();doc["smelting"]=[dict(input="minecraft:iron_ore@0",output="minecraft:iron_ingot@0",count=1)] @@ -189,10 +189,10 @@ def test_smelting_requires_a_reachable_furnace_and_fuel(self): self.assertIn("minecraft:iron_ingot@0",native.reachability(doc)["reachable"]) def test_crushing_requires_an_obtainable_valid_hammer(self): - doc=fixture();doc["crushing"]=[dict(input="minecraft:potato@0",output="poweradvantage:starch@0",tools=["basemetals:stone_crackhammer@0"])] - self.assertNotIn("poweradvantage:starch@0",native.reachability(doc)["reachable"]) + doc=fixture();doc["crushing"]=[dict(input="minecraft:potato@0",output="basepower:starch@0",tools=["basemetals:stone_crackhammer@0"])] + self.assertNotIn("basepower:starch@0",native.reachability(doc)["reachable"]) doc["crafting"].append(dict(id="hammer",inputs=["minecraft:cobblestone@0"],output="basemetals:stone_crackhammer@0",status="PASS")) - self.assertIn("poweradvantage:starch@0",native.reachability(doc)["reachable"]) + self.assertIn("basepower:starch@0",native.reachability(doc)["reachable"]) def test_unverified_native_recipes_and_missing_machine_edges_are_explicit(self): doc=fixture();doc["crafting"][0].update(status="UNVERIFIED",reason="Missing provider") diff --git a/test-rig/migration/test_rebrand_target_contract.py b/test-rig/migration/test_rebrand_target_contract.py new file mode 100644 index 0000000..d4b1483 --- /dev/null +++ b/test-rig/migration/test_rebrand_target_contract.py @@ -0,0 +1,69 @@ +"""Target declarations and API boundaries; no builds, servers or source-world writes.""" +import json +from pathlib import Path +import unittest + +RIG = Path(__file__).resolve().parents[1] +VERSIONS = {"basepower": ("basePower", "2.4.4.110021"), + "basesteam": ("baseSteam", "2.2.6.110021"), "baseelectric": ("baseElectric", "2.2.6.110021")} + + +class RebrandTargetContractTest(unittest.TestCase): + def test_all_eleven_current_profiles_are_explicitly_unqualified_new_targets(self): + profiles = list((RIG / "profiles").glob("*.json")) + self.assertEqual(11, len(profiles)) + for path in profiles: + doc = json.loads(path.read_text()) + self.assertEqual("UNQUALIFIED_REBRAND_WORKSPACE_INPUTS", doc["qualificationStatus"]) + for mod in doc["mods"]: + self.assertNotIn(mod["id"], ("poweradvantage", "steamadvantage", "electricadvantage")) + if mod["id"] in VERSIONS: + stem, version = VERSIONS[mod["id"]] + self.assertEqual(version, mod["version"]) + suffix = "-deobf.jar" if doc["mode"] == "development" else ".jar" + self.assertEqual(stem + "-" + version + suffix, mod["file"]) + self.assertRegex(mod.get("sha256", ""), r"^[A-F0-9]{64}$") + if doc["mode"] == "packaged": + expected = {"basepower": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31", + "basesteam": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D", + "baseelectric": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1"} + self.assertEqual(expected[mod["id"]], mod["sha256"]) + if mod["id"] == "advantageworkstest": + self.assertEqual("1.1.0.110021", mod["version"]) + if doc["mode"] == "development": + self.assertTrue(mod["path"].startswith("build/gradle/libs-dev")) + else: + self.assertEqual("521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525",mod["sha256"]) + self.assertIn("/survival-candidate-06/artifacts/" + mod["sha256"] + "/", mod["path"]) + self.assertTrue(mod["path"].endswith("/" + mod["file"])) + + def test_current_targets_keep_the_legacy_public_api_and_use_new_implementation_packages(self): + roots = (RIG / "src", RIG / "client-resources/java") + seen_api = False + for root in roots: + for path in root.rglob("*.java"): + source = path.read_text() + seen_api |= "cyano.poweradvantage.api" in source + self.assertNotIn("cyano.basepower.api", source) + for old in ("poweradvantage", "steamadvantage", "electricadvantage"): + self.assertNotIn("zone.moddev.mc." + old, source) + self.assertNotIn("com.mcmoddev." + old, source) + self.assertTrue(seen_api) + build = (RIG / "build.gradle").read_text() + self.assertIn("../build/libs-dev/basePower-2.4.4.110021-deobf.jar", build) + + def test_java_profile_runner_cannot_treat_unpinned_rebrand_bytes_as_qualified(self): + source = (RIG / "src/runner/java/zone/moddev/mc/advantageworks/runner/WorksRunner.java").read_text() + self.assertIn('input.id.matches("base(?:power|steam|electric)")', source) + self.assertIn("requires a fresh exact SHA-256 pin", source) + self.assertIn('manifest.put("qualificationStatus", profile.qualificationStatus)', source) + + def test_harness_metadata_depends_only_on_current_target_ids(self): + harness = json.loads((RIG / "src/main/resources/mcmod.info").read_text()) + client = json.loads((RIG / "client-resources/resources/mcmod.info").read_text()) + self.assertEqual(["basepower"], harness[0]["dependencies"]) + self.assertEqual(["basepower", "basesteam", "baseelectric"], client[0]["dependencies"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/test-rig/migration/test_steam_control_audit.py b/test-rig/migration/test_steam_control_audit.py index b2b62bd..03fa1ed 100644 --- a/test-rig/migration/test_steam_control_audit.py +++ b/test-rig/migration/test_steam_control_audit.py @@ -4,9 +4,11 @@ import contextlib from copy import deepcopy import gzip +import importlib.util import io import json from pathlib import Path +import shutil import tempfile import unittest from unittest.mock import patch @@ -15,7 +17,8 @@ import steam_control_audit as audit -LINE = Path(__file__).resolve().parents[3].name[2:] +# This branch tests 1.10; checkout directory names are not version metadata. +LINE = "110" def snapshot(position, block, data=None): @@ -63,7 +66,7 @@ def at(x): if case_id == audit.COMPARATOR: before, after = [], [] for i, stock in enumerate((0, 1, 32, 64)): - tile = snapshot(at(3 + 6 * i), "steamadvantage:steam_crusher", + tile = snapshot(at(3 + 6 * i), audit.steam_block("steam_crusher", LINE), data("minecraft:stone", stock, 0, work=0)) before.append(tile); after.append(deepcopy(tile)) row["count/" + str(3 + 6 * i) + "/4/8/minecraft:stone"] = stock @@ -72,14 +75,14 @@ def at(x): crusher = case_id in audit.CRUSHERS signal, initial = audit.CRUSHERS[case_id] if crusher else (audit.FURNACES[case_id], 40) if crusher: - block, item, slot = "steamadvantage:steam_crusher", "minecraft:stone", 0 + block, item, slot = audit.steam_block("steam_crusher", LINE), "minecraft:stone", 0 work = 105 if signal or initial == 0 else 107 reserve = 0 if initial == 0 else 39.9375 if signal else 38.4375 before_data = data(item, 1, slot, initial, work=106) after_data = data(item, 1, slot, reserve, work=work) row["firstLoaded.progress"] = work else: - block, item, slot = "steamadvantage:steam_furnace", "minecraft:sand", 1 + block, item, slot = audit.steam_block("steam_furnace", LINE), "minecraft:sand", 1 heat = 989.5 if signal else 1027.0 work = audit.f32(.25 + audit.f32(audit.f32(3.5e-6) * heat)) reserve = 40 if signal else 39.5 @@ -123,6 +126,33 @@ def change_tile(row, line, **changes): class SteamControlAuditTests(unittest.TestCase): + def test_fixture_version_survives_a_differently_named_checkout(self): + with tempfile.TemporaryDirectory(prefix="advantage-checkout-") as temporary: + relocated = Path(temporary) / "A Different Repository Name" / "test_steam_control_audit.py" + relocated.parent.mkdir() + shutil.copyfile(__file__, relocated) + spec = importlib.util.spec_from_file_location("relocated_steam_contract", relocated) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + self.assertEqual("110", module.LINE) + + def test_namespace_is_exact_and_version_specific(self): + self.assertEqual("basesteam:steam_crusher", audit.steam_block("steam_crusher", "110")) + self.assertEqual("steamadvantage:steam_crusher", audit.steam_block("steam_crusher", "112")) + + def test_old_owner_is_not_accepted_as_a_renamed_native_machine(self): + if LINE != "110": + self.skipTest("Only the 1.10 target has been renamed") + bundle = fixture() + for group, keys in (("operation", ("before", "after")), ("fixture", ("positions",)), + ("cold", ("positions",))): + for row in bundle[group]["cases"]: + for key in keys: + for state in row[key]: + for field in ("block", "state"): + state[field] = state[field].replace("basesteam:", "steamadvantage:") + self.verify(bundle) + def verify(self, bundle, status="FAIL"): result = audit.audit_documents(**bundle, line=LINE) self.assertEqual(status, result["status"], result) diff --git a/test-rig/migration/test_survival110_plan.py b/test-rig/migration/test_survival110_plan.py new file mode 100644 index 0000000..3da04a3 --- /dev/null +++ b/test-rig/migration/test_survival110_plan.py @@ -0,0 +1,120 @@ +"""Planner/receipt negative controls. These tests do not claim gameplay proof.""" +from copy import deepcopy +import unittest +from survival110_plan import Planner, Unobtainable +from native110_survival_progression import validate_replay + + +def recipe(output, inputs, providers=None, count=1): + return dict(id="craft/0",status="PASS",output=output,inputs=inputs, + providers=providers or [[x] for x in inputs],count=count,width=3) + + +def doc(rows=()): + return dict(crafting=list(rows),smelting=[],crushing=[],economy=dict(trades=[],toolDurability={})) + + +class FinitePlannerTests(unittest.TestCase): + def test_selects_obtainable_alternative_not_first_registry_entry(self): + p=Planner(doc([recipe("gear",["diamond_rod"],[["diamond_rod","iron_rod"]])]),{"iron_rod":1}) + p.ensure("gear") + self.assertEqual(["iron_rod"],p.actions[0]["inputs"]) + self.assertEqual(0,p.stock["iron_rod"]) + + def test_duplicate_ingredient_requires_real_quantity(self): + p=Planner(doc([recipe("gear",["iron","iron"])]),{"iron":1}) + with self.assertRaises(Unobtainable):p.ensure("gear") + self.assertEqual(1,p.stock["iron"]) + self.assertEqual([],p.actions) + + def test_cycles_do_not_create_starting_components(self): + p=Planner(doc([recipe("gear",["chip"]),recipe("chip",["gear"])]),{}) + with self.assertRaises(Unobtainable):p.ensure("gear") + self.assertEqual([],p.actions) + + def test_failed_provider_rolls_back_partial_prerequisites(self): + p=Planner(doc([recipe("gear",["a","missing"]),recipe("gear",["b"])]),{"a":1,"b":1}) + p.ensure("gear") + self.assertEqual(1,p.stock["a"]) + self.assertEqual(0,p.stock["b"]) + self.assertEqual(1,len(p.actions)) + + def test_water_bucket_is_not_free_and_returns_empty_bucket(self): + d=doc([recipe("battery",["minecraft:water_bucket@0"])]) + p=Planner(d,{"minecraft:bucket@0":1}) + p.ensure("battery") + self.assertEqual(["water","craft"],[a["kind"] for a in p.actions]) + self.assertEqual(1,p.stock["minecraft:bucket@0"]) + self.assertEqual(0,p.stock["minecraft:water_bucket@0"]) + with self.assertRaises(Unobtainable):Planner(d,{}).ensure("battery") + + def test_smelting_requires_furnace_and_fuel(self): + d=doc();d["smelting"]=[dict(input="ore",output="ingot",count=1)] + for budget in ({"ore":1},{"ore":1,"minecraft:furnace@0":1}): + with self.assertRaises(Unobtainable):Planner(d,budget).ensure("ingot") + p=Planner(d,{"ore":1,"minecraft:furnace@0":1,"minecraft:coal@0":1});p.ensure("ingot") + self.assertEqual(0,p.stock["minecraft:coal@0"]) + + def test_trade_requires_money_and_does_not_assume_restock(self): + d=doc();d["economy"]["trades"]=[dict(id="offer",input="emerald",price=2,output="gear",count=1,maxUses=1)] + with self.assertRaises(Unobtainable):Planner(d,{"emerald":1},True).ensure("gear") + p=Planner(d,{"emerald":4},True);p.ensure("gear") + with self.assertRaises(Unobtainable):p.ensure("gear",2) + self.assertEqual(2,p.stock["emerald"]) + with self.assertRaises(Unobtainable):Planner(d,{"emerald":4}).ensure("gear") + + def test_missing_currency_and_zero_price_are_not_free_intermediates(self): + for row in (dict(id="bad",price=0,output="gear",count=1,maxUses=7), + dict(id="bad",input="emerald",price=0,output="gear",count=1,maxUses=7)): + d=doc();d["economy"]["trades"]=[row];p=Planner(d,{"emerald":4},True) + with self.assertRaises(Unobtainable):p.ensure("gear") + self.assertEqual(1,len(p.uncredited_trades)) + + def test_no_diamond_rod_can_be_credited_from_an_unreplayed_provider_list(self): + p=Planner(doc([recipe("gear",["diamond_rod"],[["diamond_rod","iron_rod"]])]),{"iron_rod":1}) + p.ensure("gear") + self.assertEqual(0,p.stock["diamond_rod"]) + self.assertNotIn("diamond_rod",p.actions[0]["inputs"]) + + def test_machine_recipe_cannot_consume_the_only_workbench(self): + d=doc([recipe("minecraft:crafting_table@0",["wood"]),recipe("machine",["minecraft:crafting_table@0"])]) + p=Planner(d,{"wood":2,"minecraft:crafting_table@0":1}) + p.ensure("machine") + self.assertEqual(1,p.stock["minecraft:crafting_table@0"]) + self.assertEqual(1,p.stock["wood"]) + + +class ReceiptTests(unittest.TestCase): + def fixture(self): + action=dict(kind="craft",output="gear",count=1,inputs=["iron"],width=1,recipe="craft/0") + p=dict(initial={"iron":1},actions=[action],expectedStock={"gear":1}) + row=dict(index=0,kind="craft",status="PASS",output="gear",before={"iron":1},after={"gear":1}, + selectedInputs=["iron"],nativeConsumption="SlotCrafting",negativeControlsRejected=2,returnedEmptyBuckets=0) + first=dict(actions=[row],stock={"gear":1},stockTyped=["exact-nbt-test-fixture"]) + continued=dict(actions=[],craftedStock={"gear":1},resumedStock={"gear":1},resumedStockTyped=["exact-nbt-test-fixture"]) + return p,first,continued + + def test_valid_accounting(self):validate_replay(*self.fixture()) + + def test_rejects_faked_receipts(self): + for field,value in (("index",1),("nativeConsumption","LOOKUP_ONLY"),("negativeControlsRejected",0), + ("after",{"gear":2}),("before",{"iron":9}),("selectedInputs",["diamond_rod"]), + ("returnedEmptyBuckets",1),("output","chip")): + p,first,continued=self.fixture();first["actions"][0][field]=value + with self.subTest(field=field),self.assertRaises(AssertionError):validate_replay(p,first,continued) + + def test_missing_or_duplicate_step_fails(self): + for rows in ([],[0,0]): + p,first,continued=self.fixture();first["actions"]=[deepcopy(first["actions"][i]) for i in rows] + with self.assertRaises(AssertionError):validate_replay(p,first,continued) + + def test_restart_may_not_reseed_inventory(self): + p,first,continued=self.fixture();continued["resumedStock"]={"gear":1,"iron":99} + with self.assertRaisesRegex(AssertionError,"reset"):validate_replay(p,first,continued) + + def test_tool_damage_reset_fails_even_if_every_item_count_is_unchanged(self): + p,first,continued=self.fixture();continued["resumedStockTyped"]=["same-tool-reset-damage"] + with self.assertRaisesRegex(AssertionError,"Typed"):validate_replay(p,first,continued) + + +if __name__=="__main__":unittest.main() diff --git a/test-rig/profiles/dev-core-apocalyptic.json b/test-rig/profiles/dev-core-apocalyptic.json index 2826bcb..46bca65 100644 --- a/test-rig/profiles/dev-core-apocalyptic.json +++ b/test-rig/profiles/dev-core-apocalyptic.json @@ -7,30 +7,34 @@ "shutdownTimeoutSeconds": 60, "stationRunSeconds": 5, "recipeMode": "APOCALYPTIC", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "lifecycleStations": [], "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020-deobf.jar", - "path": "build/libs-dev/AdvantageWorksTestHarness-1.0.0.110020-deobf.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021-deobf.jar", + "path": "build/gradle/libs-dev/AdvantageWorksTestHarness-1.1.0.110021-deobf.jar", + "workspaceProduced": true, + "sha256": "FE1F72756FA4A16BFAD5CD21C28EC85C2F8FCF25A29EDC5A9908914B6F8559D2" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021-deobf.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/SteamAdvantage-2.2.5.110021-deobf.jar", - "sha256": "B5247840473DE939234D83B61612B42B2398D79036101CD17ADA5AEA08B8A63F" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021-deobf.jar", + "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/baseSteam-2.2.6.110021-deobf.jar", + "workspaceProduced": true, + "sha256": "17563247BECAA47E7191EC8FDCC1BF8EB493BC83312C2CD2BF2DA52332D6DC55" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021-deobf.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/ElectricAdvantage-2.2.5.110021-deobf.jar", - "sha256": "2E1ED596049D891C3A41ECC9DFE8979E39DED56651B8DE6DB2A9A4709F5A1AF9" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021-deobf.jar", + "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/baseElectric-2.2.6.110021-deobf.jar", + "workspaceProduced": true, + "sha256": "BBB2620D71A52B1EF11E509F77D52E1A733FB7A8F5883646331AF4D5E1A2708F" } - ] + ], + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/profiles/dev-core-tech-progression.json b/test-rig/profiles/dev-core-tech-progression.json index 86b202d..1a21e83 100644 --- a/test-rig/profiles/dev-core-tech-progression.json +++ b/test-rig/profiles/dev-core-tech-progression.json @@ -7,30 +7,34 @@ "shutdownTimeoutSeconds": 60, "stationRunSeconds": 5, "recipeMode": "TECH_PROGRESSION", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "lifecycleStations": [], "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020-deobf.jar", - "path": "build/libs-dev/AdvantageWorksTestHarness-1.0.0.110020-deobf.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021-deobf.jar", + "path": "build/gradle/libs-dev/AdvantageWorksTestHarness-1.1.0.110021-deobf.jar", + "workspaceProduced": true, + "sha256": "FE1F72756FA4A16BFAD5CD21C28EC85C2F8FCF25A29EDC5A9908914B6F8559D2" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021-deobf.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/SteamAdvantage-2.2.5.110021-deobf.jar", - "sha256": "B5247840473DE939234D83B61612B42B2398D79036101CD17ADA5AEA08B8A63F" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021-deobf.jar", + "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/baseSteam-2.2.6.110021-deobf.jar", + "workspaceProduced": true, + "sha256": "17563247BECAA47E7191EC8FDCC1BF8EB493BC83312C2CD2BF2DA52332D6DC55" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021-deobf.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/ElectricAdvantage-2.2.5.110021-deobf.jar", - "sha256": "2E1ED596049D891C3A41ECC9DFE8979E39DED56651B8DE6DB2A9A4709F5A1AF9" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021-deobf.jar", + "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/baseElectric-2.2.6.110021-deobf.jar", + "workspaceProduced": true, + "sha256": "BBB2620D71A52B1EF11E509F77D52E1A733FB7A8F5883646331AF4D5E1A2708F" } - ] + ], + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/profiles/dev-core.json b/test-rig/profiles/dev-core.json index c218a50..4c3a0dd 100644 --- a/test-rig/profiles/dev-core.json +++ b/test-rig/profiles/dev-core.json @@ -7,29 +7,33 @@ "shutdownTimeoutSeconds": 60, "stationRunSeconds": 5, "recipeMode": "NORMAL", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020-deobf.jar", - "path": "build/libs-dev/AdvantageWorksTestHarness-1.0.0.110020-deobf.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021-deobf.jar", + "path": "build/gradle/libs-dev/AdvantageWorksTestHarness-1.1.0.110021-deobf.jar", + "workspaceProduced": true, + "sha256": "FE1F72756FA4A16BFAD5CD21C28EC85C2F8FCF25A29EDC5A9908914B6F8559D2" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021-deobf.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/SteamAdvantage-2.2.5.110021-deobf.jar", - "sha256": "B5247840473DE939234D83B61612B42B2398D79036101CD17ADA5AEA08B8A63F" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021-deobf.jar", + "path": "../../SteamAdvantage/SteamAdvantage/build/libs-dev/baseSteam-2.2.6.110021-deobf.jar", + "workspaceProduced": true, + "sha256": "17563247BECAA47E7191EC8FDCC1BF8EB493BC83312C2CD2BF2DA52332D6DC55" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021-deobf.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/ElectricAdvantage-2.2.5.110021-deobf.jar", - "sha256": "2E1ED596049D891C3A41ECC9DFE8979E39DED56651B8DE6DB2A9A4709F5A1AF9" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021-deobf.jar", + "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs-dev/baseElectric-2.2.6.110021-deobf.jar", + "workspaceProduced": true, + "sha256": "BBB2620D71A52B1EF11E509F77D52E1A733FB7A8F5883646331AF4D5E1A2708F" } - ] + ], + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/profiles/packaged-current.json b/test-rig/profiles/packaged-current.json index ec883de..00ee15c 100644 --- a/test-rig/profiles/packaged-current.json +++ b/test-rig/profiles/packaged-current.json @@ -7,8 +7,8 @@ "shutdownTimeoutSeconds": 60, "stationRunSeconds": 5, "recipeMode": "NORMAL", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "forge": { "version": "1.10.2-12.18.3.2511", "installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar", @@ -18,46 +18,51 @@ "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020.jar", - "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar", + "workspaceProduced": true, + "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525" }, { - "id": "poweradvantage", - "version": "2.4.3.110021", - "file": "PowerAdvantage-2.4.3.110021.jar", - "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar", - "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56" + "id": "basepower", + "version": "2.4.4.110021", + "file": "basePower-2.4.4.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar", + "workspaceProduced": true, + "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar", - "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar", - "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1" }, { "id": "basemetals", "version": "2.5.0-beta4", "file": "BaseMetals-1.10.2-2.5.0-beta4.238.jar", - "path": "${env:ADVANTAGE_WORKS_CURRENT_MODS}/BaseMetals-1.10.2-2.5.0-beta4.238.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/51F04770C316E62D9ED3EF713144F02FA2EC899645813627091365E12F61C3EF/BaseMetals-1.10.2-2.5.0-beta4.238.jar", "sha256": "51F04770C316E62D9ED3EF713144F02FA2EC899645813627091365E12F61C3EF" }, { "id": "orespawn", "version": "4.0.8.110021", "file": "OreSpawn-4.0.8.110021.jar", - "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar", "sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21", "workspaceProduced": true } - ] + ], + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/profiles/packaged-decoupled.json b/test-rig/profiles/packaged-decoupled.json index a8686d0..65b9e6b 100644 --- a/test-rig/profiles/packaged-decoupled.json +++ b/test-rig/profiles/packaged-decoupled.json @@ -7,8 +7,8 @@ "shutdownTimeoutSeconds": 60, "stationRunSeconds": 5, "recipeMode": "NORMAL", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "forge": { "version": "1.10.2-12.18.3.2511", "installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar", @@ -18,39 +18,44 @@ "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020.jar", - "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar", + "workspaceProduced": true, + "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525" }, { - "id": "poweradvantage", - "version": "2.4.3.110021", - "file": "PowerAdvantage-2.4.3.110021.jar", - "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar", - "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56" + "id": "basepower", + "version": "2.4.4.110021", + "file": "basePower-2.4.4.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar", + "workspaceProduced": true, + "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar", - "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar", - "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1" }, { "id": "orespawn", "version": "4.0.8.110021", "file": "OreSpawn-4.0.8.110021.jar", - "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar", "sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21", "workspaceProduced": true } - ] + ], + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/profiles/packaged-legacy.json b/test-rig/profiles/packaged-legacy.json index 4515c11..d62255e 100644 --- a/test-rig/profiles/packaged-legacy.json +++ b/test-rig/profiles/packaged-legacy.json @@ -7,8 +7,8 @@ "shutdownTimeoutSeconds": 60, "stationRunSeconds": 5, "recipeMode": "NORMAL", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "forge": { "version": "1.10.2-12.18.3.2511", "installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar", @@ -18,46 +18,51 @@ "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020.jar", - "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar", + "workspaceProduced": true, + "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525" }, { - "id": "poweradvantage", - "version": "2.4.3.110021", - "file": "PowerAdvantage-2.4.3.110021.jar", - "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar", - "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56" + "id": "basepower", + "version": "2.4.4.110021", + "file": "basePower-2.4.4.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar", + "workspaceProduced": true, + "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar", - "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar", - "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1" }, { "id": "basemetals", "version": "2.4.0.11", "file": "BaseMetals_1.10.2-2.4.0.11.jar", - "path": "../../../_deps/BaseMetals-v2.4.0/build/libs/BaseMetals_1.10.2-2.4.0.11.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c-base24/artifacts/A225D3E24CD37C377A9D843861FC13BDDB0B88F799D3D3AEDBC8B1DC636BB5E5/BaseMetals_1.10.2-2.4.0.11.jar", "sha256": "A225D3E24CD37C377A9D843861FC13BDDB0B88F799D3D3AEDBC8B1DC636BB5E5" }, { "id": "orespawn", "version": "4.0.8.110021", "file": "OreSpawn-4.0.8.110021.jar", - "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar", "sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21", "workspaceProduced": true } - ] + ], + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/profiles/packaged-mineralogy.json b/test-rig/profiles/packaged-mineralogy.json index c05074d..0a001db 100644 --- a/test-rig/profiles/packaged-mineralogy.json +++ b/test-rig/profiles/packaged-mineralogy.json @@ -7,8 +7,8 @@ "shutdownTimeoutSeconds": 60, "stationRunSeconds": 5, "recipeMode": "NORMAL", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "forge": { "version": "1.10.2-12.18.3.2511", "installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar", @@ -18,37 +18,41 @@ "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020.jar", - "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar", + "workspaceProduced": true, + "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525" }, { - "id": "poweradvantage", - "version": "2.4.3.110021", - "file": "PowerAdvantage-2.4.3.110021.jar", - "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar", - "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56" + "id": "basepower", + "version": "2.4.4.110021", + "file": "basePower-2.4.4.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar", + "workspaceProduced": true, + "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar", - "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar", - "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1" }, { "id": "orespawn", "version": "4.0.8.110021", "file": "OreSpawn-4.0.8.110021.jar", - "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar", "sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21", "workspaceProduced": true }, @@ -60,5 +64,9 @@ "sha256": "48841ABD9517127D1F0D17960AAD86FEFB251D340B006872ACECADD01A4B43F9" } ], - "lifecycleStations": ["W-03", "S-01"] + "lifecycleStations": [ + "W-03", + "S-01" + ], + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/profiles/packaged-optional-power.json b/test-rig/profiles/packaged-optional-power.json index 3523a7e..d111626 100644 --- a/test-rig/profiles/packaged-optional-power.json +++ b/test-rig/profiles/packaged-optional-power.json @@ -7,8 +7,8 @@ "shutdownTimeoutSeconds": 60, "stationRunSeconds": 5, "recipeMode": "NORMAL", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "forge": { "version": "1.10.2-12.18.3.2511", "installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar", @@ -18,31 +18,35 @@ "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020.jar", - "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar", + "workspaceProduced": true, + "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525" }, { - "id": "poweradvantage", - "version": "2.4.3.110021", - "file": "PowerAdvantage-2.4.3.110021.jar", - "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar", - "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56" + "id": "basepower", + "version": "2.4.4.110021", + "file": "basePower-2.4.4.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar", + "workspaceProduced": true, + "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar", - "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar", - "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1" }, { "id": "rf-api", @@ -63,9 +67,10 @@ "id": "orespawn", "version": "4.0.8.110021", "file": "OreSpawn-4.0.8.110021.jar", - "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar", "sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21", "workspaceProduced": true } - ] + ], + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/profiles/worldgen-advantage.json b/test-rig/profiles/worldgen-advantage.json index 9b39614..fad4e3d 100644 --- a/test-rig/profiles/worldgen-advantage.json +++ b/test-rig/profiles/worldgen-advantage.json @@ -5,8 +5,8 @@ "startupTimeoutSeconds": 180, "stationRunSeconds": 5, "recipeMode": "NORMAL", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "forge": { "version": "1.10.2-12.18.3.2511", "installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar", @@ -16,37 +16,41 @@ "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020.jar", - "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar", + "workspaceProduced": true, + "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525" }, { - "id": "poweradvantage", - "version": "2.4.3.110021", - "file": "PowerAdvantage-2.4.3.110021.jar", - "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar", - "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56" + "id": "basepower", + "version": "2.4.4.110021", + "file": "basePower-2.4.4.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar", + "workspaceProduced": true, + "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar", - "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar", - "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1" }, { "id": "orespawn", "version": "4.0.8.110021", "file": "OreSpawn-4.0.8.110021.jar", - "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar", "sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21", "workspaceProduced": true } @@ -64,7 +68,7 @@ { "id": "desert-oil-visible", "section": "fluid_deposits", - "entry": "poweradvantage:fluid_deposit/desert_crude_oil", + "entry": "basepower:fluid_deposit/desert_crude_oil", "present": true, "field": "enabled", "expectedBoolean": true @@ -72,15 +76,15 @@ { "id": "desert-oil-owner", "section": "fluid_deposits", - "entry": "poweradvantage:fluid_deposit/desert_crude_oil", + "entry": "basepower:fluid_deposit/desert_crude_oil", "present": true, "field": "source_provider", - "expectedString": "poweradvantage" + "expectedString": "basepower" }, { "id": "electric-sulfur-default", "section": "ores", - "entry": "electricadvantage:ore/sulfur", + "entry": "baseelectric:ore/sulfur", "present": true, "field": "enabled", "expectedBoolean": true @@ -88,7 +92,7 @@ { "id": "electric-lithium-default", "section": "ores", - "entry": "electricadvantage:ore/lithium", + "entry": "baseelectric:ore/lithium", "present": true, "field": "enabled", "expectedBoolean": true @@ -97,13 +101,13 @@ "profileMutations": [ { "section": "fluid_deposits", - "entry": "poweradvantage:fluid_deposit/desert_crude_oil", + "entry": "basepower:fluid_deposit/desert_crude_oil", "field": "enabled", "booleanValue": false }, { "section": "ores", - "entry": "electricadvantage:ore/sulfur", + "entry": "baseelectric:ore/sulfur", "field": "enabled", "booleanValue": false } @@ -112,7 +116,7 @@ { "id": "desert-oil-user-disable-persists", "section": "fluid_deposits", - "entry": "poweradvantage:fluid_deposit/desert_crude_oil", + "entry": "basepower:fluid_deposit/desert_crude_oil", "present": true, "field": "enabled", "expectedBoolean": false @@ -120,7 +124,7 @@ { "id": "electric-sulfur-user-disable-persists", "section": "ores", - "entry": "electricadvantage:ore/sulfur", + "entry": "baseelectric:ore/sulfur", "present": true, "field": "enabled", "expectedBoolean": false @@ -128,7 +132,7 @@ { "id": "electric-lithium-remains-enabled", "section": "ores", - "entry": "electricadvantage:ore/lithium", + "entry": "baseelectric:ore/lithium", "present": true, "field": "enabled", "expectedBoolean": true @@ -136,14 +140,15 @@ ], "worldgenExpectations": { "minimumCounts": { - "poweradvantage:crude_oil": 1, - "electricadvantage:li_ore": 1, - "electricadvantage:sulfur_ore": 1 + "basepower:crude_oil": 1, + "baseelectric:li_ore": 1, + "baseelectric:sulfur_ore": 1 }, "maximumCounts": { "mineralogy:crude_oil": 0, "mineralogy:sulfur_ore": 0 }, "zeroBiomeViolations": true - } + }, + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/profiles/worldgen-legacy-import.json b/test-rig/profiles/worldgen-legacy-import.json index 6eb7cd6..82f61c0 100644 --- a/test-rig/profiles/worldgen-legacy-import.json +++ b/test-rig/profiles/worldgen-legacy-import.json @@ -5,8 +5,8 @@ "startupTimeoutSeconds": 180, "stationRunSeconds": 5, "recipeMode": "NORMAL", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "forge": { "version": "1.10.2-12.18.3.2511", "installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar", @@ -16,37 +16,41 @@ "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020.jar", - "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar", + "workspaceProduced": true, + "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525" }, { - "id": "poweradvantage", - "version": "2.4.3.110021", - "file": "PowerAdvantage-2.4.3.110021.jar", - "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar", - "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56" + "id": "basepower", + "version": "2.4.4.110021", + "file": "basePower-2.4.4.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar", + "workspaceProduced": true, + "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar", - "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar", - "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1" }, { "id": "orespawn", "version": "4.0.8.110021", "file": "OreSpawn-4.0.8.110021.jar", - "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar", "sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21", "workspaceProduced": true } @@ -58,7 +62,9 @@ "generatorSettings": "", "buildWorks": false, "worldgenSampleRadius": 8, - "stableWorldgenCountExclusions": ["poweradvantage:crude_oil"], + "stableWorldgenCountExclusions": [ + "basepower:crude_oil" + ], "shutdownTimeoutSeconds": 300, "lifecycleStations": [], "configFixtures": [ @@ -75,7 +81,7 @@ { "id": "legacy-oil-retained", "section": "ores", - "entry": "poweradvantage:legacy/poweradvantage_crude_oil_0", + "entry": "basepower:legacy/basepower_crude_oil_0", "present": true, "field": "enabled", "expectedBoolean": true @@ -83,7 +89,7 @@ { "id": "legacy-lithium-retained", "section": "ores", - "entry": "electricadvantage:legacy/electricadvantage_li_ore_0", + "entry": "baseelectric:legacy/baseelectric_li_ore_0", "present": true, "field": "enabled", "expectedBoolean": true @@ -91,7 +97,7 @@ { "id": "legacy-sulfur-retained", "section": "ores", - "entry": "electricadvantage:legacy/electricadvantage_sulfur_ore_1", + "entry": "baseelectric:legacy/baseelectric_sulfur_ore_1", "present": true, "field": "enabled", "expectedBoolean": true @@ -99,19 +105,19 @@ { "id": "modern-oil-not-duplicated", "section": "fluid_deposits", - "entry": "poweradvantage:fluid_deposit/desert_crude_oil", + "entry": "basepower:fluid_deposit/desert_crude_oil", "present": false }, { "id": "modern-lithium-not-duplicated", "section": "ores", - "entry": "electricadvantage:ore/lithium", + "entry": "baseelectric:ore/lithium", "present": false }, { "id": "modern-sulfur-not-duplicated", "section": "ores", - "entry": "electricadvantage:ore/sulfur", + "entry": "baseelectric:ore/sulfur", "present": false } ], @@ -119,7 +125,7 @@ { "id": "legacy-oil-retained", "section": "ores", - "entry": "poweradvantage:legacy/poweradvantage_crude_oil_0", + "entry": "basepower:legacy/basepower_crude_oil_0", "present": true, "field": "enabled", "expectedBoolean": true @@ -127,7 +133,7 @@ { "id": "legacy-lithium-retained", "section": "ores", - "entry": "electricadvantage:legacy/electricadvantage_li_ore_0", + "entry": "baseelectric:legacy/baseelectric_li_ore_0", "present": true, "field": "enabled", "expectedBoolean": true @@ -135,7 +141,7 @@ { "id": "legacy-sulfur-retained", "section": "ores", - "entry": "electricadvantage:legacy/electricadvantage_sulfur_ore_1", + "entry": "baseelectric:legacy/baseelectric_sulfur_ore_1", "present": true, "field": "enabled", "expectedBoolean": true @@ -143,19 +149,19 @@ { "id": "modern-oil-not-duplicated", "section": "fluid_deposits", - "entry": "poweradvantage:fluid_deposit/desert_crude_oil", + "entry": "basepower:fluid_deposit/desert_crude_oil", "present": false }, { "id": "modern-lithium-not-duplicated", "section": "ores", - "entry": "electricadvantage:ore/lithium", + "entry": "baseelectric:ore/lithium", "present": false }, { "id": "modern-sulfur-not-duplicated", "section": "ores", - "entry": "electricadvantage:ore/sulfur", + "entry": "baseelectric:ore/sulfur", "present": false } ], @@ -168,14 +174,14 @@ }, { "id": "power-provider", - "path": "config/poweradvantage-orespawn.json", - "contains": "poweradvantage:legacy/poweradvantage_crude_oil_0", + "path": "config/basepower-orespawn.json", + "contains": "basepower:legacy/basepower_crude_oil_0", "minimumOccurrences": 1 }, { "id": "electric-provider", - "path": "config/electricadvantage-orespawn.json", - "contains": "electricadvantage:legacy/electricadvantage_li_ore_0", + "path": "config/baseelectric-orespawn.json", + "contains": "baseelectric:legacy/baseelectric_li_ore_0", "minimumOccurrences": 1 } ], @@ -188,27 +194,28 @@ }, { "id": "power-provider", - "path": "config/poweradvantage-orespawn.json", - "contains": "poweradvantage:legacy/poweradvantage_crude_oil_0", + "path": "config/basepower-orespawn.json", + "contains": "basepower:legacy/basepower_crude_oil_0", "minimumOccurrences": 1 }, { "id": "electric-provider", - "path": "config/electricadvantage-orespawn.json", - "contains": "electricadvantage:legacy/electricadvantage_li_ore_0", + "path": "config/baseelectric-orespawn.json", + "contains": "baseelectric:legacy/baseelectric_li_ore_0", "minimumOccurrences": 1 } ], "worldgenExpectations": { "minimumCounts": { - "poweradvantage:crude_oil": 1, - "electricadvantage:li_ore": 1, - "electricadvantage:sulfur_ore": 1 + "basepower:crude_oil": 1, + "baseelectric:li_ore": 1, + "baseelectric:sulfur_ore": 1 }, "maximumCounts": { "mineralogy:crude_oil": 0, "mineralogy:sulfur_ore": 0 }, "zeroBiomeViolations": false - } + }, + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/profiles/worldgen-mineralogy.json b/test-rig/profiles/worldgen-mineralogy.json index d249b3f..c0f2581 100644 --- a/test-rig/profiles/worldgen-mineralogy.json +++ b/test-rig/profiles/worldgen-mineralogy.json @@ -5,8 +5,8 @@ "startupTimeoutSeconds": 180, "stationRunSeconds": 5, "recipeMode": "NORMAL", - "sourceCommit": "2443eaae7c666b8d54a5c9c30091892b79e80994", - "sourceVersion": "2.4.3.110021", + "sourceCommit": "UNQUALIFIED_REBRAND_WORKTREE", + "sourceVersion": "2.4.4.110021", "forge": { "version": "1.10.2-12.18.3.2511", "installerPath": ".cache/forge-1.10.2-12.18.3.2511-installer.jar", @@ -16,37 +16,41 @@ "mods": [ { "id": "advantageworkstest", - "version": "1.0.0.110020", - "file": "AdvantageWorksTestHarness-1.0.0.110020.jar", - "path": "build/libs/AdvantageWorksTestHarness-1.0.0.110020.jar", - "workspaceProduced": true + "version": "1.1.0.110021", + "file": "AdvantageWorksTestHarness-1.1.0.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/survival-candidate-06/artifacts/521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525/AdvantageWorksTestHarness-1.1.0.110021.jar", + "workspaceProduced": true, + "sha256": "521AC1FF85FCC8D449D84E10888CB888B5E9B01455D1DB05F31839648652D525" }, { - "id": "poweradvantage", - "version": "2.4.3.110021", - "file": "PowerAdvantage-2.4.3.110021.jar", - "path": "../build/libs/PowerAdvantage-2.4.3.110021.jar", - "sha256": "07C9F409034F762CA77F336ECB65B04E814A24E22B7D2C95824BAA52CDBA9D56" + "id": "basepower", + "version": "2.4.4.110021", + "file": "basePower-2.4.4.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/schema-requalification-01/candidate-legacy/artifacts/164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31/basePower-2.4.4.110021.jar", + "workspaceProduced": true, + "sha256": "164693E756A935A8C51085CF95AECCCAF3506390A6F0A3888E46765F29896F31" }, { - "id": "steamadvantage", - "version": "2.2.5.110021", - "file": "SteamAdvantage-2.2.5.110021.jar", - "path": "../../SteamAdvantage/SteamAdvantage/build/libs/SteamAdvantage-2.2.5.110021.jar", - "sha256": "1C9DE2F9EE29439B727D2087E18BAD5277115BCCF7162F0F9342F322F44F9E9E" + "id": "basesteam", + "version": "2.2.6.110021", + "file": "baseSteam-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D/baseSteam-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "728E37A1A0551596D8167976A7022E31EF075A383640BB385470160DD9A8F07D" }, { - "id": "electricadvantage", - "version": "2.2.5.110021", - "file": "ElectricAdvantage-2.2.5.110021.jar", - "path": "../../ElectricAdvantage/ElectricAdvantage/build/libs/ElectricAdvantage-2.2.5.110021.jar", - "sha256": "1854A854332FC02151C289BAEAF9DC3C6677ED6CDC1ED04EA8EDD0CB54A085F5" + "id": "baseelectric", + "version": "2.2.6.110021", + "file": "baseElectric-2.2.6.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1/baseElectric-2.2.6.110021.jar", + "workspaceProduced": true, + "sha256": "05F1CF02C97C6112C7EB4913DB46F65C45058CC6E818D81E159DBF5AD0F93DD1" }, { "id": "orespawn", "version": "4.0.8.110021", "file": "OreSpawn-4.0.8.110021.jar", - "path": "../../../../MinecraftMineralogy/OS110/OreSpawn/build/libs/OreSpawn-4.0.8.110021.jar", + "path": "../../../_verification/base-110-rename-20261102/candidate-c/artifacts/FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21/OreSpawn-4.0.8.110021.jar", "sha256": "FD27D4F5B4B6087C5F64344903C0E0124115E08FA2D465ECDB88D291F36B2B21", "workspaceProduced": true }, @@ -72,7 +76,7 @@ { "id": "desert-oil-enabled", "section": "fluid_deposits", - "entry": "poweradvantage:fluid_deposit/desert_crude_oil", + "entry": "basepower:fluid_deposit/desert_crude_oil", "present": true, "field": "enabled", "expectedBoolean": true @@ -96,7 +100,7 @@ { "id": "electric-sulfur-disabled", "section": "ores", - "entry": "electricadvantage:ore/sulfur", + "entry": "baseelectric:ore/sulfur", "present": true, "field": "enabled", "expectedBoolean": false @@ -104,7 +108,7 @@ { "id": "electric-lithium-fallback-enabled", "section": "ores", - "entry": "electricadvantage:ore/lithium", + "entry": "baseelectric:ore/lithium", "present": true, "field": "enabled", "expectedBoolean": true @@ -113,7 +117,7 @@ "profileMutations": [ { "section": "ores", - "entry": "electricadvantage:ore/sulfur", + "entry": "baseelectric:ore/sulfur", "field": "enabled", "booleanValue": true } @@ -122,7 +126,7 @@ { "id": "electric-sulfur-user-enable-persists", "section": "ores", - "entry": "electricadvantage:ore/sulfur", + "entry": "baseelectric:ore/sulfur", "present": true, "field": "enabled", "expectedBoolean": true @@ -146,14 +150,15 @@ ], "worldgenExpectations": { "minimumCounts": { - "poweradvantage:crude_oil": 1, + "basepower:crude_oil": 1, "mineralogy:crude_oil": 1, "mineralogy:sulfur_ore": 1, - "electricadvantage:li_ore": 1 + "baseelectric:li_ore": 1 }, "maximumCounts": { - "electricadvantage:sulfur_ore": 0 + "baseelectric:sulfur_ore": 0 }, "zeroBiomeViolations": true - } + }, + "qualificationStatus": "UNQUALIFIED_REBRAND_WORKSPACE_INPUTS" } diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/AdvantageWorksMod.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/AdvantageWorksMod.java index df20812..1161e94 100644 --- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/AdvantageWorksMod.java +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/AdvantageWorksMod.java @@ -24,6 +24,8 @@ public void preInit(FMLPreInitializationEvent event) { net.minecraftforge.common.ForgeChunkManager.forceChunk(ticket, chunk); }); MachineOperationalProbe.register(); + NativePassiveMigrationProbe.register(); + NativeSurvivalProgressionProbe.register(); } @Mod.EventHandler @@ -32,5 +34,7 @@ public void serverStarting(FMLServerStartingEvent event) { MachineOperationalProbe.registerCommands(event); NativeHarvestProbe.registerCommands(event); NativeRecipeProgressionProbe.registerCommands(event); + NativePassiveMigrationProbe.registerCommands(event); + NativeSurvivalProgressionProbe.registerCommands(event); } } diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/BatteryOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/BatteryOperationalCases.java index e54c620..072eb43 100644 --- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/BatteryOperationalCases.java +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/BatteryOperationalCases.java @@ -17,10 +17,10 @@ static void register(List cases) { cases.add(new MachineScenario("electric/battery-chemistry-" + chemistry, "Each battery chemistry supplies a real LED from finite item NBT, retaining its rated capacity and exact energy debit", 160, c -> { - c.block(7, 4, 8, "electricadvantage:electric_battery_array"); - c.put(7, 4, 8, 0, "electricadvantage:" + chemistry + "_battery", 1); + c.block(7, 4, 8, "baseelectric:electric_battery_array"); + c.put(7, 4, 8, 0, "baseelectric:" + chemistry + "_battery", 1); NativeStacks.tag(c.inventory(7, 4, 8).getStackInSlot(0)).setFloat("energy", 10); - c.block(8, 4, 8, "electricadvantage:led_bar"); + c.block(8, 4, 8, "baseelectric:led_bar"); }, c -> { PoweredEntity array = (PoweredEntity)c.tile(7, 4, 8); c.require(array.getEnergyCapacity(new ConduitType("electricity")) == capacity, "rated battery capacity retained"); diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/BucketOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/BucketOperationalCases.java index 1523d13..6a81459 100644 --- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/BucketOperationalCases.java +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/BucketOperationalCases.java @@ -96,10 +96,10 @@ private static UniversalBucket startup(MachineContext c) { && Item.REGISTRY.getObject(bucket.getRegistryName()) == bucket, "Universal bucket is a real registered item, not merely an enabled flag"); c.record("bucket/item", bucket.getRegistryName().toString()); - for (String mod : new String[]{"basemetals", "steamadvantage", "electricadvantage", "orespawn"}) + for (String mod : new String[]{"basemetals", "basesteam", "baseelectric", "orespawn"}) c.record("bucket/mod/" + mod, Loader.isModLoaded(mod)); if (Boolean.getBoolean("advworks.bucket.requireStandalone")) - for (String mod : new String[]{"basemetals", "steamadvantage", "electricadvantage"}) + for (String mod : new String[]{"basemetals", "basesteam", "baseelectric"}) c.require(!Loader.isModLoaded(mod), "Standalone bucket proof excludes " + mod); return bucket; } diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/CanonicalSteamEnchantments.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/CanonicalSteamEnchantments.java new file mode 100644 index 0000000..84df207 --- /dev/null +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/CanonicalSteamEnchantments.java @@ -0,0 +1,34 @@ +package zone.moddev.mc.advantageworks; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.util.ResourceLocation; + +/** These four released enchantment registry keys intentionally retain their old domain. */ +final class CanonicalSteamEnchantments { + private static final Set PATHS = new HashSet<>(Arrays.asList( + "rapid_reload", "powderless", "high_explosive", "recoil")); + + static String canonicalId(String id) { + if (id.startsWith("basesteam:") && PATHS.contains(id.substring("basesteam:".length()))) + throw new IllegalArgumentException("Retained canonical enchantment required, no new-domain fallback: " + id); + return id; + } + + static Enchantment require(String id) { + ResourceLocation name = new ResourceLocation(canonicalId(id)); + if ("steamadvantage".equals(name.getResourceDomain())) + for (String path : PATHS) resolve(new ResourceLocation("steamadvantage", path)); + return resolve(name); + } + + private static Enchantment resolve(ResourceLocation name) { + Enchantment enchantment = Enchantment.REGISTRY.getObject(name); + if (enchantment == null || !Enchantment.REGISTRY.containsKey(name) + || !name.equals(Enchantment.REGISTRY.getNameForObject(enchantment))) + throw new IllegalStateException("Missing or noncanonical native enchantment: " + name); + return enchantment; + } +} diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/DrillOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/DrillOperationalCases.java index d65669a..799c3e8 100644 --- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/DrillOperationalCases.java +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/DrillOperationalCases.java @@ -42,7 +42,7 @@ private static final class Witness { private static void scenario(List cases, String district, EnumFacing facing, String mode) { boolean steam = district.equals("steam"); boolean move = mode.equals("move"), noPower = mode.equals("no-power"); - String namespace = steam ? "steamadvantage" : "electricadvantage"; + String namespace = steam ? "basesteam" : "baseelectric"; String drill = namespace + ":" + district + "_drill"; String track = namespace + ":" + district + "_track"; String conduit = namespace + (steam ? ":steam_pipe" : ":electric_conduit"); @@ -116,7 +116,7 @@ private static void scenario(List cases, String district, EnumF BlockPos active = move ? destination : source; requireBlock(c, source, move ? conduit : drill, "Source becomes the correct conduit only after a successful move"); requireBlock(c, destination, move ? drill : track, "Destination contains the moved drill, or the untouched single track in a control"); - requireBlock(c, front, move ? "poweradvantage:steel_frame" : "minecraft:bedrock", + requireBlock(c, front, move ? "basepower:steel_frame" : "minecraft:bedrock", "The old bore mouth becomes one steel frame only on movement"); requireBlock(c, nextFront, "minecraft:bedrock", "Destination bedrock stop is never mined"); requireBlock(c, hold, "minecraft:redstone_block", "Destination hold remains physically present"); diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricLifecycleOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricLifecycleOperationalCases.java index 8a0c250..31b9aa2 100644 --- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricLifecycleOperationalCases.java +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricLifecycleOperationalCases.java @@ -12,7 +12,7 @@ /** Finite legacy jobs. Verification only reads the world; live phase actions need a core hook. */ public final class ElectricLifecycleOperationalCases { - private static final String EA = "electricadvantage:"; + private static final String EA = "baseelectric:"; private static final String ELECTRICITY = "electricity"; private static final PropertyBool LIT = PropertyBool.create("lit"); private static final PropertyBool ACTIVE = PropertyBool.create("active"); diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricOperationalCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricOperationalCases.java index ad25f96..01fbded 100644 --- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricOperationalCases.java +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/ElectricOperationalCases.java @@ -25,7 +25,7 @@ /** Independent operating contracts. Only setup seeds inputs; all work uses world ticks. */ public final class ElectricOperationalCases { - private static final String EA = "electricadvantage:"; + private static final String EA = "baseelectric:"; private static final PropertyBool LED_LIT = PropertyBool.create("lit"); private static final String ELECTRICITY = "electricity"; private static final String GREENHOUSE = "greenhouse"; @@ -167,7 +167,7 @@ private static void refinery(List cases) { int x = CELLS[i]; c.block(x, Y, Z, EA + "plastic_refinery"); if (i != 1) c.electricSupply(x - 1, Y, Z, 4000); - if (i != 2) reserve(c, x, Y, Z, "getTank", "poweradvantage:refined_oil", i == 4 ? 99 : 200); + if (i != 2) reserve(c, x, Y, Z, "getTank", "basepower:refined_oil", i == 4 ? 99 : 200); } rejectFluid(c, CELLS[2], "minecraft:water", 200); c.put(CELLS[3], Y, Z, 0, EA + "petrolplastic_ingot", 64); @@ -191,15 +191,15 @@ private static void still(List cases) { int x = CELLS[i]; c.block(x, Y, Z, EA + "electric_still"); if (i != 1) c.electricSupply(x - 1, Y, Z, 1000); - if (i != 2) reserve(c, x, Y, Z, "getInputTank", "poweradvantage:crude_oil", i == 4 ? 1 : 40); + if (i != 2) reserve(c, x, Y, Z, "getInputTank", "basepower:crude_oil", i == 4 ? 1 : 40); } rejectFluid(c, CELLS[2], "minecraft:water", 40); - reserve(c, CELLS[3], Y, Z, "getOutputTank", "poweradvantage:refined_oil", 1000); + reserve(c, CELLS[3], Y, Z, "getOutputTank", "basepower:refined_oil", 1000); equal(c, "setup.fullOutput", tankAmount(c, CELLS[3], 1), 1000); }, c -> { equal(c, "positive.input", tankAmount(c, CELLS[0], 0), 0); equal(c, "positive.output", tankAmount(c, CELLS[0], 1), 20); - fluidIs(c, CELLS[0], 1, "poweradvantage:refined_oil"); + fluidIs(c, CELLS[0], 1, "basepower:refined_oil"); close(c, "positive.energyDebit", 1000 - pairEnergy(c, CELLS[0]), 320, 0.01f); for (int i = 1; i < CELLS.length; i++) { equal(c, "negative" + i + ".input", tankAmount(c, CELLS[i], 0), i == 2 ? 0 : i == 4 ? 1 : 40); @@ -212,7 +212,7 @@ private static void still(List cases) { + "mutation. The 48 finite mB then operate on natural ticks, making 24 mB refined oil for 384 electricity.", 80, c -> { c.block(8, Y, Z, EA + "electric_still"); c.electricSupply(7, Y, Z, 1000); - Fluid oil = NativeFluids.get("poweradvantage:crude_oil"); + Fluid oil = NativeFluids.get("basepower:crude_oil"); c.require(oil != null, "Crude oil exists for faced automation"); int stored = 0; for (EnumFacing face : EnumFacing.values()) { @@ -226,12 +226,12 @@ private static void still(List cases) { }, c -> { equal(c, "faced.input", tankAmount(c, 8, 0), 0); equal(c, "faced.output", tankAmount(c, 8, 1), 24); - fluidIs(c, 8, 1, "poweradvantage:refined_oil"); + fluidIs(c, 8, 1, "basepower:refined_oil"); close(c, "faced.energyDebit", 1000 - pairEnergy(c, 8), 384, 0.01f); for (EnumFacing face : EnumFacing.values()) { FluidStack simulated = fluids(c, 8, face).drain(24, false); equal(c, "face." + face + ".drainable", simulated == null ? 0 : simulated.amount, 24); - c.require(simulated != null && simulated.getFluid() == NativeFluids.get("poweradvantage:refined_oil"), + c.require(simulated != null && simulated.getFluid() == NativeFluids.get("basepower:refined_oil"), "Face offers the real refined product " + face); equal(c, "face." + face + ".drainSimulationUnchanged", tankAmount(c, 8, 1), 24); } @@ -372,6 +372,11 @@ private static void led(List cases) { })); } + static boolean hydroturbineIdentity(String owner, String canonicalId, String registrationName) { + return "baseelectric".equals(owner) && "baseelectric.Hydroturbine".equals(canonicalId) + && "Hydroturbine".equals(registrationName); + } + private static void hydro(List cases) { cases.add(new MachineScenario("electric/hydro-rate", "A naturally spawned turbine in a contained horizontal water channel generates four electricity " @@ -411,8 +416,8 @@ private static void hydro(List cases) { for (Entity actor : c.world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(c.at(0, 0, 0), c.at(31, 31, 31)))) { EntityRegistry.EntityRegistration registration = EntityRegistry.instance().lookupModSpawn(actor.getClass(), false); - if (registration == null || !"electricadvantage".equals(registration.getContainer().getModId()) - || !"electricadvantage.Hydroturbine".equals(registration.getEntityName())) continue; + if (registration == null || !hydroturbineIdentity(registration.getContainer().getModId(), + net.minecraft.entity.EntityList.getEntityString(actor), registration.getEntityName())) continue; turbines++; c.record("hydro.motion/" + actor.getUniqueID(), new net.minecraft.util.math.Vec3d(actor.motionX, actor.motionY, actor.motionZ).toString()); c.require(new net.minecraft.util.math.Vec3d(actor.motionX, actor.motionY, actor.motionZ).lengthSquared() == 0, diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/LegacyPartialNetworkCases.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/LegacyPartialNetworkCases.java index 84736f1..5252d36 100644 --- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/LegacyPartialNetworkCases.java +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/LegacyPartialNetworkCases.java @@ -41,23 +41,23 @@ private static void add(List cases, String type, String part) { + "while other endpoints remain loaded and unchanged. The same ticket restores the chunk; " + "event-time typed NBT and finite resources survive, and native processing resumes without rebuilding.", TICKS, c -> { - String pipe = type.equals("steam") ? "steamadvantage:steam_pipe" - : type.equals("electric") ? "electricadvantage:electric_conduit" : "poweradvantage:fluid_pipe"; + String pipe = type.equals("steam") ? "basesteam:steam_pipe" + : type.equals("electric") ? "baseelectric:electric_conduit" : "basepower:fluid_pipe"; if (type.equals("steam")) { c.steamSupply(3, 4, 3, 6000); - c.block(20, 4, 20, "steamadvantage:steam_crusher"); + c.block(20, 4, 20, "basesteam:steam_crusher"); c.put(20, 4, 20, 0, "minecraft:stone", 8); c.require(c.inventory(20, 4, 20).isItemValidForSlot(0, c.inventory(20, 4, 20).getStackInSlot(0)), "Native stone crushing recipe is available"); } else if (type.equals("electric")) { c.electricSupply(3, 4, 3, 6000); NativeStacks.tag(c.inventory(3, 4, 3).getStackInSlot(0)).setString("PartialNetworkWitness", id); - c.block(20, 4, 20, "electricadvantage:electric_oven"); + c.block(20, 4, 20, "baseelectric:electric_oven"); c.put(20, 4, 20, 0, "minecraft:potato", 8); } else { - c.block(3, 4, 3, "poweradvantage:fluid_metal_tank"); + c.block(3, 4, 3, "basepower:fluid_metal_tank"); c.tank(3, 4, 3, "minecraft:water", 6000); - c.block(20, 4, 20, "steamadvantage:steam_boiler_coal"); + c.block(20, 4, 20, "basesteam:steam_boiler_coal"); c.put(20, 4, 20, 0, "minecraft:coal", 1); } for (int x = 4; x <= 20; x++) c.block(x, 4, 3, pipe); diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/MachineContext.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/MachineContext.java index 224147f..40f8e51 100644 --- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/MachineContext.java +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/MachineContext.java @@ -230,14 +230,14 @@ float energy(int x, int y, int z, String type) { } void steamSupply(int x, int y, int z, float reserve) { - block(x, y, z, "steamadvantage:steam_tank"); + block(x, y, z, "basesteam:steam_tank"); power(x, y, z, "steam", reserve); } void electricSupply(int x, int y, int z, float reserve) { if (!Float.isFinite(reserve) || reserve < 0 || reserve > 8000) throw new IllegalArgumentException("Invalid battery reserve"); - block(x, y, z, "electricadvantage:electric_battery_array"); - put(x, y, z, 0, "electricadvantage:lithium_battery", 1); + block(x, y, z, "baseelectric:electric_battery_array"); + put(x, y, z, 0, "baseelectric:lithium_battery", 1); NativeStacks.tag(inventory(x, y, z).getStackInSlot(0)).setFloat("energy", reserve); inventory(x, y, z).markDirty(); } diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeFluids.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeFluids.java index 1248bec..f2eac7c 100644 --- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeFluids.java +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeFluids.java @@ -7,8 +7,8 @@ final class NativeFluids { static Fluid get(String name) { Fluid fluid = FluidRegistry.getFluid(name); if (fluid == null && name.startsWith("minecraft:")) fluid = FluidRegistry.getFluid(name.substring(10)); - if (fluid == null && (name.equals("poweradvantage:crude_oil") || name.equals("poweradvantage:refined_oil"))) - fluid = FluidRegistry.getFluid(name.substring("poweradvantage:".length())); + if (fluid == null && (name.equals("basepower:crude_oil") || name.equals("basepower:refined_oil"))) + fluid = FluidRegistry.getFluid(name.substring("basepower:".length())); if (fluid == null) throw new IllegalArgumentException("Unregistered fixture fluid " + name); return fluid; } diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeHarvestProbe.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeHarvestProbe.java index 9c21a0e..6ddafbb 100644 --- a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeHarvestProbe.java +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeHarvestProbe.java @@ -200,7 +200,7 @@ private static void checkGeometry(WorldServer world, Block block, IBlockState st boxEvidence.add(encoded); } row.add("collisionBoxes", boxEvidence); - if (blockId.equals("electricadvantage:electric_conduit")) { + if (blockId.equals("baseelectric:electric_conduit")) { expected.add(Arrays.toString(new double[]{.375, .375, .375, .625, .625, .625})); if ((mask & 2) != 0) expected.add(Arrays.toString(new double[]{.375, .375, .375, .625, 1, .625})); if ((mask & 1) != 0) expected.add(Arrays.toString(new double[]{.375, 0, .375, .625, .625, .625})); @@ -249,11 +249,11 @@ private static void run(MinecraftServer server, WorldServer world, String label) }; player.setPosition(POS.getX() + .5, POS.getY() + 1, POS.getZ() + .5); JsonArray rows = new JsonArray(); - String sulfur = "electricadvantage:sulfur_ore", lithium = "electricadvantage:li_ore"; + String sulfur = "baseelectric:sulfur_ore", lithium = "baseelectric:li_ore"; witness(world, player, rows, "sulfur/hand-fails", sulfur, 0, null, false, false, "", 0, 0, 1); witness(world, player, rows, "sulfur/axe-fails", sulfur, 0, Items.IRON_AXE, false, false, "", 0, 0, 1); - witness(world, player, rows, "sulfur/wood", sulfur, 0, Items.WOODEN_PICKAXE, false, true, "electricadvantage:sulfur_powder", 1, 4, 8); - witness(world, player, rows, "sulfur/stone", sulfur, 0, Items.STONE_PICKAXE, false, true, "electricadvantage:sulfur_powder", 1, 4, 8); + witness(world, player, rows, "sulfur/wood", sulfur, 0, Items.WOODEN_PICKAXE, false, true, "baseelectric:sulfur_powder", 1, 4, 8); + witness(world, player, rows, "sulfur/stone", sulfur, 0, Items.STONE_PICKAXE, false, true, "baseelectric:sulfur_powder", 1, 4, 8); witness(world, player, rows, "sulfur/silk", sulfur, 0, Items.WOODEN_PICKAXE, true, true, sulfur, 1, 1, 1); witness(world, player, rows, "lithium/hand-fails", lithium, 1, null, false, false, "", 0, 0, 1); witness(world, player, rows, "lithium/wood-fails", lithium, 1, Items.WOODEN_PICKAXE, false, false, "", 0, 0, 1); @@ -262,19 +262,19 @@ private static void run(MinecraftServer server, WorldServer world, String label) witness(world, player, rows, "lithium/stone", lithium, 1, Items.STONE_PICKAXE, false, true, lithium, 1, 1, 1); witness(world, player, rows, "lithium/diamond", lithium, 1, Items.DIAMOND_PICKAXE, false, true, lithium, 1, 1, 1); witness(world, player, rows, "lithium/silk", lithium, 1, Items.STONE_PICKAXE, true, true, lithium, 1, 1, 1); - witness(world, player, rows, "frame/hand", "poweradvantage:steel_frame", -1, null, false, true, "poweradvantage:steel_frame", 1, 1, 1); - witness(world, player, rows, "frame/silk", "poweradvantage:steel_frame", -1, Items.DIAMOND_PICKAXE, true, true, "poweradvantage:steel_frame", 1, 1, 1); + witness(world, player, rows, "frame/hand", "basepower:steel_frame", -1, null, false, true, "basepower:steel_frame", 1, 1, 1); + witness(world, player, rows, "frame/silk", "basepower:steel_frame", -1, Items.DIAMOND_PICKAXE, true, true, "basepower:steel_frame", 1, 1, 1); for (int mask = 0; mask < 64; mask++) { for (String family : new String[] {"wire", "scaffold"}) { - String identity = "electricadvantage:" + (family.equals("wire") ? "electric_conduit" : "electric_track"); + String identity = "baseelectric:" + (family.equals("wire") ? "electric_conduit" : "electric_track"); String prefix = family + "/" + mask; witness(world, player, rows, prefix + "/hand", identity, -1, null, false, true, identity, 1, 1, 1, mask); witness(world, player, rows, prefix + "/silk", identity, -1, Items.DIAMOND_PICKAXE, true, true, identity, 1, 1, 1, mask); } } - properties(world, rows, "solar/native-solidity", "electricadvantage:photovoltaic_generator", true, 0); - properties(world, rows, "frame/native-opacity", "poweradvantage:steel_frame", false, 0); + properties(world, rows, "solar/native-solidity", "baseelectric:photovoltaic_generator", true, 0); + properties(world, rows, "frame/native-opacity", "basepower:steel_frame", false, 0); for (String id : WATER_ONLY) { JsonObject row = new JsonObject(); row.addProperty("id", id); row.addProperty("status", "N/A"); diff --git a/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeNestedIdentityProbe.java b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeNestedIdentityProbe.java new file mode 100644 index 0000000..98d1e15 --- /dev/null +++ b/test-rig/src/main/java/zone/moddev/mc/advantageworks/NativeNestedIdentityProbe.java @@ -0,0 +1,206 @@ +package zone.moddev.mc.advantageworks; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.mojang.authlib.GameProfile; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.UUID; +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.EnumPacketDirection; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.management.PlayerInteractionManager; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.WorldServer; +import net.minecraft.world.GameType; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; + +/** Synthetic detached native serializers, never evidence of an original saved player. */ +final class NativeNestedIdentityProbe { + private static final String[] ENCHANTMENTS = {"powderless", "recoil", "high_explosive", "rapid_reload"}; + + static void registerCommands(FMLServerStartingEvent event) { + if (!new File("advantage-nested-identity.allow").isFile()) return; + event.registerServerCommand(new CommandBase() { + @Override public String getName() { return "advnested"; } + @Override public String getUsage(ICommandSender sender) { return "advnested run